X-Git-Url: https://eleni.mutantstargoat.com/git/?a=blobdiff_plain;f=src%2Fmain.cc;h=491dd9c4c2c17dcdfb523dcce0bbdab3affc79e1;hb=73b9db25a6deff93da45f3c45290ca8a56fefed3;hp=c48b38325b8d812effdcd7d8312febd68366ee57;hpb=c99060df01719b24ebd793b149d3c2dc5748cad5;p=demo diff --git a/src/main.cc b/src/main.cc index c48b383..491dd9c 100644 --- a/src/main.cc +++ b/src/main.cc @@ -27,6 +27,7 @@ static bool init(Gfx_API api); static void cleanup(); static void display(); +static bool gen_poisson(std::vector &points, float min_dist, float radius); /* glfw callbacks */ @@ -60,12 +61,15 @@ static OrbitCamera *camera; static float fog_density; +static int num_cows = 400; +static float cow_gap = 4; static Scene *cow_scene; -static Object *cow_object; static MorphRenderer *cow_rend; static Terrain terrain; +static TerrainParams p; static Texture *skybox_tex; +static Texture *irradiance_tex; static Texture *terrain_tex; static Material terrain_mat; static Renderer *terrain_rend; @@ -127,23 +131,6 @@ static bool init(Gfx_API api) camera = new OrbitCamera; - cow_scene = new Scene; - if(!cow_scene->load("data/spot/spot.obj")) { - fprintf(stderr, "Failed to load scene: spot.obj.\n"); - return false; - } - - cow_rend = new MorphRenderer; - cow_rend->camera = camera; - cow_rend->scene = cow_scene; - - if(!cow_rend->create()) { - fprintf(stderr, "Failed to create renderer for cows.\n"); - return false; - } - - cow_object = cow_scene->objects[0]; - terrain_tex = gfx_create_texture(); if(!terrain_tex->load("data/grass.jpeg")) { fprintf(stderr, "Failed to load ground texture.\n"); @@ -156,7 +143,6 @@ static bool init(Gfx_API api) return false; } - TerrainParams p; p.xsz = 200; p.ysz = 200; p.max_height = 30; @@ -187,11 +173,56 @@ static bool init(Gfx_API api) skybox_tex->load("data/cubemap/cubemap.hdr"); terrain_rend->set_sky_tex(skybox_tex); + irradiance_tex = gfx_create_texture(); + irradiance_tex->load("data/cubemap/irradiance.hdr"); + terrain_rend->set_diffuse_sky_tex(irradiance_tex); + if(!terrain_rend->create()) { fprintf(stderr, "terrain fail\n"); return false; } + terrain_rend->fog_density = fog_density; + + cow_scene = new Scene; + if(!cow_scene->load("data/spot/spot.obj")) { + fprintf(stderr, "Failed to load scene: spot.obj.\n"); + return false; + } + + cow_rend = new MorphRenderer; + cow_rend->camera = camera; + cow_rend->scene = cow_scene; + cow_rend->fog_density = fog_density; + + if(!cow_rend->create()) { + fprintf(stderr, "Failed to create renderer for cows.\n"); + return false; + } + + /* create cow objects */ + Object *cow0 = cow_scene->objects[0]; + cow0->transform.rotation_y(M_PI); + cow_scene->objects.clear(); + + float disk_radius = std::min(p.xsz, p.ysz) / 2.0 * 0.65; + std::vector cow_pos; + for(int i=0; itransform.translate(pos.x, y, pos.y); + cow_scene->objects.push_back(cow); + } + +cowgen_end: + printf("generated: %d cows from %d\n", (int)cow_pos.size(), num_cows); + delete cow0; return true; } @@ -203,9 +234,11 @@ static void cleanup() delete cow_scene; delete cow_rend; -//TODO + delete skybox_tex; + delete irradiance_tex; delete terrain_tex; delete terrain_rend; + gfx_cleanup(); } @@ -227,13 +260,13 @@ static void clbk_key(GLFWwindow *win, int key, int scancode, int action, int mod move_camera = !move_camera; break; - case 'F': - fog_density = fog_density < 1 - 0.0009 ? fog_density + 0.0001 : 1; - break; + // case 'F': + // fog_density = fog_density < 1 - 0.0009 ? fog_density + 0.0001 : 1; + // break; - case 'U': - fog_density = fog_density > 0.0001 ? fog_density - 0.0001 : 0; - break; + // case 'U': + // fog_density = fog_density > 0.0001 ? fog_density - 0.0001 : 0; + // break; default: break; @@ -324,11 +357,33 @@ static void display() gfx_clear(0.1, 0.1, 0.1); - printf("fog_density: %f\n", fog_density); - terrain_rend->fog_density = fog_density; terrain_rend->draw(); - - cow_pos.y = terrain.get_height(cow_pos); - cow_object->transform.translation(cow_pos); cow_rend->draw(); +} + +static bool gen_poisson(std::vector &points, float min_dist, float radius) +{ + /* poisson radius */ + for (int i = 0; i < 1000; i++) + { + float angle = (float)rand() / (float)RAND_MAX * 2 * M_PI; + float r = sqrt((float)rand() / (float)RAND_MAX) * radius; + + Vec2 p; + p.x = cos(angle) * r; + p.y = sin(angle) * r; + + bool valid = true; + for(size_t j=0; j