part system
[demo_prior] / src / demo.c
index 8653aa4..d0b1127 100644 (file)
@@ -1,12 +1,19 @@
+#include <stdio.h>
 #include "opengl.h"
 #include "demo.h"
+#include "part.h"
+
+void reg_whitted(void);
 
 int win_width, win_height;
+float win_aspect;
 long time_msec;
 
 
 int demo_init(void)
 {
+       int i;
+
        if(init_opengl() == -1) {
                return -1;
        }
@@ -16,54 +23,98 @@ int demo_init(void)
        glEnable(GL_FRAMEBUFFER_SRGB);
        glEnable(GL_MULTISAMPLE);
 
+       reg_whitted();
+
+       for(i=0; i<num_parts; i++) {
+               if(parts[i]->init() == -1) {
+                       fprintf(stderr, "part %s init failed\n", parts[i]->name);
+                       return -1;
+               }
+       }
+
+       switch_part(parts[0]);
        return 0;
 }
 
 void demo_cleanup(void)
 {
+       int i;
+
+       for(i=0; i<num_parts; i++) {
+               parts[i]->destroy();
+       }
 }
 
 void demo_display(void)
 {
-       glClearColor(0.05, 0.05, 0.05, 1);
+       long part_time;
+
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-       glMatrixMode(GL_MODELVIEW);
-       glLoadIdentity();
-       glTranslatef(0, 0, -8);
+       if(!cur_part) return;
+
+       part_time = time_msec - cur_part->start_time;
+       if(part_time < cur_part->in_time) {
+               float t = (float)part_time / cur_part->in_time;
 
-       glFrontFace(GL_CW);
-       glutSolidTeapot(1.0);
-       glFrontFace(GL_CCW);
+               if(prev_part) {
+                       long prev_part_time = time_msec - prev_part->start_time;
+                       if(prev_part->draw_out) {
+                               prev_part->draw_out(prev_part_time, t);
+                       } else {
+                               prev_part->draw(prev_part_time);
+                       }
+               }
+
+               if(cur_part->draw_in) {
+                       cur_part->draw_in(part_time, t);
+               } else {
+                       cur_part->draw(part_time);
+               }
+       } else {
+               prev_part = 0;
+               cur_part->draw(part_time);
+       }
 }
 
 void demo_reshape(int x, int y)
 {
+       win_width = x;
+       win_height = y;
+       win_aspect = (float)x / (float)y;
+
        glViewport(0, 0, x, y);
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
-       gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
+       gluPerspective(50.0, win_aspect, 0.5, 500.0);
 }
 
 void demo_keyboard(int key, int st)
 {
-       if(st) {
-               switch(key) {
-               case 27:
-                       demo_quit();
-                       break;
-               }
+       if(st && key == 27) {
+               demo_quit();
+               return;
+       }
+
+       if(cur_part && cur_part->keyboard) {
+               cur_part->keyboard(key, st);
        }
 }
 
 
 void demo_mbutton(int bn, int st, int x, int y)
 {
+       if(cur_part && cur_part->mbutton) {
+               cur_part->mbutton(bn, st, x, y);
+       }
 }
 
 void demo_mmotion(int x, int y)
 {
+       if(cur_part && cur_part->mmotion) {
+               cur_part->mmotion(x, y);
+       }
 }
 
 void demo_sball_motion(int x, int y, int z)