rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <math.h>
|
nuclear@11
|
4 #include <assert.h>
|
nuclear@0
|
5 #include "opengl.h"
|
nuclear@0
|
6 #include "game.h"
|
nuclear@7
|
7 #include "camera.h"
|
nuclear@11
|
8 #include "sanegl.h"
|
nuclear@17
|
9 #include "texture.h"
|
nuclear@21
|
10 #include "shader.h"
|
nuclear@22
|
11 #include "text.h"
|
nuclear@24
|
12 #include "vmath/vmath.h"
|
nuclear@7
|
13
|
nuclear@21
|
14 static void draw_quad(float hsz, float vsz);
|
nuclear@0
|
15
|
nuclear@22
|
16 int win_width, win_height;
|
nuclear@22
|
17
|
nuclear@9
|
18 static float win_aspect;
|
nuclear@9
|
19 static int video_width, video_height;
|
nuclear@9
|
20 static float video_aspect;
|
nuclear@17
|
21 static struct texture *test_tex;
|
nuclear@17
|
22
|
nuclear@21
|
23 static SdrProg *sdr_cam, *sdr_tex;
|
nuclear@0
|
24
|
nuclear@24
|
25 static Quaternion qrot;
|
nuclear@24
|
26 static Vector3 trans;
|
nuclear@24
|
27
|
nuclear@20
|
28 extern "C" int game_init(void)
|
nuclear@0
|
29 {
|
nuclear@17
|
30 //glEnable(GL_DEPTH_TEST);
|
nuclear@22
|
31 //glEnable(GL_CULL_FACE);
|
nuclear@0
|
32
|
nuclear@0
|
33 glClearColor(0.4, 0.4, 0.4, 1);
|
nuclear@8
|
34
|
nuclear@21
|
35 if(!(sdr_cam = get_sdrprog("sdr/vertex.glsl", "sdr/android_cam_preview.p.glsl"))) {
|
nuclear@10
|
36 return -1;
|
nuclear@10
|
37 }
|
nuclear@21
|
38 if(!(sdr_tex = get_sdrprog("sdr/vertex.glsl", "sdr/tex.p.glsl"))) {
|
nuclear@17
|
39 return -1;
|
nuclear@17
|
40 }
|
nuclear@17
|
41
|
nuclear@17
|
42 if(!(test_tex = get_texture("data/opengl.png"))) {
|
nuclear@17
|
43 return -1;
|
nuclear@17
|
44 }
|
nuclear@10
|
45
|
nuclear@8
|
46 cam_start_video();
|
nuclear@9
|
47 cam_video_size(&video_width, &video_height);
|
nuclear@9
|
48 if(video_height) {
|
nuclear@9
|
49 video_aspect = (float)video_width / (float)video_height;
|
nuclear@9
|
50 } else {
|
nuclear@9
|
51 video_aspect = 1.0;
|
nuclear@9
|
52 }
|
nuclear@9
|
53
|
nuclear@9
|
54 printf("started video %dx%d (aspect: %g)\n", video_width, video_height, video_aspect);
|
nuclear@0
|
55 return 0;
|
nuclear@0
|
56 }
|
nuclear@0
|
57
|
nuclear@20
|
58 extern "C" void game_shutdown(void)
|
nuclear@0
|
59 {
|
nuclear@8
|
60 cam_shutdown();
|
nuclear@21
|
61 delete sdr_cam;
|
nuclear@21
|
62 delete sdr_tex;
|
nuclear@0
|
63 }
|
nuclear@0
|
64
|
nuclear@20
|
65 extern "C" void game_display(unsigned long msec)
|
nuclear@0
|
66 {
|
nuclear@9
|
67 unsigned int tex;
|
nuclear@9
|
68 const float *tex_matrix;
|
nuclear@9
|
69 float xscale, yscale;
|
nuclear@9
|
70
|
nuclear@8
|
71 cam_update();
|
nuclear@9
|
72 tex = cam_texture();
|
nuclear@9
|
73 tex_matrix = cam_texture_matrix();
|
nuclear@7
|
74
|
nuclear@4
|
75 //float tsec = (float)msec / 1000.0f;
|
nuclear@0
|
76
|
nuclear@0
|
77 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
78
|
nuclear@11
|
79 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@11
|
80 gl_load_identity();
|
nuclear@11
|
81 gl_matrix_mode(GL_TEXTURE);
|
nuclear@11
|
82 gl_load_matrixf(tex_matrix);
|
nuclear@11
|
83
|
nuclear@21
|
84 sdr_cam->bind();
|
nuclear@10
|
85 glBindTexture(GL_TEXTURE_EXTERNAL_OES, tex);
|
nuclear@7
|
86
|
nuclear@9
|
87 if(video_aspect > win_aspect) {
|
nuclear@9
|
88 xscale = 1.0;
|
nuclear@9
|
89 yscale = 1.0 / video_aspect;
|
nuclear@9
|
90 } else {
|
nuclear@9
|
91 xscale = video_aspect;
|
nuclear@9
|
92 yscale = 1.0;
|
nuclear@9
|
93 }
|
nuclear@21
|
94 draw_quad(xscale, yscale);
|
nuclear@17
|
95
|
nuclear@17
|
96 gl_matrix_mode(GL_TEXTURE);
|
nuclear@17
|
97 gl_load_identity();
|
nuclear@17
|
98 gl_translatef(0, 1, 0);
|
nuclear@17
|
99 gl_scalef(1, -1, 1);
|
nuclear@17
|
100 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@17
|
101 gl_load_identity();
|
nuclear@17
|
102 gl_scalef((float)test_tex->width / (float)test_tex->height, 1, 1);
|
nuclear@17
|
103
|
nuclear@21
|
104 sdr_tex->bind();
|
nuclear@17
|
105 glBindTexture(GL_TEXTURE_2D, test_tex->texid);
|
nuclear@17
|
106
|
nuclear@17
|
107 glEnable(GL_BLEND);
|
nuclear@17
|
108 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
nuclear@22
|
109 draw_quad(0.5, 0.5);
|
nuclear@22
|
110 glDisable(GL_BLEND);
|
nuclear@17
|
111
|
nuclear@22
|
112 gl_matrix_mode(GL_TEXTURE);
|
nuclear@22
|
113 gl_load_identity();
|
nuclear@17
|
114
|
nuclear@22
|
115
|
nuclear@24
|
116 // print the rotation quaternion
|
nuclear@22
|
117 text_color(1, 1, 1, 1);
|
nuclear@24
|
118 text_position(0, 0);
|
nuclear@24
|
119 text_printf("translation (% .3f, % .3f, % .3f)", trans.x, trans.y, trans.z);
|
nuclear@24
|
120 text_position(0, 1);
|
nuclear@24
|
121 text_printf("Rotation quat ([% 1.3f, % 1.3f, % 1.3f], % 1.3f)", qrot.v.x, qrot.v.y, qrot.v.z, qrot.s);
|
nuclear@7
|
122 }
|
nuclear@7
|
123
|
nuclear@21
|
124 static void draw_quad(float hsz, float vsz)
|
nuclear@7
|
125 {
|
nuclear@7
|
126 static const float varr[] = {-1, -1, 1, -1, 1, 1, -1, 1};
|
nuclear@9
|
127 static const float tcarr[] = {0, 0, 1, 0, 1, 1, 0, 1};
|
nuclear@7
|
128
|
nuclear@11
|
129 gl_matrix_mode(GL_MODELVIEW);
|
nuclear@11
|
130 gl_push_matrix();
|
nuclear@11
|
131 gl_scalef(hsz, vsz, 1);
|
nuclear@11
|
132
|
nuclear@21
|
133 if(SdrProg::active) {
|
nuclear@21
|
134 gl_apply_xform(SdrProg::active->get_globj());
|
nuclear@21
|
135 }
|
nuclear@7
|
136
|
nuclear@21
|
137 glEnableVertexAttribArray(SDR_ATTR_VERTEX);
|
nuclear@21
|
138 glEnableVertexAttribArray(SDR_ATTR_TEXCOORD);
|
nuclear@21
|
139 glVertexAttribPointer(SDR_ATTR_VERTEX, 2, GL_FLOAT, 0, 0, varr);
|
nuclear@21
|
140 glVertexAttribPointer(SDR_ATTR_TEXCOORD, 2, GL_FLOAT, 0, 0, tcarr);
|
nuclear@7
|
141
|
nuclear@8
|
142 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
nuclear@7
|
143
|
nuclear@21
|
144 glDisableVertexAttribArray(SDR_ATTR_VERTEX);
|
nuclear@21
|
145 glDisableVertexAttribArray(SDR_ATTR_TEXCOORD);
|
nuclear@11
|
146
|
nuclear@11
|
147 gl_pop_matrix();
|
nuclear@0
|
148 }
|
nuclear@0
|
149
|
nuclear@20
|
150 extern "C" void game_reshape(int x, int y)
|
nuclear@0
|
151 {
|
nuclear@0
|
152 win_width = x;
|
nuclear@0
|
153 win_height = y;
|
nuclear@9
|
154 win_aspect = y ? (float)x / (float)y : 1.0;
|
nuclear@0
|
155 glViewport(0, 0, x, y);
|
nuclear@0
|
156
|
nuclear@11
|
157 gl_matrix_mode(GL_PROJECTION);
|
nuclear@11
|
158 gl_load_identity();
|
nuclear@11
|
159 gl_scalef((float)win_height / (float)win_width, 1, 1);
|
nuclear@0
|
160 }
|
nuclear@0
|
161
|
nuclear@20
|
162 extern "C" void game_keyboard(int key, int pressed)
|
nuclear@0
|
163 {
|
nuclear@0
|
164 if(!pressed) return;
|
nuclear@0
|
165
|
nuclear@0
|
166 switch(key) {
|
nuclear@0
|
167 case 27:
|
nuclear@0
|
168 exit(0);
|
nuclear@0
|
169
|
nuclear@0
|
170 default:
|
nuclear@0
|
171 break;
|
nuclear@0
|
172 }
|
nuclear@0
|
173 }
|
nuclear@0
|
174
|
nuclear@0
|
175 #define MAX_TOUCH_IDS 16
|
nuclear@0
|
176 static struct {
|
nuclear@0
|
177 int bnstate[8];
|
nuclear@0
|
178 int prev_x, prev_y;
|
nuclear@0
|
179 } mstate[MAX_TOUCH_IDS];
|
nuclear@0
|
180
|
nuclear@20
|
181 extern "C" void game_mouse_button(int id, int bn, int pressed, int x, int y)
|
nuclear@0
|
182 {
|
nuclear@0
|
183 if(id >= MAX_TOUCH_IDS) return;
|
nuclear@0
|
184
|
nuclear@0
|
185 mstate[id].prev_x = x;
|
nuclear@0
|
186 mstate[id].prev_y = y;
|
nuclear@0
|
187 mstate[id].bnstate[bn] = pressed;
|
nuclear@0
|
188 }
|
nuclear@0
|
189
|
nuclear@20
|
190 extern "C" void game_mouse_motion(int id, int x, int y)
|
nuclear@0
|
191 {
|
nuclear@0
|
192 /*
|
nuclear@0
|
193 int dx, dy, cx, cy;
|
nuclear@0
|
194
|
nuclear@0
|
195 if(id >= MAX_TOUCH_IDS) return;
|
nuclear@0
|
196
|
nuclear@0
|
197 cx = win_width / 2;
|
nuclear@0
|
198 cy = win_height / 2;
|
nuclear@0
|
199
|
nuclear@0
|
200 dx = x - mstate[id].prev_x;
|
nuclear@0
|
201 dy = y - mstate[id].prev_y;
|
nuclear@0
|
202 mstate[id].prev_x = x;
|
nuclear@0
|
203 mstate[id].prev_y = y;
|
nuclear@0
|
204
|
nuclear@0
|
205 if(!dx && !dy) return;
|
nuclear@0
|
206
|
nuclear@0
|
207 if(mouselook || mstate[id].bnstate[0]) {
|
nuclear@0
|
208 player_turn(&player, dx * 0.5, dy * 0.5);
|
nuclear@0
|
209 }
|
nuclear@0
|
210 if(mstate[id].bnstate[2]) {
|
nuclear@0
|
211 dbg_cam_dist += 0.1 * dy;
|
nuclear@0
|
212 if(dbg_cam_dist < 0.0) dbg_cam_dist = 0.0;
|
nuclear@0
|
213 }
|
nuclear@0
|
214
|
nuclear@0
|
215 if(mouselook) {
|
nuclear@0
|
216 warping_mouse = 1;
|
nuclear@0
|
217 set_mouse_pos(cx, cy);
|
nuclear@0
|
218 mstate[id].prev_x = cx;
|
nuclear@0
|
219 mstate[id].prev_y = cy;
|
nuclear@0
|
220 }
|
nuclear@0
|
221 */
|
nuclear@0
|
222 }
|
nuclear@0
|
223
|
nuclear@24
|
224 void game_6dof_translation(float dx, float dy, float dz)
|
nuclear@24
|
225 {
|
nuclear@24
|
226 trans.x = dx;
|
nuclear@24
|
227 trans.y = dy;
|
nuclear@24
|
228 trans.z = dz;
|
nuclear@24
|
229 }
|
nuclear@24
|
230
|
nuclear@24
|
231 void game_6dof_rotation(float qx, float qy, float qz, float qw)
|
nuclear@24
|
232 {
|
nuclear@24
|
233 qrot.v.x = qx;
|
nuclear@24
|
234 qrot.v.y = qy;
|
nuclear@24
|
235 qrot.v.z = qz;
|
nuclear@24
|
236 qrot.s = qw;
|
nuclear@24
|
237 }
|