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@2
|
22 tgi_init_image(&tgi->fb);
|
nuclear@2
|
23 tgi_init_image(&tgi->fbfinal);
|
nuclear@2
|
24 tgi->fb_nsamples = 0;
|
nuclear@2
|
25
|
nuclear@0
|
26 return tgi;
|
nuclear@0
|
27 }
|
nuclear@0
|
28
|
nuclear@0
|
29 void tgi_destroy(struct tinygi *tgi)
|
nuclear@0
|
30 {
|
nuclear@0
|
31 tgi_clear_scene(tgi);
|
nuclear@2
|
32 tgi_destroy_image(&tgi->fb);
|
nuclear@2
|
33 tgi_destroy_image(&tgi->fbfinal);
|
nuclear@2
|
34 free(tgi->fb_nsamples);
|
nuclear@0
|
35 free(tgi);
|
nuclear@0
|
36 }
|
nuclear@0
|
37
|
nuclear@0
|
38 void tgi_clear_scene(struct tinygi *tgi)
|
nuclear@0
|
39 {
|
nuclear@0
|
40 int i, nobj = dynarr_size(tgi->objects);
|
nuclear@0
|
41
|
nuclear@0
|
42 for(i=0; i<nobj; i++) {
|
nuclear@0
|
43 tgi_destroy_object(tgi->objects[i]);
|
nuclear@0
|
44 }
|
nuclear@0
|
45 tgi->objects = dynarr_resize(tgi->objects, 0);
|
nuclear@0
|
46 assert(tgi->objects);
|
nuclear@0
|
47 }
|
nuclear@0
|
48
|
nuclear@0
|
49 int tgi_load_scene(struct tinygi *tgi, const char *fname)
|
nuclear@0
|
50 {
|
nuclear@0
|
51 return -1; /* TODO implement later */
|
nuclear@0
|
52 }
|
nuclear@0
|
53
|
nuclear@0
|
54 void tgi_add_object(struct tinygi *tgi, struct tgi_object *o)
|
nuclear@0
|
55 {
|
nuclear@0
|
56 tgi->objects = dynarr_push(tgi->objects, o);
|
nuclear@0
|
57 assert(tgi->objects);
|
nuclear@0
|
58 }
|
nuclear@0
|
59
|
nuclear@1
|
60 int tgi_remove_object(struct tinygi *tgi, struct tgi_object *o)
|
nuclear@0
|
61 {
|
nuclear@0
|
62 int i, idx = -1, sz = dynarr_size(tgi->objects);
|
nuclear@0
|
63
|
nuclear@0
|
64 if(!sz) return -1;
|
nuclear@0
|
65
|
nuclear@0
|
66 for(i=0; i<sz; i++) {
|
nuclear@0
|
67 if(tgi->objects[i] == o) {
|
nuclear@0
|
68 idx = i;
|
nuclear@0
|
69 break;
|
nuclear@0
|
70 }
|
nuclear@0
|
71 }
|
nuclear@0
|
72 if(idx == -1) {
|
nuclear@0
|
73 return -1;
|
nuclear@0
|
74 }
|
nuclear@0
|
75
|
nuclear@0
|
76 tgi->objects[idx] = tgi->objects[sz - 1];
|
nuclear@0
|
77 tgi->objects = dynarr_pop(tgi->objects);
|
nuclear@0
|
78 assert(tgi->objects);
|
nuclear@0
|
79 return 0;
|
nuclear@0
|
80 }
|
nuclear@0
|
81
|
nuclear@0
|
82 struct tgi_object *tgi_find_object(struct tinygi *tgi, const char *name)
|
nuclear@0
|
83 {
|
nuclear@0
|
84 int i, sz = dynarr_size(tgi->objects);
|
nuclear@0
|
85
|
nuclear@0
|
86 for(i=0; i<sz; i++) {
|
nuclear@0
|
87 if(strcmp(tgi->objects[i]->name, name) == 0) {
|
nuclear@0
|
88 return tgi->objects[i];
|
nuclear@0
|
89 }
|
nuclear@0
|
90 }
|
nuclear@0
|
91 return 0;
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94
|
nuclear@0
|
95 struct tgi_object *tgi_get_object(struct tinygi *tgi, int idx)
|
nuclear@0
|
96 {
|
nuclear@0
|
97 return tgi->objects[idx];
|
nuclear@0
|
98 }
|
nuclear@0
|
99
|
nuclear@0
|
100 int tgi_get_object_count(struct tinygi *tgi)
|
nuclear@0
|
101 {
|
nuclear@0
|
102 return dynarr_size(tgi->objects);
|
nuclear@0
|
103 }
|