metascene initial implementation
[laserbrain_demo] / src / app.cc
index 0869399..2501415 100644 (file)
@@ -7,6 +7,8 @@
 #include "mesh.h"
 #include "meshgen.h"
 #include "scene.h"
+#include "metascene.h"
+#include "datamap.h"
 
 static void draw_scene();
 
@@ -14,7 +16,7 @@ long time_msec;
 int win_width, win_height;
 bool opt_gear_wireframe;
 
-static float cam_dist = 10.0;
+static float cam_dist = 0.0;
 static float cam_theta, cam_phi = 20;
 static Vec3 cam_pos;
 static int prev_mx, prev_my;
@@ -24,12 +26,14 @@ static bool keystate[256];
 static Mat4 view_matrix;
 static TextureSet texman;
 static Scene *scn;
+static unsigned int sdr;
 
 static long prev_msec;
 
 
 bool app_init()
 {
+       glEnable(GL_FRAMEBUFFER_SRGB);
        glEnable(GL_MULTISAMPLE);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_CULL_FACE);
@@ -38,16 +42,34 @@ bool app_init()
 
        Mesh::use_custom_sdr_attr = false;
 
-       float ambient[] = {0.1, 0.1, 0.1, 0.0};
+       float ambient[] = {0.0, 0.0, 0.0, 0.0};
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
 
-       unsigned int sflags = 0;
-       scn = new Scene;
+       scn = new Scene(&texman);
+       if(!load_scene(scn, "data/museum.scene")) {
+               return false;
+       }
+
+       /*
+       datamap_set_path("data");
+       if(!datamap_load_map("data.map")) {
+               fprintf(stderr, "failed to load datafile mappings\n");
+       }
+
+       unsigned int sflags = SCNLOAD_FLIPTEX;
        if(!(scn->load("data/testscene/patoma.fbx", sflags)) ||
                        !(scn->load("data/testscene/kolones.fbx", sflags))) {
                fprintf(stderr, "failed to load test scene\n");
                return false;
        }
+       */
+
+       if(!(sdr = create_program_load("sdr/test.v.glsl", "sdr/test.p.glsl"))) {
+               fprintf(stderr, "failed to load test shaders\n");
+               return false;
+       }
+       set_uniform_int(sdr, "texmap", 0);
+       set_uniform_int(sdr, "lightmap", 1);
 
        glUseProgram(0);
        return true;
@@ -64,7 +86,7 @@ static void update(float dt)
 
        scn->update(dt);
 
-       float walk_speed = 10.0 * dt;
+       float walk_speed = 2000.0 * dt;
        Vec3 dir;
 
        if(keystate[(int)'w']) {
@@ -79,6 +101,12 @@ static void update(float dt)
        if(keystate[(int)'a']) {
                dir.x -= walk_speed;
        }
+       if(keystate[(int)'q']) {
+               cam_pos.y += walk_speed;
+       }
+       if(keystate[(int)'z']) {
+               cam_pos.y -= walk_speed;
+       }
 
        float theta = M_PI * cam_theta / 180.0f;
        cam_pos.x += cos(theta) * dir.x - sin(theta) * dir.z;
@@ -108,7 +136,7 @@ void app_display()
        view_matrix.pre_translate(0, 0, -cam_dist);
        view_matrix.pre_rotate(deg_to_rad(cam_phi), 1, 0, 0);
        view_matrix.pre_rotate(deg_to_rad(cam_theta), 0, 1, 0);
-       view_matrix.pre_translate(-cam_pos.x, 0, -cam_pos.z);
+       view_matrix.pre_translate(-cam_pos.x, -cam_pos.y, -cam_pos.z);
 
        glMatrixMode(GL_MODELVIEW);
        glLoadMatrixf(view_matrix[0]);
@@ -138,7 +166,10 @@ static void draw_scene()
        glVertex3f(-30, -10, -30);
        glEnd();
        */
+
+       glUseProgram(sdr);
        scn->draw();
+       glUseProgram(0);
 }
 
 
@@ -148,7 +179,7 @@ void app_reshape(int x, int y)
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
-       gluPerspective(50.0, (float)x / (float)y, 0.5, 1000.0);
+       gluPerspective(50.0, (float)x / (float)y, 1.0, 10000.0);
 }
 
 void app_keyboard(int key, bool pressed)