Prim *torus_set(Prim *p, Vector3 c, double r, double R) { Torus *t = p->d; t->c = c; t->r = r; t->R = R; p->ti = p->td = m4_ident(); p = torus_transform(p, m4_translate(c.x,c.y,c.z), m4_translate(-c.x,-c.y,-c.z)); p->b = torus_bbox(p); return p; }
Prim *cylin_set(Prim *p, Vector3 bc, double h, double r) { Cylin *s = p->d; s->bc = bc; s->h = h; s->r = r; p->ti = p->td = m4_ident(); p = cylin_transform(p, m4_scale(r,r,h), m4_scale(1/r,1/r,1/h)); p = cylin_transform(p, m4_translate(bc.x,bc.y,bc.z), m4_translate(-bc.x,-bc.y,-bc.z)); p->b = cylin_bbox(p); return p; }
Matrix4 m4_compxform(int k, char *t, Real **p, int j) { int i; Matrix4 m = m4_ident(); for (i = 0; i < k; i++) { switch (t[i]) { case G_TX: m = m4_m4prod(m4_translate(p[i][j], 0, 0), m); break; case G_TY: m = m4_m4prod(m4_translate(0, p[i][j], 0), m); break; case G_TZ: m = m4_m4prod(m4_translate(0, 0, p[i][j]), m); break; case G_RX: m = m4_m4prod(m4_rotate('x', p[i][j]), m); break; case G_RY: m = m4_m4prod(m4_rotate('y', p[i][j]), m); break; case G_RZ: m = m4_m4prod(m4_rotate('z', p[i][j]), m); break; case G_SX: m = m4_m4prod(m4_scale(p[i][j], 1, 1), m); break; case G_SY: m = m4_m4prod(m4_scale(1, p[i][j], 1), m); break; case G_SZ: m = m4_m4prod(m4_scale(1, 1, p[i][j]), m); break; default: break; } } return m; }
void anm_get_node_matrix(struct anm_node *node, mat4_t mat, anm_time_t tm) { int i; mat4_t rmat; vec3_t pos, scale; quat_t rot; pos = anm_get_node_position(node, tm); rot = anm_get_node_rotation(node, tm); scale = anm_get_node_scaling(node, tm); m4_set_translation(mat, node->pivot.x, node->pivot.y, node->pivot.z); quat_to_mat4(rmat, rot); for(i=0; i<3; i++) { mat[i][0] = rmat[i][0]; mat[i][1] = rmat[i][1]; mat[i][2] = rmat[i][2]; } /* this loop is equivalent to: m4_mult(mat, mat, rmat); */ mat[0][0] *= scale.x; mat[0][1] *= scale.y; mat[0][2] *= scale.z; mat[0][3] += pos.x; mat[1][0] *= scale.x; mat[1][1] *= scale.y; mat[1][2] *= scale.z; mat[1][3] += pos.y; mat[2][0] *= scale.x; mat[2][1] *= scale.y; mat[2][2] *= scale.z; mat[2][3] += pos.z; m4_translate(mat, -node->pivot.x, -node->pivot.y, -node->pivot.z); /* that's basically: pivot * rotation * translation * scaling * -pivot */ }
void s4_translate(Stack4 *s, Vector3 t) { *s->mtop = m4_m4prod(*s->mtop, m4_translate( t.x, t.y, t.z)); *s->itop = m4_m4prod(m4_translate(-t.x,-t.y,-t.z), *s->itop); }