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; }
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; }
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; }