[cogl-matrix] Documents that CoglMatrix members should be considered read only

In the future if we want to annotate matrices with internal flags, and add
caching of the inverse matrix then we need to ensure that all matrix
modifications are done by cogl_matrix API so we'd know when to dirty the
cache or update the flags.

This just adds documentation to that effect, and assuming the most likley
case where someone would try and directly write to matrix members would
probably be to load a constant matrix other than the identity matrix; I
renamed cogl_matrix_init_from_gl_matrix to cogl_matrix_init_from_array to
make it seem more general purpose.
This commit is contained in:
Robert Bragg 2009-02-25 16:23:09 +00:00
parent 9878fdf5c6
commit f816644022
5 changed files with 26 additions and 17 deletions

View File

@ -35,8 +35,15 @@ G_BEGIN_DECLS
* w_new = wx * x + wy * y + wz * z + ww * w * w_new = wx * x + wy * y + wz * z + ww * w
* </programlisting> * </programlisting>
* Where w is normally 1 * Where w is normally 1
*
* Note: You must consider the members of the CoglMatrix structure read only,
* and all matrix modifications must be done via the cogl_matrix API. This
* allows Cogl to annotate the matrices internally. Violation of this will give
* undefined results. If you need to initialize a matrix with a constant other
* than the identity matrix you can use cogl_matrix_init_from_array().
*/ */
typedef struct _CoglMatrix { typedef struct _CoglMatrix {
/* column 0 */ /* column 0 */
float xx; float xx;
float yx; float yx;
@ -92,7 +99,7 @@ void cogl_matrix_init_identity (CoglMatrix *matrix);
* @b: A 4x4 transformation matrix * @b: A 4x4 transformation matrix
* *
* This function multiples the two supplied matricies together and stores * This function multiples the two supplied matricies together and stores
* the result in #result * the result in @result
*/ */
void cogl_matrix_multiply (CoglMatrix *result, void cogl_matrix_multiply (CoglMatrix *result,
const CoglMatrix *a, const CoglMatrix *a,
@ -163,22 +170,22 @@ cogl_matrix_transform_point (const CoglMatrix *matrix,
float *w); float *w);
/** /**
* cogl_matrix_init_from_gl_matrix: * cogl_matrix_init_from_array:
* @matrix: A 4x4 transformation matrix * @matrix: A 4x4 transformation matrix
* @gl_matrix: A linear array of 16 Glfloats (column-major) * @array: A linear array of 16 floats (column-major order)
* *
* This initialises @matrix with the contents of @gl_matrix * This initialises @matrix with the contents of @array
*/ */
void cogl_matrix_init_from_gl_matrix (CoglMatrix *matrix, const float *gl_matrix); void cogl_matrix_init_from_array (CoglMatrix *matrix, const float *array);
/** /**
* cogl_matrix_get_gl_matrix: * cogl_matrix_get_array:
* @matrix: A 4x4 transformation matrix * @matrix: A 4x4 transformation matrix
* *
* This casts a CoglMatrix to a GLfloat array which can be directly passed to * This casts a CoglMatrix to a float array which can be directly passed to
* OpenGL. * OpenGL.
*/ */
const float *cogl_matrix_get_gl_matrix (const CoglMatrix *matrix); const float *cogl_matrix_get_array (const CoglMatrix *matrix);
G_END_DECLS G_END_DECLS

View File

@ -141,13 +141,13 @@ cogl_matrix_transform_point (const CoglMatrix *matrix,
} }
void void
cogl_matrix_init_from_gl_matrix (CoglMatrix *matrix, const float *gl_matrix) cogl_matrix_init_from_array (CoglMatrix *matrix, const float *array)
{ {
memcpy (matrix, gl_matrix, sizeof (float) * 16); memcpy (matrix, array, sizeof (float) * 16);
} }
const float * const float *
cogl_matrix_get_gl_matrix (const CoglMatrix *matrix) cogl_matrix_get_array (const CoglMatrix *matrix)
{ {
return (float *)matrix; return (float *)matrix;
} }

View File

@ -322,6 +322,8 @@ cogl_matrix_multiply
cogl_matrix_rotate cogl_matrix_rotate
cogl_matrix_translate cogl_matrix_translate
cogl_matrix_scale cogl_matrix_scale
cogl_matrix_init_from_array
cogl_matrix_get_array
</SECTION> </SECTION>
<SECTION> <SECTION>

View File

@ -532,7 +532,7 @@ _cogl_add_stencil_clip (float x_offset,
void void
_cogl_set_matrix (const CoglMatrix *matrix) _cogl_set_matrix (const CoglMatrix *matrix)
{ {
const GLfloat *gl_matrix = cogl_matrix_get_gl_matrix (matrix); const GLfloat *gl_matrix = cogl_matrix_get_array (matrix);
GE (glLoadMatrixf (gl_matrix)); GE (glLoadMatrixf (gl_matrix));
} }
@ -1130,7 +1130,7 @@ cogl_get_modelview_matrix (CoglMatrix *matrix)
/* Since it's internal to Cogl and CoglMatrix doesn't currently have /* Since it's internal to Cogl and CoglMatrix doesn't currently have
* any flag members, we could avoid this extra copy if it really * any flag members, we could avoid this extra copy if it really
* bothers anyone */ * bothers anyone */
cogl_matrix_init_from_gl_matrix (matrix, m); cogl_matrix_init_from_array (matrix, m);
} }
void void
@ -1141,7 +1141,7 @@ cogl_get_projection_matrix (CoglMatrix *matrix)
/* Since it's internal to Cogl and CoglMatrix doesn't currently have /* Since it's internal to Cogl and CoglMatrix doesn't currently have
* any flag members, we could avoid this extra copy if it really * any flag members, we could avoid this extra copy if it really
* bothers anyone */ * bothers anyone */
cogl_matrix_init_from_gl_matrix (matrix, m); cogl_matrix_init_from_array (matrix, m);
} }
void void

View File

@ -455,7 +455,7 @@ _cogl_add_stencil_clip (float x_offset,
void void
_cogl_set_matrix (const CoglMatrix *matrix) _cogl_set_matrix (const CoglMatrix *matrix)
{ {
const GLfloat *gl_matrix = cogl_matrix_get_gl_matrix (matrix); const GLfloat *gl_matrix = cogl_matrix_get_array (matrix);
GE (glLoadMatrixf (gl_matrix)); GE (glLoadMatrixf (gl_matrix));
} }
@ -687,7 +687,7 @@ cogl_get_modelview_matrix (CoglMatrix *matrix)
/* Since it's internal to Cogl and CoglMatrix doesn't currently have /* Since it's internal to Cogl and CoglMatrix doesn't currently have
* any flag members, we could avoid this extra copy if it really * any flag members, we could avoid this extra copy if it really
* bothers anyone */ * bothers anyone */
cogl_matrix_init_from_gl_matrix (matrix, m); cogl_matrix_init_from_array (matrix, m);
} }
void void
@ -698,7 +698,7 @@ cogl_get_projection_matrix (CoglMatrix *matrix)
/* Since it's internal to Cogl and CoglMatrix doesn't currently have /* Since it's internal to Cogl and CoglMatrix doesn't currently have
* any flag members, we could avoid this extra copy if it really * any flag members, we could avoid this extra copy if it really
* bothers anyone */ * bothers anyone */
cogl_matrix_init_from_gl_matrix (matrix, m); cogl_matrix_init_from_array (matrix, m);
} }
void void