Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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 */
}
Beispiel #5
0
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);
}