3dphotoshoot

annotate src/game.cc @ 24:2712c5da2e00

getting sensor input (hack)
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 16 Jun 2015 06:17:59 +0300
parents d7fe157c402d
children ac80210d5fbe
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 }