tinygi

view src/object.c @ 2:72752a1b3dbe

images and shapes
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 21 Jul 2015 04:30:00 +0300
parents bc64090fe3d1
children
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 free(o->name);
42 }
43 }
45 void tgi_set_object_shape(struct tgi_object *o, struct tgi_shape *s)
46 {
47 if(o->shape) {
48 tgi_destroy_shape(o->shape);
49 }
50 o->shape = s;
51 }
53 /* mat should point to an array of 16 floats (4x4 homogeneous transformation matrix) */
54 void tgi_load_matrix(struct tgi_object *o, const float *mat)
55 {
56 mat4_t tmp;
57 memcpy(tmp, mat, 16 * sizeof(float));
58 m4_transpose(o->xform, tmp);
59 m4_inverse(o->inv_xform, o->xform);
60 }
62 void tgi_mult_matrix(struct tgi_object *o, const float *mat)
63 {
64 mat4_t tmp;
65 memcpy(tmp, mat, 16 * sizeof(float));
66 m4_transpose(tmp, tmp);
67 m4_mult(o->xform, o->xform, tmp);
68 m4_inverse(o->inv_xform, o->xform);
69 }
71 void tgi_load_identity(struct tgi_object *o)
72 {
73 static const float id[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
74 tgi_load_matrix(o, id);
75 }
77 void tgi_translate(struct tgi_object *o, float x, float y, float z)
78 {
79 float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
80 mat[12] = x;
81 mat[13] = y;
82 mat[14] = z;
83 tgi_mult_matrix(o, mat);
84 }
86 void tgi_rotate(struct tgi_object *o, float angle, float x, float y, float z)
87 {
88 mat4_t mat;
89 m4_rotate_axis(mat, DEG_TO_RAD(angle), x, y, z);
90 m4_transpose(mat, mat);
91 tgi_mult_matrix(o, mat[0]);
92 }
94 void tgi_scale(struct tgi_object *o, float x, float y, float z)
95 {
96 float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
97 mat[0] = x;
98 mat[5] = y;
99 mat[10] = z;
100 tgi_mult_matrix(o, mat);
101 }
103 void tgi_lookat(struct tgi_object *o, float x, float y, float z,
104 float tx, float ty, float tz, float ux, float uy, float uz)
105 {
106 float mat[16];
107 vec3_t vi, vj, vk;
109 vk = v3_normalize(v3_cons(tx - x, ty - y, tz - z));
110 vj = v3_cons(ux, uy, uz);
111 vi = v3_normalize(v3_cross(vj, vk));
112 vj = v3_normalize(v3_cross(vk, vi));
114 mat[0] = vi.x; mat[1] = vj.x, mat[2] = vk.x;
115 mat[4] = vi.y; mat[5] = vj.y, mat[6] = vk.y;
116 mat[8] = vi.z; mat[9] = vj.z, mat[10] = vk.z;
117 mat[3] = mat[7] = mat[11] = 0.0;
118 mat[12] = x; mat[13] = y; mat[14] = z;
119 mat[15] = 1.0f;
121 tgi_mult_matrix(o, mat);
122 }