Exemplo n.º 1
0
int moto_ray_intersect_cylinder_dist(MotoRay *self,
        float *dist, float a[3], float b[3], float radius)
{
    const float z[3] = {0, 0, 1};
    float c[3], tmp;
    vector3_dif(c, a, b);

    float height = vector3_length(c);
    c[0] /= height;
    c[1] /= height;
    c[2] /= height;

    float cross[3];
    vector3_cross(cross, c, z);

    float cos0 = vector3_dot(c, z);
    float sin0 = acos(cos0);

    float m[16], im[16], t[16], tmpm[16];

    matrix44_rotate_from_axis_sincos(m, sin0, cos0, cross[0], cross[1], cross[2]);
    matrix44_translate(t, a[0], b[0], c[0]);
    matrix44_mult(tmpm, t, m);

    matrix44_inverse(im, tmpm, m, tmp);

    MotoRay r;
    moto_ray_set_transformed(&r, self, im);

    

    *dist = 1;
    return 1;
}
Exemplo n.º 2
0
static void moto_object_node_calc_translate(MotoObjectNode *self)
{
    if(self->priv->translate_calculated)
        return;

    // FIXME: Rewrite with moto_value_[g|s]et_[boolean|int|float]_[2|3|4] when them will be implemented!
    gfloat *t = (gfloat *)g_value_peek_pointer(moto_node_get_param_value((MotoNode *)self, "t"));

    matrix44_translate(self->priv->translate_matrix, t[0], t[1], t[2]);

    self->priv->translate_calculated = TRUE;
}
Exemplo n.º 3
0
matrix44
transform_get_world_matrix(const transform &transform)
{
  matrix33 basis = quaternion_get_rotation_matrix(transform.rotation);
  std::array<float, 16> rotation_data;
  rotation_data.at(0) = matrix33_get(basis, 0);
  rotation_data.at(1) = matrix33_get(basis, 1);
  rotation_data.at(2) = matrix33_get(basis, 2);
  rotation_data.at(3) = 0.f;
  
  rotation_data.at(4) = matrix33_get(basis, 3);
  rotation_data.at(5) = matrix33_get(basis, 4);
  rotation_data.at(6) = matrix33_get(basis, 5);
  rotation_data.at(7) = 0.f;
  
  rotation_data.at(8) = matrix33_get(basis, 6);
  rotation_data.at(9) = matrix33_get(basis, 7);
  rotation_data.at(10) = matrix33_get(basis, 8);
  rotation_data.at(11) = 0.f;
  
  rotation_data.at(12) = 0.f;
  rotation_data.at(13) = 0.f;
  rotation_data.at(14) = 0.f;
  rotation_data.at(15) = 1.f;
  
  //matrix33_to_array(basis, &rotation_data[0]);
  
  const matrix44 rotaiton = matrix44_init_with_array(rotation_data);
  
  const auto vec =  transform.position;
  
  const matrix44 translate = matrix44_translate(matrix44_id(), vec);
  
  // Scale
  const float x = caff_math::vector3_get_x(transform.scale);
  const float y = caff_math::vector3_get_y(transform.scale);
  const float z = caff_math::vector3_get_z(transform.scale);
  const matrix44 scale = matrix44_scale(x, y, z);
  
  const matrix44 scale_rotation = caff_math::matrix44_multiply(scale, rotaiton);
  const matrix44 world_matrix = caff_math::matrix44_multiply(scale_rotation, translate);
  
  return world_matrix;
}