static void get_light_modelviewprojection (const CoglMatrix *model_transform, RutEntity *light, const CoglMatrix *light_projection, CoglMatrix *light_mvp) { const CoglMatrix *light_transform; CoglMatrix light_view; /* TODO: cache the bias * light_projection * light_view matrix! */ /* Move the unit engine from [-1,1] to [0,1], column major order */ float bias[16] = { .5f, .0f, .0f, .0f, .0f, .5f, .0f, .0f, .0f, .0f, .5f, .0f, .5f, .5f, .5f, 1.f }; light_transform = rut_entity_get_transform (light); cogl_matrix_get_inverse (light_transform, &light_view); cogl_matrix_init_from_array (light_mvp, bias); cogl_matrix_multiply (light_mvp, light_mvp, light_projection); cogl_matrix_multiply (light_mvp, light_mvp, &light_view); cogl_matrix_multiply (light_mvp, light_mvp, model_transform); }
/** * clutter_matrix_init_from_array: * @matrix: a #ClutterMatrix * @values: (array fixed-size=16): a C array of 16 floating point values, * representing a 4x4 matrix, with column-major order * * Initializes @matrix with the contents of a C array of floating point * values. * * Return value: (transfer none): the initialzed #ClutterMatrix * * Since: 1.12 */ ClutterMatrix * clutter_matrix_init_from_array (ClutterMatrix *matrix, const float values[16]) { cogl_matrix_init_from_array (matrix, values); return matrix; }
void cogl_matrix_stack_multiply (CoglMatrixStack *stack, const CoglMatrix *matrix) { CoglMatrixEntryMultiply *entry; entry = _cogl_matrix_stack_push_operation (stack, COGL_MATRIX_OP_MULTIPLY); entry->matrix = _cogl_magazine_chunk_alloc (cogl_matrix_stack_matrices_magazine); cogl_matrix_init_from_array (entry->matrix, (float *)matrix); }
void cogl_matrix_stack_set (CoglMatrixStack *stack, const CoglMatrix *matrix) { CoglMatrixEntryLoad *entry; entry = _cogl_matrix_stack_push_replacement_entry (stack, COGL_MATRIX_OP_LOAD); entry->matrix = _cogl_magazine_chunk_alloc (cogl_matrix_stack_matrices_magazine); cogl_matrix_init_from_array (entry->matrix, (float *)matrix); }
static void transpose_matrix (const CoglMatrix *matrix, CoglMatrix *transpose) { const float *matrix_p = cogl_matrix_get_array (matrix); float matrix_array[16]; int i, j; /* This should probably be in Cogl */ for (j = 0; j < 4; j++) for (i = 0; i < 4; i++) matrix_array[i * 4 + j] = matrix_p[j * 4 + i]; cogl_matrix_init_from_array (transpose, matrix_array); }
gboolean cogl_matrix_get_inverse (const CoglMatrix *matrix, CoglMatrix *inverse) { #ifndef USE_MESA_MATRIX_API #warning "cogl_matrix_get_inverse not supported without Mesa matrix API" cogl_matrix_init_identity (inverse); return FALSE; #else if (_math_matrix_update_inverse ((CoglMatrix *)matrix)) { cogl_matrix_init_from_array (inverse, matrix->inv); return TRUE; } else { cogl_matrix_init_identity (inverse); return FALSE; } #endif }