diff options
author | Mike Erwin <significant.bit@gmail.com> | 2016-08-07 00:32:19 +0300 |
---|---|---|
committer | Mike Erwin <significant.bit@gmail.com> | 2016-08-07 08:05:49 +0300 |
commit | a55c5dbcc4b2ad7bd64386819681bcf1ac722a5b (patch) | |
tree | 5ae7ab0ea3ffda3214ecc7798462a1c7c26a3fdd /source/blender/gpu/intern/gpu_immediate.c | |
parent | 3eae585791fb15db6cc0a081b30bb6a78b4f82bf (diff) |
Gawain: flesh out immediate mode
More ways to send values via immAttrib:
2D float vectors
3 & 4 component ubytes (for colors mostly)
New immVertex functions that act more like familiar glVertex. We’ll
find a balance between making this API convenient and keeping it small.
2f and 3f are enough for now.
Diffstat (limited to 'source/blender/gpu/intern/gpu_immediate.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_immediate.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c index e9d19aef3f8..2e4763012ee 100644 --- a/source/blender/gpu/intern/gpu_immediate.c +++ b/source/blender/gpu/intern/gpu_immediate.c @@ -377,6 +377,27 @@ void immAttrib1f(unsigned attrib_id, float x) data[0] = x; } +void immAttrib2f(unsigned attrib_id, float x, float y) + { + Attrib* attrib = immVertexFormat.attribs + attrib_id; + +#if TRUST_NO_ONE + assert(attrib_id < immVertexFormat.attrib_ct); + assert(attrib->comp_type == GL_FLOAT); + assert(attrib->comp_ct == 2); + assert(imm.vertex_idx < imm.vertex_ct); + assert(imm.primitive != GL_NONE); // make sure we're between a Begin/End pair +#endif + + setAttribValueBit(attrib_id); + + float* data = imm.vertex_data + attrib->offset; +// printf("%s %ld %p\n", __FUNCTION__, (void*)data - imm.buffer_data, data); + + data[0] = x; + data[1] = y; + } + void immAttrib3f(unsigned attrib_id, float x, float y, float z) { Attrib* attrib = immVertexFormat.attribs + attrib_id; @@ -399,6 +420,51 @@ void immAttrib3f(unsigned attrib_id, float x, float y, float z) data[2] = z; } +void immAttrib3ub(unsigned attrib_id, unsigned char r, unsigned char g, unsigned char b) + { + Attrib* attrib = immVertexFormat.attribs + attrib_id; + +#if TRUST_NO_ONE + assert(attrib_id < immVertexFormat.attrib_ct); + assert(attrib->comp_type == GL_UNSIGNED_BYTE); + assert(attrib->comp_ct == 3); + assert(imm.vertex_idx < imm.vertex_ct); + assert(imm.primitive != GL_NONE); // make sure we're between a Begin/End pair +#endif + + setAttribValueBit(attrib_id); + + unsigned char* data = imm.vertex_data + attrib->offset; +// printf("%s %ld %p\n", __FUNCTION__, (void*)data - imm.buffer_data, data); + + data[0] = r; + data[1] = g; + data[2] = b; + } + +void immAttrib4ub(unsigned attrib_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a) + { + Attrib* attrib = immVertexFormat.attribs + attrib_id; + +#if TRUST_NO_ONE + assert(attrib_id < immVertexFormat.attrib_ct); + assert(attrib->comp_type == GL_UNSIGNED_BYTE); + assert(attrib->comp_ct == 4); + assert(imm.vertex_idx < imm.vertex_ct); + assert(imm.primitive != GL_NONE); // make sure we're between a Begin/End pair +#endif + + setAttribValueBit(attrib_id); + + unsigned char* data = imm.vertex_data + attrib->offset; +// printf("%s %ld %p\n", __FUNCTION__, (void*)data - imm.buffer_data, data); + + data[0] = r; + data[1] = g; + data[2] = b; + data[3] = a; + } + void immEndVertex() { #if TRUST_NO_ONE @@ -415,3 +481,15 @@ void immEndVertex() imm.vertex_data += immVertexFormat.stride; imm.attrib_value_bits = 0; } + +void immVertex2f(unsigned attrib_id, float x, float y) + { + immAttrib2f(attrib_id, x, y); + immEndVertex(); + } + +void immVertex3f(unsigned attrib_id, float x, float y, float z) + { + immAttrib3f(attrib_id, x, y, z); + immEndVertex(); + } |