/** * graphene_matrix_multiply: * @a: a #graphene_matrix_t * @b: a #graphene_matrix_t * @res: (out caller-allocates): return location for the matrix * result * * Multiplies two #graphene_matrix_t. * * Remember: matrix multiplication is not commutative, except for the * identity matrix; the product of this multiplication is (A * B). * * Since: 1.0 */ void graphene_matrix_multiply (const graphene_matrix_t *a, const graphene_matrix_t *b, graphene_matrix_t *res) { graphene_simd4x4f_matrix_mul (&a->value, &b->value, &res->value); }
static void matrix_multiply (gpointer data_) { MatrixBench *data = data_; int i; for (i = 0; i < N_ROUNDS; i++) graphene_simd4x4f_matrix_mul (&(data->a[i]), &(data->b[i]), &(data->c[i])); }
/** * graphene_matrix_translate: * @m: a #graphene_matrix_t * @pos: a #graphene_point3d_t * * Adds a translation transformation to @m using the coordinates * of the given #graphene_point3d_t. * * Since: 1.0 */ void graphene_matrix_translate (graphene_matrix_t *m, const graphene_point3d_t *pos) { graphene_simd4x4f_t trans_m; graphene_simd4x4f_translation (&trans_m, pos->x, pos->y, pos->z); graphene_simd4x4f_matrix_mul (&m->value, &trans_m, &m->value); }
/** * graphene_matrix_scale: * @m: a #graphene_matrix_t * @factor_x: scaling factor on the X axis * @factor_y: scaling factor on the Y axis * @factor_z: scaling factor on the Z axis * * Adds a scaling transformation to @m, using the three * given factors. * * Since: 1.0 */ void graphene_matrix_scale (graphene_matrix_t *m, float factor_x, float factor_y, float factor_z) { graphene_simd4x4f_t scale_m; graphene_simd4x4f_scale (&scale_m, factor_x, factor_y, factor_z); graphene_simd4x4f_matrix_mul (&m->value, &scale_m, &m->value); }
static inline void graphene_matrix_rotate_internal (graphene_simd4x4f_t *m, float angle, graphene_simd4f_t axis) { float rad = angle * GRAPHENE_PI / 180.f; graphene_simd4x4f_t rot_m; graphene_simd4x4f_rotation (&rot_m, rad, axis); graphene_simd4x4f_matrix_mul (m, &rot_m, m); }