conworlds

annotate src/vr/vr.c @ 8:90abf4b93cc9

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