libgoatvr

annotate src/vr.c @ 0:ded3d0a74e19

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 29 Aug 2014 03:45:25 +0300
parents
children e63cb28fc644
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <string.h>
nuclear@0 3 #include "vr.h"
nuclear@0 4 #include "vr_impl.h"
nuclear@0 5 #include "mathutil.h"
nuclear@0 6
nuclear@0 7
nuclear@0 8 static void swap_buffers(void);
nuclear@0 9
nuclear@0 10
nuclear@0 11 static struct vr_module *vrm;
nuclear@0 12 static float idmat[] = {
nuclear@0 13 1, 0, 0, 0,
nuclear@0 14 0, 1, 0, 0,
nuclear@0 15 0, 0, 1, 0,
nuclear@0 16 0, 0, 0, 1
nuclear@0 17 };
nuclear@0 18 static float fbtex_rect[] = {
nuclear@0 19 0, 0, 1, 1
nuclear@0 20 };
nuclear@0 21
nuclear@0 22 int vr_init(void)
nuclear@0 23 {
nuclear@0 24 int i, nmodules;
nuclear@0 25
nuclear@0 26 if(vrm) {
nuclear@0 27 vr_shutdown();
nuclear@0 28 }
nuclear@0 29
nuclear@0 30 vr_init_modules();
nuclear@0 31
nuclear@0 32 nmodules = vr_get_num_modules();
nuclear@0 33 for(i=0; i<nmodules; i++) {
nuclear@0 34 struct vr_module *m = vr_get_module(i);
nuclear@0 35 if(m->init() != -1) {
nuclear@0 36 /* add to the active modules array */
nuclear@0 37 vr_activate_module(i);
nuclear@0 38 if(!vrm) {
nuclear@0 39 vr_use_module(0);
nuclear@0 40 }
nuclear@0 41 }
nuclear@0 42 }
nuclear@0 43
nuclear@0 44 if(!vrm) {
nuclear@0 45 return -1;
nuclear@0 46 }
nuclear@0 47 return 0;
nuclear@0 48 }
nuclear@0 49
nuclear@0 50 void vr_shutdown(void)
nuclear@0 51 {
nuclear@0 52 vr_clear_modules();
nuclear@0 53 vrm = 0;
nuclear@0 54 fbtex_rect[0] = fbtex_rect[1] = 0;
nuclear@0 55 fbtex_rect[2] = fbtex_rect[3] = 1;
nuclear@0 56 }
nuclear@0 57
nuclear@0 58 int vr_module_count(void)
nuclear@0 59 {
nuclear@0 60 return vr_get_num_active_modules();
nuclear@0 61 }
nuclear@0 62
nuclear@0 63 const char *vr_module_name(int idx)
nuclear@0 64 {
nuclear@0 65 struct vr_module *m = vr_get_active_module(idx);
nuclear@0 66 if(!m) {
nuclear@0 67 return 0;
nuclear@0 68 }
nuclear@0 69 return m->name;
nuclear@0 70 }
nuclear@0 71
nuclear@0 72 int vr_use_module(int idx)
nuclear@0 73 {
nuclear@0 74 if(idx >= 0 && idx < vr_get_num_active_modules()) {
nuclear@0 75 struct vr_module *m = vr_get_active_module(idx);
nuclear@0 76 if(m != vrm) {
nuclear@0 77 vrm = m;
nuclear@0 78 printf("using vr module: %s\n", vrm->name);
nuclear@0 79 }
nuclear@0 80 return 0;
nuclear@0 81 }
nuclear@0 82 return -1;
nuclear@0 83 }
nuclear@0 84
nuclear@0 85 int vr_use_module_named(const char *name)
nuclear@0 86 {
nuclear@0 87 int i, count = vr_get_num_active_modules();
nuclear@0 88
nuclear@0 89 for(i=0; i<count; i++) {
nuclear@0 90 struct vr_module *m = vr_get_active_module(i);
nuclear@0 91 if(strcmp(m->name, name) == 0) {
nuclear@0 92 return vr_use_module(i);
nuclear@0 93 }
nuclear@0 94 }
nuclear@0 95 return -1;
nuclear@0 96 }
nuclear@0 97
nuclear@0 98 void vr_set_opti(const char *optname, int val)
nuclear@0 99 {
nuclear@0 100 if(vrm && vrm->set_option) {
nuclear@0 101 vrm->set_option(optname, OTYPE_INT, &val);
nuclear@0 102 }
nuclear@0 103 }
nuclear@0 104
nuclear@0 105 void vr_set_optf(const char *optname, float val)
nuclear@0 106 {
nuclear@0 107 if(vrm && vrm->set_option) {
nuclear@0 108 vrm->set_option(optname, OTYPE_FLOAT, &val);
nuclear@0 109 }
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 int vr_get_opti(const char *optname)
nuclear@0 113 {
nuclear@0 114 int res = 0;
nuclear@0 115
nuclear@0 116 if(vrm && vrm->get_option) {
nuclear@0 117 vrm->get_option(optname, OTYPE_INT, &res);
nuclear@0 118 }
nuclear@0 119 return res;
nuclear@0 120 }
nuclear@0 121
nuclear@0 122 float vr_get_optf(const char *optname)
nuclear@0 123 {
nuclear@0 124 float res = 0.0f;
nuclear@0 125
nuclear@0 126 if(vrm && vrm->get_option) {
nuclear@0 127 vrm->get_option(optname, OTYPE_FLOAT, &res);
nuclear@0 128 }
nuclear@0 129 return res;
nuclear@0 130 }
nuclear@0 131
nuclear@0 132
nuclear@0 133 int vr_view_translation(int eye, float *vec)
nuclear@0 134 {
nuclear@0 135 if(vrm && vrm->translation) {
nuclear@0 136 vrm->translation(eye, vec);
nuclear@0 137 return 1;
nuclear@0 138 }
nuclear@0 139 vec[0] = vec[1] = vec[2] = 0.0f;
nuclear@0 140 return 0;
nuclear@0 141 }
nuclear@0 142
nuclear@0 143 int vr_view_rotation(int eye, float *quat)
nuclear@0 144 {
nuclear@0 145 if(vrm && vrm->rotation) {
nuclear@0 146 vrm->rotation(eye, quat);
nuclear@0 147 return 1;
nuclear@0 148 }
nuclear@0 149 quat[0] = quat[1] = quat[2] = 0.0f;
nuclear@0 150 quat[3] = 1.0f;
nuclear@0 151 return 0;
nuclear@0 152 }
nuclear@0 153
nuclear@0 154 int vr_view_matrix(int eye, float *mat)
nuclear@0 155 {
nuclear@0 156 int have_trans, have_rot;
nuclear@0 157 float offs[3], quat[4];
nuclear@0 158 float rmat[16], tmat[16];
nuclear@0 159
nuclear@0 160 if(vrm && vrm->view_matrix) {
nuclear@0 161 vrm->view_matrix(eye, mat);
nuclear@0 162 return 1;
nuclear@0 163 }
nuclear@0 164
nuclear@0 165 have_trans = vr_view_translation(eye, offs);
nuclear@0 166 have_rot = vr_view_rotation(eye, quat);
nuclear@0 167
nuclear@0 168 if(!have_trans && !have_rot) {
nuclear@0 169 return 0;
nuclear@0 170 }
nuclear@0 171
nuclear@0 172 offs[0] = -offs[0];
nuclear@0 173 offs[1] = -offs[1];
nuclear@0 174 offs[2] = -offs[2];
nuclear@0 175
nuclear@0 176 translation_matrix(offs, tmat);
nuclear@0 177 rotation_matrix(quat, rmat);
nuclear@0 178 mult_matrix(mat, tmat, rmat);
nuclear@0 179 return 1;
nuclear@0 180 }
nuclear@0 181
nuclear@0 182 int vr_proj_matrix(int eye, float znear, float zfar, float *mat)
nuclear@0 183 {
nuclear@0 184 if(vrm && vrm->proj_matrix) {
nuclear@0 185 vrm->proj_matrix(eye, znear, zfar, mat);
nuclear@0 186 return 1;
nuclear@0 187 }
nuclear@0 188 memcpy(mat, idmat, sizeof idmat);
nuclear@0 189 return 0;
nuclear@0 190 }
nuclear@0 191
nuclear@0 192 void vr_begin(int eye)
nuclear@0 193 {
nuclear@0 194 if(vrm && vrm->begin) {
nuclear@0 195 vrm->begin(eye);
nuclear@0 196 }
nuclear@0 197 }
nuclear@0 198
nuclear@0 199 void vr_end(void)
nuclear@0 200 {
nuclear@0 201 if(vrm && vrm->end) {
nuclear@0 202 vrm->end();
nuclear@0 203 }
nuclear@0 204 }
nuclear@0 205
nuclear@0 206 int vr_swap_buffers(void)
nuclear@0 207 {
nuclear@0 208 int res = 0;
nuclear@0 209
nuclear@0 210 if(vrm && vrm->present) {
nuclear@0 211 res = vrm->present();
nuclear@0 212 }
nuclear@0 213
nuclear@0 214 if(!res) {
nuclear@0 215 swap_buffers();
nuclear@0 216 }
nuclear@0 217 return 0;
nuclear@0 218 }
nuclear@0 219
nuclear@0 220 void vr_output_texture(unsigned int tex, float umin, float vmin, float umax, float vmax)
nuclear@0 221 {
nuclear@0 222 float halfu = (umax + umin) * 0.5f;
nuclear@0 223
nuclear@0 224 vr_output_texture_eye(VR_EYE_LEFT, tex, umin, vmin, halfu, vmax);
nuclear@0 225 vr_output_texture_eye(VR_EYE_RIGHT, tex, halfu, vmin, umax, vmax);
nuclear@0 226 }
nuclear@0 227
nuclear@0 228 void vr_output_texture_eye(int eye, unsigned int tex, float umin, float vmin, float umax, float vmax)
nuclear@0 229 {
nuclear@0 230 if(vrm && vrm->set_eye_texture) {
nuclear@0 231 vrm->set_eye_texture(eye, tex, umin, vmin, umax, vmax);
nuclear@0 232 }
nuclear@0 233 }
nuclear@0 234
nuclear@0 235 void vr_recenter(void)
nuclear@0 236 {
nuclear@0 237 if(vrm && vrm->recenter) {
nuclear@0 238 vrm->recenter();
nuclear@0 239 }
nuclear@0 240 }
nuclear@0 241
nuclear@0 242
nuclear@0 243 #ifdef __unix__
nuclear@0 244 #include <GL/glx.h>
nuclear@0 245
nuclear@0 246 static void swap_buffers(void)
nuclear@0 247 {
nuclear@0 248 glXSwapBuffers(glXGetCurrentDisplay(), glXGetCurrentDrawable());
nuclear@0 249 }
nuclear@0 250
nuclear@0 251 #endif
nuclear@0 252
nuclear@0 253 #ifdef WIN32
nuclear@0 254 #include <windows.h>
nuclear@0 255
nuclear@0 256 static void swap_buffers(void)
nuclear@0 257 {
nuclear@0 258 SwapBuffers(wglGetCurrentDC());
nuclear@0 259 }
nuclear@0 260 #endif