fixed terrain tiles generation
[demo] / src / main.cc
index 166b467..107fb9d 100644 (file)
@@ -16,6 +16,7 @@
 #include "object.h"
 #include "renderer.h"
 #include "scene.h"
+#include "terrain.h"
 #include "texture.h"
 
 #include "opengl/opengl.h"
@@ -44,7 +45,7 @@ int win_h = 600;
 
 float phi = 25;
 float theta = 0;
-float dist = 4;
+float dist = 16;
 
 ShaderManager *sdr_man;
 
@@ -60,6 +61,10 @@ static Scene *scene_ground;
 static Renderer *rground; // default renderer
 static Texture *gskybox;
 
+static Renderer *tr;
+static Material tmat;
+static Terrain t;
+
 /* *** */
 
 int main(int argc, char **argv)
@@ -114,13 +119,25 @@ static bool init(Gfx_API api)
        sdr_man = new ShaderManager;
 
        camera = new OrbitCamera;
-       camera->set_orbit_params(phi, theta, dist);
 
-       scene_ground = new Scene;
-       if(!scene_ground->load("data/ground.obj")) {
-               fprintf(stderr, "Failed to load scene: ground.obj.\n");
-               return false;
-       }
+       // scene_ground = new Scene;
+       // if(!scene_ground->load("data/ground.obj")) {
+       //      fprintf(stderr, "Failed to load scene: ground.obj.\n");
+       //      return false;
+       // }
+
+       // rground = new Renderer;
+       // rground->camera = camera;
+       // rground->scene = scene_ground;
+
+       // if(!rground->create()) {
+       //      fprintf(stderr, "Failed to create default renderer.\n");
+       //      return false;
+       // }
+
+       // gskybox = gfx_create_texture();
+       // gskybox->load("data/cubemap/cubemap.hdr");
+       // rground->set_sky_tex(gskybox);
 
        scene_cow = new Scene;
        if(!scene_cow->load("data/spot/spot.obj")) {
@@ -128,19 +145,6 @@ static bool init(Gfx_API api)
                return false;
        }
 
-       rground = new Renderer;
-       rground->camera = camera;
-       rground->scene = scene_ground;
-
-       if(!rground->create()) {
-               fprintf(stderr, "Failed to create default renderer.\n");
-               return false;
-       }
-
-       gskybox = gfx_create_texture();
-       gskybox->load("data/cubemap/cubemap.hdr");
-       rground->set_sky_tex(gskybox);
-
        rcow = new Renderer;
        rcow->camera = camera;
        rcow->scene = scene_cow;
@@ -150,14 +154,46 @@ static bool init(Gfx_API api)
                return false;
        }
 
-// TODO delete: debugging
-       for(size_t i=0; i<scene_ground->objects.size(); ++i) {
-               printf("object: %d\n", (int)i);
-               printf("mesh: %s\n", scene_ground->objects[i]->mesh->name.c_str());
-               printf("material: %s\n", scene_ground->objects[i]->material->name.c_str());
-               printf("transform:\n");
-               scene_ground->objects[i]->transform.print();
+       TerrainParams p;
+       p.xsz = 50;
+       p.ysz = 50;
+       p.max_height = 2;
+       p.xtiles = 20;
+       p.ytiles = 20;
+       p.tile_usub = 10;
+       p.tile_vsub = 10;
+       p.num_octaves = 3;
+       p.noise_freq = 10;
+       p.coarse_heightmap = 0;
+
+       t.init();
+       t.generate(p);
+
+       tmat.diffuse = Vec3(1, 0, 0);
+       tmat.specular = Vec3(0.5, 0, 0);
+       tmat.shininess = 40;
+       tmat.dtex = 0;
+       tmat.name = "tt";
+
+       t.material = tmat;
+
+       tr = new Renderer;
+       tr->camera = camera;
+       tr->scene = t.get_visible(camera);
+       if(!tr->create()) {
+               fprintf(stderr, "terrain fail\n");
+               return false;
        }
+
+
+// TODO delete: debugging
+       // for(size_t i=0; i<scene_ground->objects.size(); ++i) {
+       //      printf("object: %d\n", (int)i);
+       //      printf("mesh: %s\n", scene_ground->objects[i]->mesh->name.c_str());
+       //      printf("material: %s\n", scene_ground->objects[i]->material->name.c_str());
+       //      printf("transform:\n");
+       //      scene_ground->objects[i]->transform.print();
+       // }
        return true;
 }
 
@@ -169,9 +205,11 @@ static void cleanup()
        delete scene_cow;
        delete rcow;
 
-       delete scene_ground;
-       delete rground;
+       // delete scene_ground;
+       // delete rground;
 
+//TODO
+       delete tr;
        gfx_cleanup();
 }
 
@@ -194,11 +232,11 @@ static void clbk_motion(GLFWwindow *win, double x, double y)
        prev_y = y;
 
        if(button[0]) {
-               theta += dx;
-               phi += dy;
+               theta += dx * 0.5;
+               phi += dy * 0.5;
 
-               if(phi < -90)
-                       phi = -90;
+               if(phi < 0)
+                       phi = 0;
                if(phi > 90)
                        phi = 90;
        }
@@ -229,10 +267,12 @@ static void clbk_reshape(GLFWwindow *win, int width, int height)
 
 static void display()
 {
-       camera->set_orbit_params(phi, theta, dist);
+       camera->set_orbit_params(theta, phi, dist);
 
-       gfx_clear(0.76, 0.3, 0.43);
+       // gfx_clear(0.76, 0.3, 0.43);
+       gfx_clear(0.1, 0.1, 0.1);
 
-       rground->draw();
-       rcow->draw();
+       tr->draw();
+//     rground->draw();
+       // rcow->draw();
 }
\ No newline at end of file