tinygi
diff 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 diff
1.1 --- a/src/object.c Sun Jul 19 18:30:29 2015 +0300 1.2 +++ b/src/object.c Mon Jul 20 04:38:53 2015 +0300 1.3 @@ -1,16 +1,133 @@ 1.4 +#include <stdio.h> 1.5 #include <stdlib.h> 1.6 #include <string.h> 1.7 -#include "object.h" 1.8 -#include "logger.h" 1.9 +#include "tgi_impl.h" 1.10 + 1.11 +static int namecount; 1.12 1.13 struct tgi_object *tgi_create_object(const char *name) 1.14 { 1.15 struct tgi_object *o; 1.16 + int nmsize; 1.17 1.18 if(!(o = malloc(sizeof *o))) { 1.19 tgi_log("failed to allocate memory\n"); 1.20 return 0; 1.21 } 1.22 memset(o, 0, sizeof *o); 1.23 + 1.24 + nmsize = name ? strlen(name) : 15; 1.25 + if(!(o->name = malloc(nmsize + 1))) { 1.26 + tgi_log("failed to allocate name string\n"); 1.27 + free(o); 1.28 + return 0; 1.29 + } 1.30 + 1.31 + if(!name) { 1.32 + sprintf(o->name, "tgi_object%03d", namecount++); 1.33 + } else { 1.34 + strcpy(o->name, name); 1.35 + } 1.36 + 1.37 return o; 1.38 } 1.39 + 1.40 +void tgi_destroy_object(struct tgi_object *o) 1.41 +{ 1.42 + if(o) { 1.43 + if(o->shape) { 1.44 + tgi_destroy_shape(o->shape); 1.45 + } 1.46 + if(o->mtl) { 1.47 + tgi_destroy_material(o->mtl); 1.48 + } 1.49 + free(o->name); 1.50 + } 1.51 +} 1.52 + 1.53 +void tgi_set_object_shape(struct tgi_object *o, struct tgi_shape *s) 1.54 +{ 1.55 + if(o->shape) { 1.56 + tgi_destroy_shape(o->shape); 1.57 + } 1.58 + o->shape = s; 1.59 +} 1.60 + 1.61 +void tgi_set_object_mtl(struct tgi_object *o, struct tgi_material *m) 1.62 +{ 1.63 + if(o->mtl) { 1.64 + tgi_destroy_material(o->mtl); 1.65 + } 1.66 + o->mtl = m; 1.67 +} 1.68 + 1.69 +/* mat should point to an array of 16 floats (4x4 homogeneous transformation matrix) */ 1.70 +void tgi_load_matrix(struct tgi_object *o, const float *mat) 1.71 +{ 1.72 + mat4_t tmp; 1.73 + memcpy(tmp, mat, 16 * sizeof(float)); 1.74 + m4_transpose(o->xform, tmp); 1.75 + m4_inverse(o->inv_xform, o->xform); 1.76 +} 1.77 + 1.78 +void tgi_mult_matrix(struct tgi_object *o, const float *mat) 1.79 +{ 1.80 + mat4_t tmp; 1.81 + memcpy(tmp, mat, 16 * sizeof(float)); 1.82 + m4_transpose(tmp, tmp); 1.83 + m4_mult(o->xform, o->xform, tmp); 1.84 + m4_inverse(o->inv_xform, o->xform); 1.85 +} 1.86 + 1.87 +void tgi_load_identity(struct tgi_object *o) 1.88 +{ 1.89 + static const float id[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; 1.90 + tgi_load_matrix(o, id); 1.91 +} 1.92 + 1.93 +void tgi_translate(struct tgi_object *o, float x, float y, float z) 1.94 +{ 1.95 + float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; 1.96 + mat[12] = x; 1.97 + mat[13] = y; 1.98 + mat[14] = z; 1.99 + tgi_mult_matrix(o, mat); 1.100 +} 1.101 + 1.102 +void tgi_rotate(struct tgi_object *o, float angle, float x, float y, float z) 1.103 +{ 1.104 + mat4_t mat; 1.105 + m4_rotate_axis(mat, DEG_TO_RAD(angle), x, y, z); 1.106 + m4_transpose(mat, mat); 1.107 + tgi_mult_matrix(o, mat[0]); 1.108 +} 1.109 + 1.110 +void tgi_scale(struct tgi_object *o, float x, float y, float z) 1.111 +{ 1.112 + float mat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; 1.113 + mat[0] = x; 1.114 + mat[5] = y; 1.115 + mat[10] = z; 1.116 + tgi_mult_matrix(o, mat); 1.117 +} 1.118 + 1.119 +void tgi_lookat(struct tgi_object *o, float x, float y, float z, 1.120 + float tx, float ty, float tz, float ux, float uy, float uz) 1.121 +{ 1.122 + float mat[16]; 1.123 + vec3_t vi, vj, vk; 1.124 + 1.125 + vk = v3_normalize(v3_cons(tx - x, ty - y, tz - z)); 1.126 + vj = v3_cons(ux, uy, uz); 1.127 + vi = v3_normalize(v3_cross(vj, vk)); 1.128 + vj = v3_normalize(v3_cross(vk, vi)); 1.129 + 1.130 + mat[0] = vi.x; mat[1] = vj.x, mat[2] = vk.x; 1.131 + mat[4] = vi.y; mat[5] = vj.y, mat[6] = vk.y; 1.132 + mat[8] = vi.z; mat[9] = vj.z, mat[10] = vk.z; 1.133 + mat[3] = mat[7] = mat[11] = 0.0; 1.134 + mat[12] = x; mat[13] = y; mat[14] = z; 1.135 + mat[15] = 1.0f; 1.136 + 1.137 + tgi_mult_matrix(o, mat); 1.138 +}