audio responds to mouse motion
[maximus:soft-rock-revisited.git] / gpu / revisited.c
1 /* =====================================================================
2 soft-rock-revisited
3 Copyright (C) 2008-2012  Claude Heiland-Allen <claude@mathr.co.uk>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 ------------------------------------------------------------------------
18 Main Module
19 ===================================================================== */
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include "revisited.h"
24
25 //======================================================================
26 // main module global mutable state
27 static struct revisited revisited;
28
29 //======================================================================
30 // main module initialization
31 int revisited_init() {
32   if (! audio_init(&revisited.audio)) { return 0; }
33   if (! map_init(&revisited.map)) { return 0; }
34   if (! colour_init(&revisited.colour)) { return 0; }
35   if (! output_init(&revisited.output)) { return 0; }
36 #if config_record
37   if (! screenshot_init(&revisited.screenshot)) { return 0; }
38 #endif
39   glGenFramebuffersEXT(1, &revisited.fbo);
40   revisited.starttime = 0;
41   revisited.fullscreen = 0;
42   return 1;
43 }
44
45 //======================================================================
46 // main module reshape callback
47 void revisited_reshape(int w, int h) {
48   map_reshape(&revisited.map, config_tex_width, config_tex_height, w, h);
49   colour_reshape(&revisited.colour, config_tex_width, config_tex_height);
50   output_reshape(&revisited.output, config_win_width, config_win_height, w, h);
51 #if config_record
52   screenshot_reshape(&revisited.screenshot, config_win_width, config_win_height);
53 #endif
54 }
55
56 //======================================================================
57 // main module display callback
58 void revisited_display() {
59   int n = map_display(&revisited.map, revisited.fbo);
60   colour_display(&revisited.colour, revisited.fbo, revisited.map.texture, n);
61   output_display(&revisited.output, revisited.colour.texture, revisited.fbo,
62 #if config_record
63   &revisited.screenshot
64 #else
65   NULL
66 #endif
67   );
68   glutSwapBuffers();
69   glutReportErrors();
70   revisited.frame += 1;
71 }
72
73 //======================================================================
74 // main module exit callback
75 void revisited_atexit(void) {
76   double timeelapsed = (double) time(NULL) - (double) revisited.starttime;
77   fprintf(stderr, "\n\n--------------------------------------------------------------------------\n");
78   fprintf(stderr, "------------------------------- statistics -------------------------------\n");
79   fprintf(stderr, "--------------------------------------------------------------------------\n");
80   fprintf(stderr, "%10d seconds elapsed (+/- 1)\n", (int) timeelapsed);
81   fprintf(stderr, "%10d frames rendered (%f fps)\n", revisited.frame, revisited.frame / timeelapsed);
82   fprintf(stderr, "--------------------------------------------------------------------------\n");
83 }
84
85 //======================================================================
86 // main module idle callback
87 void revisited_idle() {
88   if (revisited.starttime == 0) {
89     revisited.starttime = time(NULL);
90     revisited.frame = 0;
91     atexit(revisited_atexit);
92   }
93
94   map_idle(&revisited.map);
95   colour_idle(&revisited.colour);
96 #if config_record
97   screenshot_idle(&revisited.screenshot);
98 #endif
99
100   glutPostRedisplay();
101 }
102
103 void revisited_keynormal(unsigned char key, int x, int y) {
104   switch (key) {
105   case 27: // escape
106     exit(0);  // FIXME
107     break;
108   default:
109     map_keynormal(&revisited.map, key, x, y);
110     break;
111   }
112 }
113
114 void revisited_keyspecial(int key, int x, int y) {
115   map_keyspecial(&revisited.map, key, x, y);
116 }
117
118 void revisited_mouse(int button, int state, int x, int y) {
119   map_mouse(&revisited.map, button, state, x, y);
120 }
121
122 void revisited_motion(int x, int y) {
123   map_motion(&revisited.map, x, y);
124 }
125
126 // EOF