tinygi

view src/object.c @ 1:bc64090fe3d1

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 20 Jul 2015 04:38:53 +0300
parents 16fdca2a1ef5
children 72752a1b3dbe
line source
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "tgi_impl.h"
6 static int namecount;
8 struct tgi_object *tgi_create_object(const char *name)
9 {
10 struct tgi_object *o;
11 int nmsize;
13 if(!(o = malloc(sizeof *o))) {
14 tgi_log("failed to allocate memory\n");
15 return 0;
16 }
17 memset(o, 0, sizeof *o);
19 nmsize = name ? strlen(name) : 15;
20 if(!(o->name = malloc(nmsize + 1))) {
21 tgi_log("failed to allocate name string\n");
22 free(o);
23 return 0;
24 }
26 if(!name) {
27 sprintf(o->name, "tgi_object%03d", namecount++);
28 } else {
29 strcpy(o->name, name);
30 }
32 return o;
33 }
35 void tgi_destroy_object(struct tgi_object *o)
36 {
37 if(o) {
38 if(o->shape) {
39 tgi_destroy_shape(o->shape);
40 }
41 if(o->mtl) {
42 tgi_destroy_material(o->mtl);
43 }
44 free(o->name);
45 }
46 }
48 void tgi_set_object_shape(struct tgi_object *o, struct tgi_shape *s)
49 {
50 if(o->shape) {
51 tgi_destroy_shape(o->shape);
52 }
53 o->shape = s;
54 }
56 void tgi_set_object_mtl(struct tgi_object *o, struct tgi_material *m)
57 {
58 if(o->mtl) {
59 tgi_destroy_material(o->mtl);
60 }
61 o->mtl = m;
62 }
64 /* mat should point to an array of 16 floats (4x4 homogeneous transformation matrix) */
65 void tgi_load_matrix(struct tgi_object *o, const float *mat)
66 {
67 mat4_t tmp;
68 memcpy(tmp, mat, 16 * sizeof(float));
69 m4_transpose(o->xform, tmp);
70 m4_inverse(o->inv_xform, o->xform);
71 }
73 void tgi_mult_matrix(struct tgi_object *o, const float *mat)
74 {
75 mat4_t tmp;
76 memcpy(tmp, mat, 16 * sizeof(float));
77 m4_transpose(tmp, tmp);
78 m4_mult(o->xform, o->xform, tmp);
79 m4_inverse(o->inv_xform, o->xform);
80 }
82 void tgi_load_identity(struct tgi_object *o)
83 {
84 static const float id[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
85 tgi_load_matrix(o, id);
86 }
88 void tgi_translate(struct tgi_object *o, float x, float y, float z)
89 {
90 float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
91 mat[12] = x;
92 mat[13] = y;
93 mat[14] = z;
94 tgi_mult_matrix(o, mat);
95 }
97 void tgi_rotate(struct tgi_object *o, float angle, float x, float y, float z)
98 {
99 mat4_t mat;
100 m4_rotate_axis(mat, DEG_TO_RAD(angle), x, y, z);
101 m4_transpose(mat, mat);
102 tgi_mult_matrix(o, mat[0]);
103 }
105 void tgi_scale(struct tgi_object *o, float x, float y, float z)
106 {
107 float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
108 mat[0] = x;
109 mat[5] = y;
110 mat[10] = z;
111 tgi_mult_matrix(o, mat);
112 }
114 void tgi_lookat(struct tgi_object *o, float x, float y, float z,
115 float tx, float ty, float tz, float ux, float uy, float uz)
116 {
117 float mat[16];
118 vec3_t vi, vj, vk;
120 vk = v3_normalize(v3_cons(tx - x, ty - y, tz - z));
121 vj = v3_cons(ux, uy, uz);
122 vi = v3_normalize(v3_cross(vj, vk));
123 vj = v3_normalize(v3_cross(vk, vi));
125 mat[0] = vi.x; mat[1] = vj.x, mat[2] = vk.x;
126 mat[4] = vi.y; mat[5] = vj.y, mat[6] = vk.y;
127 mat[8] = vi.z; mat[9] = vj.z, mat[10] = vk.z;
128 mat[3] = mat[7] = mat[11] = 0.0;
129 mat[12] = x; mat[13] = y; mat[14] = z;
130 mat[15] = 1.0f;
132 tgi_mult_matrix(o, mat);
133 }