From 2d58d3f1b6b728e3cca6e1bbeabd19fc03de05df Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Tue, 12 Oct 2010 15:48:31 +0100 Subject: [PATCH] primitive: Adds convenience constructors This adds convenience primitive constructors named like: cogl_primitive_new_p3 or cogl_primitive_new_p3c4 or cogl_primitive_new_p3t2c4 where the letters correspond to the interleved vertex attributes layouts such as CoglP3Vertex which is a struct with 3 float x,y,z members for the [p]osition, or CoglP3T2C4Vertex which is a struct with 3 float x,y,z members for the [p]osition, 2 float s,t members for the [t]exture coordinates and 4 unsigned byte r,g,b,a members for the [c]olor. The hope is that people will find these convenient enough to replace cogl_polygon. --- clutter/cogl/cogl/cogl-primitive.c | 246 +++++++++++++++++++++++++++++ clutter/cogl/cogl/cogl-primitive.h | 66 ++++++-- 2 files changed, 296 insertions(+), 16 deletions(-) diff --git a/clutter/cogl/cogl/cogl-primitive.c b/clutter/cogl/cogl/cogl-primitive.c index 61b3dd656..85b0a53f1 100644 --- a/clutter/cogl/cogl/cogl-primitive.c +++ b/clutter/cogl/cogl/cogl-primitive.c @@ -96,6 +96,252 @@ cogl_primitive_new (CoglVerticesMode mode, attributes); } +CoglPrimitive * +cogl_primitive_new_p3 (CoglVerticesMode mode, + int n_vertices, + const CoglP3Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP3Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[2]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP3Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP3Vertex), + offsetof (CoglP3Vertex, x), + 3, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; +} + +CoglPrimitive * +cogl_primitive_new_p2c4 (CoglVerticesMode mode, + int n_vertices, + const CoglP2C4Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP2C4Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[3]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP2C4Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP2C4Vertex), + offsetof (CoglP2C4Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_color_in", + sizeof (CoglP2C4Vertex), + offsetof (CoglP2C4Vertex, r), + 4, + COGL_VERTEX_ATTRIBUTE_TYPE_UNSIGNED_BYTE); + attributes[2] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; +} + +CoglPrimitive * +cogl_primitive_new_p3c4 (CoglVerticesMode mode, + int n_vertices, + const CoglP3C4Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP3C4Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[3]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP3C4Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP3C4Vertex), + offsetof (CoglP3C4Vertex, x), + 3, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_color_in", + sizeof (CoglP3C4Vertex), + offsetof (CoglP3C4Vertex, r), + 4, + COGL_VERTEX_ATTRIBUTE_TYPE_UNSIGNED_BYTE); + attributes[2] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; +} + +CoglPrimitive * +cogl_primitive_new_p2t2 (CoglVerticesMode mode, + int n_vertices, + const CoglP2T2Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP2T2Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[3]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP2T2Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP2T2Vertex), + offsetof (CoglP2T2Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_tex_coord0_in", + sizeof (CoglP2T2Vertex), + offsetof (CoglP2T2Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[2] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (array); + return prim; +} + +CoglPrimitive * +cogl_primitive_new_p3t2 (CoglVerticesMode mode, + int n_vertices, + const CoglP3T2Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP3T2Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[3]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP3T2Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP3T2Vertex), + offsetof (CoglP3T2Vertex, x), + 3, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_tex_coord0_in", + sizeof (CoglP3T2Vertex), + offsetof (CoglP3T2Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[2] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; + +} + +CoglPrimitive * +cogl_primitive_new_p2t2c4 (CoglVerticesMode mode, + int n_vertices, + const CoglP2T2C4Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP2T2C4Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[4]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP2T2C4Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP2T2C4Vertex), + offsetof (CoglP2T2C4Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_tex_coord0_in", + sizeof (CoglP2T2C4Vertex), + offsetof (CoglP2T2C4Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[2] = + cogl_vertex_attribute_new (array, + "cogl_color_in", + sizeof (CoglP2T2C4Vertex), + offsetof (CoglP2T2C4Vertex, r), + 4, + COGL_VERTEX_ATTRIBUTE_TYPE_UNSIGNED_BYTE); + attributes[3] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; +} + +CoglPrimitive * +cogl_primitive_new_p3t2c4 (CoglVerticesMode mode, + int n_vertices, + const CoglP3T2C4Vertex *data) +{ + CoglVertexArray *array = + cogl_vertex_array_new (n_vertices * sizeof (CoglP3T2C4Vertex)); + CoglBuffer *buffer = COGL_BUFFER (array); + CoglVertexAttribute *attributes[4]; + CoglPrimitive *prim; + + cogl_buffer_set_data (buffer, 0, (guint8 *)data, + n_vertices * sizeof (CoglP3T2C4Vertex)); + attributes[0] = + cogl_vertex_attribute_new (array, + "cogl_position_in", + sizeof (CoglP3T2C4Vertex), + offsetof (CoglP3T2C4Vertex, x), + 3, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[1] = + cogl_vertex_attribute_new (array, + "cogl_tex_coord0_in", + sizeof (CoglP3T2C4Vertex), + offsetof (CoglP3T2C4Vertex, x), + 2, + COGL_VERTEX_ATTRIBUTE_TYPE_FLOAT); + attributes[2] = + cogl_vertex_attribute_new (array, + "cogl_color_in", + sizeof (CoglP3T2C4Vertex), + offsetof (CoglP3T2C4Vertex, r), + 4, + COGL_VERTEX_ATTRIBUTE_TYPE_UNSIGNED_BYTE); + attributes[3] = NULL; + prim = cogl_primitive_new_with_attributes_array (mode, n_vertices, + attributes); + cogl_object_unref (prim); + return prim; +} + static void free_attributes_list (CoglPrimitive *primitive) { diff --git a/clutter/cogl/cogl/cogl-primitive.h b/clutter/cogl/cogl/cogl-primitive.h index b4a8e90f0..6c5835bed 100644 --- a/clutter/cogl/cogl/cogl-primitive.h +++ b/clutter/cogl/cogl/cogl-primitive.h @@ -47,7 +47,7 @@ G_BEGIN_DECLS typedef struct _CoglPrimitive CoglPrimitive; /** - * CoglV2Vertex: + * CoglP2Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @@ -60,10 +60,10 @@ typedef struct _CoglPrimitive CoglPrimitive; typedef struct { float x, y; -} CoglV2Vertex; +} CoglP2Vertex; /** - * CoglV3Vertex: + * CoglP3Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @z: The z component of a position attribute @@ -77,10 +77,10 @@ typedef struct typedef struct { float x, y, z; -} CoglV3Vertex; +} CoglP3Vertex; /** - * CoglV2C4Vertex: + * CoglP2C4Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @r: The red component of a color attribute @@ -98,10 +98,10 @@ typedef struct { float x, y; guint8 r, g, b, a; -} CoglV2C4Vertex; +} CoglP2C4Vertex; /** - * CoglV3C4Vertex: + * CoglP3C4Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @z: The z component of a position attribute @@ -120,10 +120,10 @@ typedef struct { float x, y, z; guint8 r, g, b, a; -} CoglV3C4Vertex; +} CoglP3C4Vertex; /** - * CoglV2T2Vertex: + * CoglP2T2Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @s: The s component of a texture coordinate attribute @@ -139,10 +139,10 @@ typedef struct { float x, y; float s, t; -} CoglV2T2Vertex; +} CoglP2T2Vertex; /** - * CoglV3T2Vertex: + * CoglP3T2Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @z: The z component of a position attribute @@ -159,11 +159,11 @@ typedef struct { float x, y, z; float s, t; -} CoglV3T2Vertex; +} CoglP3T2Vertex; /** - * CoglV2T2C4Vertex: + * CoglP2T2C4Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @s: The s component of a texture coordinate attribute @@ -184,10 +184,10 @@ typedef struct float x, y; float s, t; guint8 r, g, b, a; -} CoglV2T2C4Vertex; +} CoglP2T2C4Vertex; /** - * CoglV3T2C4Vertex: + * CoglP3T2C4Vertex: * @x: The x component of a position attribute * @y: The y component of a position attribute * @z: The z component of a position attribute @@ -209,7 +209,7 @@ typedef struct float x, y, z; float s, t; guint8 r, g, b, a; -} CoglV3T2C4Vertex; +} CoglP3T2C4Vertex; /** * cogl_primitive_new: @@ -237,6 +237,40 @@ cogl_primitive_new_with_attributes_array (CoglVerticesMode mode, int n_vertices, CoglVertexAttribute **attributes); +CoglPrimitive * +cogl_primitive_new_with_v3_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP3Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v2c4_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP2C4Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v3c4_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP3C4Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v2t2_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP2T2Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v3t2_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP3T2Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v2t2c4_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP2T2C4Vertex *data); + +CoglPrimitive * +cogl_primitive_new_with_v3t2c4_attributes (CoglVerticesMode mode, + int n_vertices, + const CoglP3T2C4Vertex *data); int cogl_primitive_get_first_vertex (CoglPrimitive *primitive);