libgoatvr

annotate src/vr_modules.c @ 24:d659cbedde1d

works on linux with 0.4.4
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 14 Jan 2015 08:03:27 +0200
parents
children
rev   line source
nuclear@0 1 /* XXX this might become partly auto-generated in the future */
nuclear@0 2 #include <stdio.h>
nuclear@0 3 #include <stdlib.h>
nuclear@0 4 #include "vr_impl.h"
nuclear@0 5
nuclear@0 6 struct vr_module *vr_module_libovr(void);
nuclear@0 7 struct vr_module *vr_module_openhmd(void);
nuclear@0 8 struct vr_module *vr_module_null(void);
nuclear@0 9
nuclear@0 10 static struct vr_module *modules;
nuclear@0 11 static int num_modules, modules_max_size;
nuclear@0 12
nuclear@0 13 static int *active_modules;
nuclear@0 14 static int num_act_modules, act_modules_max_size;
nuclear@0 15
nuclear@0 16
nuclear@0 17 void vr_init_modules(void)
nuclear@0 18 {
nuclear@0 19 struct vr_module *m;
nuclear@0 20
nuclear@0 21 vr_clear_modules();
nuclear@0 22
nuclear@0 23 if((m = vr_module_libovr())) {
nuclear@0 24 vr_register_module(m);
nuclear@0 25 }
nuclear@0 26
nuclear@0 27 if((m = vr_module_openhmd())) {
nuclear@0 28 vr_register_module(m);
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 if((m = vr_module_null())) {
nuclear@0 32 vr_register_module(m);
nuclear@0 33 }
nuclear@0 34 }
nuclear@0 35
nuclear@0 36 void vr_clear_modules(void)
nuclear@0 37 {
nuclear@0 38 free(modules);
nuclear@0 39 free(active_modules);
nuclear@0 40 modules = 0;
nuclear@0 41 num_modules = modules_max_size = 0;
nuclear@0 42 active_modules = 0;
nuclear@0 43 num_act_modules = act_modules_max_size = 0;
nuclear@0 44 }
nuclear@0 45
nuclear@0 46 void vr_register_module(struct vr_module *mod)
nuclear@0 47 {
nuclear@0 48 if(num_modules >= modules_max_size) {
nuclear@0 49 int newsz = modules_max_size ? modules_max_size * 2 : 2;
nuclear@0 50 struct vr_module *newmods = realloc(modules, newsz * sizeof *newmods);
nuclear@0 51 if(!newmods) {
nuclear@0 52 fprintf(stderr, "failed to resize modules array up to %d\n", newsz);
nuclear@0 53 return;
nuclear@0 54 }
nuclear@0 55 modules = newmods;
nuclear@0 56 modules_max_size = newsz;
nuclear@0 57 }
nuclear@0 58 modules[num_modules++] = *mod;
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 int vr_get_num_modules(void)
nuclear@0 62 {
nuclear@0 63 return num_modules;
nuclear@0 64 }
nuclear@0 65
nuclear@0 66 struct vr_module *vr_get_module(int idx)
nuclear@0 67 {
nuclear@0 68 return modules + idx;
nuclear@0 69 }
nuclear@0 70
nuclear@0 71 void vr_activate_module(int idx)
nuclear@0 72 {
nuclear@0 73 if(num_act_modules >= act_modules_max_size) {
nuclear@0 74 int newsz = act_modules_max_size ? act_modules_max_size * 2 : 2;
nuclear@0 75 int *newact = realloc(active_modules, newsz * sizeof *newact);
nuclear@0 76 if(!newact) {
nuclear@0 77 fprintf(stderr, "failed to resize active modules array up to %d\n", newsz);
nuclear@0 78 return;
nuclear@0 79 }
nuclear@0 80 active_modules = newact;
nuclear@0 81 act_modules_max_size = newsz;
nuclear@0 82 }
nuclear@0 83 active_modules[num_act_modules++] = idx;
nuclear@0 84 }
nuclear@0 85
nuclear@0 86 int vr_get_num_active_modules(void)
nuclear@0 87 {
nuclear@0 88 return num_act_modules;
nuclear@0 89 }
nuclear@0 90
nuclear@0 91 struct vr_module *vr_get_active_module(int idx)
nuclear@0 92 {
nuclear@0 93 return modules + active_modules[idx];
nuclear@0 94 }