Commit a955e4d0e5341a01c3026f91b8867223b3022088
authorMichel Pollet <buserror@gmail.com>
Wed, 13 Jun 2012 17:15:16 +0000 (18:15 +0100)
committerMichel Pollet <buserror@gmail.com>
Wed, 13 Jun 2012 17:15:16 +0000 (18:15 +0100)
added storage fields for buffer objects

Signed-off-by: Michel Pollet <buserror@gmail.com>
2 files changed:
examples/shared/libc3/src/c3geometry.c
examples/shared/libc3/src/c3geometry.h

index 7f607f607013b3fca200814b12eb9942e528bb69..9c5d359bb3030f40c3b9f480d1715fa7e53a06c4 100644 (file)
@@ -61,7 +61,11 @@ _c3geometry_project(
                const struct c3driver_geometry_t *d,
                c3mat4p m)
 {
-       if (g->vertice.count) {
+       /* make sure there are actual elements in the array
+        * if it had been purged, the element count might remain
+        * but the array size is zero
+        */
+       if (g->vertice.count < g->vertice.size) {
                for (int vi = 0; vi < g->vertice.count; vi++) {
                        c3vec3 v = c3mat4_mulv3(m, g->vertice.e[vi]);
                        if (vi == 0)
@@ -71,8 +75,9 @@ _c3geometry_project(
                                g->bbox.max = c3vec3_max(g->bbox.max, v);
                        }
                }
-       } else
-               g->bbox.min = g->bbox.max = c3vec3f(0,0,0);
+       }
+       /* else -- do not clear bbox on purged arrays
+               g->bbox.min = g->bbox.max = c3vec3f(0,0,0); */
 
        if (g->object && g->object->context)
                C3_DRIVER(g->object->context, geometry_project, g, m);
index 68831a853f26f3f1d8c865a91ebcd2275d8bbbb6..18d26deeff99e8414f3bf5d2c5849590e4adac6a 100644 (file)
@@ -37,10 +37,23 @@ struct c3object_t;
 struct c3pixels_t;
 struct c3program_t;
 
-DECLARE_C_ARRAY(c3vertex_t, c3vertex_array, 16, c3apiobject_t bid);
-DECLARE_C_ARRAY(c3tex_t, c3tex_array, 16, c3apiobject_t bid);
-DECLARE_C_ARRAY(c3colorf_t, c3colorf_array, 16, c3apiobject_t bid);
-DECLARE_C_ARRAY(c3index_t, c3indices_array, 16, c3apiobject_t bid);
+/*
+ * Allow per-array storage of an extra buffer object
+ * if 'mutable' is not set (default), the array can be clear()ed after
+ * the buffer is bound.
+ * If the array is mutable, setting the 'dirty' flag will signal
+ * the rendering layer that it needs to update the buffer object
+ */
+typedef struct c3geometry_buffer_t {
+       c3apiobject_t bid;      // buffer object
+       void * refCon;          // reference constant for application use
+       int mutable : 1, dirty : 1;
+} c3geometry_buffer_t, * c3geometry_buffer_p;
+
+DECLARE_C_ARRAY(c3vertex_t, c3vertex_array, 16, c3geometry_buffer_t buffer);
+DECLARE_C_ARRAY(c3tex_t, c3tex_array, 16, c3geometry_buffer_t buffer);
+DECLARE_C_ARRAY(c3colorf_t, c3colorf_array, 16, c3geometry_buffer_t buffer);
+DECLARE_C_ARRAY(c3index_t, c3indices_array, 16, c3geometry_buffer_t buffer);
 
 //! Geometry material.
 typedef struct c3material_t {