screen-relative events
[andemo] / src / demo.c
index 5023275..f51dcc1 100644 (file)
@@ -20,6 +20,7 @@ int demo_init(void)
        if(!(tex_logo = get_tex2d("data/ml_logo_old.png"))) {
                return -1;
        }
+       glBindTexture(GL_TEXTURE_2D, tex_logo);
        glUseProgram(sdr_foo);
        gl_begin(GL_QUADS);
        gl_texcoord2f(0, 1);
@@ -36,6 +37,14 @@ int demo_init(void)
        if(dsys_init("data/demoscript") == -1) {
                return -1;
        }
+       if(opt.scrname) {
+               struct demoscreen *scr = dsys_find_screen(opt.scrname);
+               if(scr) {
+                       dsys_run_screen(scr);
+               } else {
+                       fprintf(stderr, "ignoring screen option, no such screen: %s\n", opt.scrname);
+               }
+       }
 
        return 0;
 }
@@ -47,18 +56,29 @@ void demo_cleanup(void)
 
 void demo_display(void)
 {
-       struct demoscreen *scr;
+       dsys_update();
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-       scr = dsys_act_scr;
-       while(scr) {
-               if(scr->update) {
-                       scr->update(dsys_time);
-               }
-               scr->draw();
-               scr = scr->next;
-       }
+       glEnable(GL_BLEND);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+       glBindTexture(GL_TEXTURE_2D, tex_logo);
+       glUseProgram(sdr_foo);
+       gl_begin(GL_QUADS);
+       gl_color4f(1, 1, 1, dsys_value("flashlogo"));
+       gl_texcoord2f(0, 1);
+       gl_vertex2f(-1, -1);
+       gl_texcoord2f(1, 1);
+       gl_vertex2f(1, -1);
+       gl_texcoord2f(1, 0);
+       gl_vertex2f(1, 1);
+       gl_texcoord2f(0, 0);
+       gl_vertex2f(-1, 1);
+       gl_end();
+       glDisable(GL_BLEND);
+
+       dsys_draw();
 }
 
 void demo_reshape(int x, int y)
@@ -67,9 +87,9 @@ void demo_reshape(int x, int y)
 
        glViewport(0, 0, x, y);
 
-       for(i=0; i<dsys_num_screens; i++) {
-               if(dsys_screens[i]->reshape) {
-                       dsys_screens[i]->reshape(x, y);
+       for(i=0; i<dsys.num_screens; i++) {
+               if(dsys.screens[i]->reshape) {
+                       dsys.screens[i]->reshape(x, y);
                }
        }
 }
@@ -80,7 +100,7 @@ void demo_keyboard(int key, int pressed)
 
        switch(key) {
        case ' ':
-               if(dsys_running) {
+               if(dsys.running) {
                        dsys_stop();
                } else {
                        dsys_run();
@@ -97,17 +117,21 @@ void demo_keyboard(int key, int pressed)
 
                } else if(key >= KEY_F1 && key <= KEY_F12) {
                        int idx = key - KEY_F1;
-                       if(idx < dsys_num_screens) {
-                               dsys_run_screen(dsys_screens[idx]);
+                       if(idx < dsys.num_screens) {
+                               dsys_run_screen(dsys.screens[idx]);
                        }
 
                } else {
-                       struct demoscreen *scr = dsys_act_scr;
-                       while(scr) {
-                               if(scr->keyboard) {
-                                       scr->keyboard(key, pressed);
-                               }
-                               scr = scr->next;
+                       int i;
+
+                       if(dsys.scr_override && dsys.scr_override->keyboard) {
+                               dsys.scr_override->keyboard(key, pressed);
+                               break;
+                       }
+
+                       for(i=0; i<dsys.num_act; i++) {
+                               struct demoscreen *scr = dsys.act[i];
+                               if(scr->keyboard) scr->keyboard(key, pressed);
                        }
                }
        }
@@ -115,22 +139,29 @@ void demo_keyboard(int key, int pressed)
 
 void demo_mouse(int bn, int pressed, int x, int y)
 {
-       struct demoscreen *scr = dsys_act_scr;
-       while(scr) {
-               if(scr->mouse) {
-                       scr->mouse(bn, pressed, x, y);
-               }
-               scr = scr->next;
+       int i;
+
+       if(dsys.scr_override && dsys.scr_override->mouse) {
+               dsys.scr_override->mouse(bn, pressed, x, y);
+               return;
+       }
+
+       for(i=0; i<dsys.num_act; i++) {
+               struct demoscreen *scr = dsys.act[i];
+               if(scr->mouse) scr->mouse(bn, pressed, x, y);
        }
 }
 
 void demo_motion(int x, int y)
 {
-       struct demoscreen *scr = dsys_act_scr;
-       while(scr) {
-               if(scr->motion) {
-                       scr->motion(x, y);
-               }
-               scr = scr->next;
+       int i;
+
+       if(dsys.scr_override && dsys.scr_override->motion) {
+               dsys.scr_override->motion(x, y);
+       }
+
+       for(i=0; i<dsys.num_act; i++) {
+               struct demoscreen *scr = dsys.act[i];
+               if(scr->motion) scr->motion(x, y);
        }
 }