rev |
line source |
nuclear@0
|
1 #include <stdlib.h>
|
nuclear@0
|
2 #include <string.h>
|
nuclear@0
|
3 #include <assert.h>
|
nuclear@0
|
4 #include "tgi_impl.h"
|
nuclear@0
|
5 #include "object.h"
|
nuclear@0
|
6 #include "dynarr.h"
|
nuclear@0
|
7
|
nuclear@0
|
8 struct tinygi *tgi_init(void)
|
nuclear@0
|
9 {
|
nuclear@0
|
10 struct tinygi *tgi;
|
nuclear@0
|
11
|
nuclear@0
|
12 if(!(tgi = malloc(sizeof *tgi))) {
|
nuclear@0
|
13 tgi_log("failed to allocate memory\n");
|
nuclear@0
|
14 return 0;
|
nuclear@0
|
15 }
|
nuclear@0
|
16 if(!(tgi->objects = dynarr_alloc(0, sizeof *tgi->objects))) {
|
nuclear@0
|
17 tgi_log("failed to allocate objects array\n");
|
nuclear@0
|
18 free(tgi);
|
nuclear@0
|
19 return 0;
|
nuclear@0
|
20 }
|
nuclear@0
|
21
|
nuclear@0
|
22 return tgi;
|
nuclear@0
|
23 }
|
nuclear@0
|
24
|
nuclear@0
|
25 void tgi_destroy(struct tinygi *tgi)
|
nuclear@0
|
26 {
|
nuclear@0
|
27 tgi_clear_scene(tgi);
|
nuclear@0
|
28 free(tgi);
|
nuclear@0
|
29 }
|
nuclear@0
|
30
|
nuclear@0
|
31 void tgi_clear_scene(struct tinygi *tgi)
|
nuclear@0
|
32 {
|
nuclear@0
|
33 int i, nobj = dynarr_size(tgi->objects);
|
nuclear@0
|
34
|
nuclear@0
|
35 for(i=0; i<nobj; i++) {
|
nuclear@0
|
36 tgi_destroy_object(tgi->objects[i]);
|
nuclear@0
|
37 }
|
nuclear@0
|
38 tgi->objects = dynarr_resize(tgi->objects, 0);
|
nuclear@0
|
39 assert(tgi->objects);
|
nuclear@0
|
40 }
|
nuclear@0
|
41
|
nuclear@0
|
42 int tgi_load_scene(struct tinygi *tgi, const char *fname)
|
nuclear@0
|
43 {
|
nuclear@0
|
44 return -1; /* TODO implement later */
|
nuclear@0
|
45 }
|
nuclear@0
|
46
|
nuclear@0
|
47 void tgi_add_object(struct tinygi *tgi, struct tgi_object *o)
|
nuclear@0
|
48 {
|
nuclear@0
|
49 tgi->objects = dynarr_push(tgi->objects, o);
|
nuclear@0
|
50 assert(tgi->objects);
|
nuclear@0
|
51 }
|
nuclear@0
|
52
|
nuclear@0
|
53 int tgi_del_object(struct tinygi *tgi, struct tgi_object *o)
|
nuclear@0
|
54 {
|
nuclear@0
|
55 int i, idx = -1, sz = dynarr_size(tgi->objects);
|
nuclear@0
|
56
|
nuclear@0
|
57 if(!sz) return -1;
|
nuclear@0
|
58
|
nuclear@0
|
59 for(i=0; i<sz; i++) {
|
nuclear@0
|
60 if(tgi->objects[i] == o) {
|
nuclear@0
|
61 idx = i;
|
nuclear@0
|
62 break;
|
nuclear@0
|
63 }
|
nuclear@0
|
64 }
|
nuclear@0
|
65 if(idx == -1) {
|
nuclear@0
|
66 return -1;
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 tgi->objects[idx] = tgi->objects[sz - 1];
|
nuclear@0
|
70 tgi->objects = dynarr_pop(tgi->objects);
|
nuclear@0
|
71 assert(tgi->objects);
|
nuclear@0
|
72 return 0;
|
nuclear@0
|
73 }
|
nuclear@0
|
74
|
nuclear@0
|
75 struct tgi_object *tgi_find_object(struct tinygi *tgi, const char *name)
|
nuclear@0
|
76 {
|
nuclear@0
|
77 int i, sz = dynarr_size(tgi->objects);
|
nuclear@0
|
78
|
nuclear@0
|
79 for(i=0; i<sz; i++) {
|
nuclear@0
|
80 if(strcmp(tgi->objects[i]->name, name) == 0) {
|
nuclear@0
|
81 return tgi->objects[i];
|
nuclear@0
|
82 }
|
nuclear@0
|
83 }
|
nuclear@0
|
84 return 0;
|
nuclear@0
|
85 }
|
nuclear@0
|
86
|
nuclear@0
|
87
|
nuclear@0
|
88 struct tgi_object *tgi_get_object(struct tinygi *tgi, int idx)
|
nuclear@0
|
89 {
|
nuclear@0
|
90 return tgi->objects[idx];
|
nuclear@0
|
91 }
|
nuclear@0
|
92
|
nuclear@0
|
93 int tgi_get_object_count(struct tinygi *tgi)
|
nuclear@0
|
94 {
|
nuclear@0
|
95 return dynarr_size(tgi->objects);
|
nuclear@0
|
96 }
|
nuclear@0
|
97
|
nuclear@0
|
98
|