tinygi

annotate src/tinygi.c @ 2:72752a1b3dbe

images and shapes
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 21 Jul 2015 04:30:00 +0300
parents src/scene.c@bc64090fe3d1
children
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 }