Gawain: name struct's
[blender.git] / intern / gawain / gawain / gwn_vertex_buffer.h
1
2 // Gawain vertex buffer
3 //
4 // This code is part of the Gawain library, with modifications
5 // specific to integration with Blender.
6 //
7 // Copyright 2016 Mike Erwin
8 //
9 // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of
10 // the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
11
12 #pragma once
13
14 #include "gwn_vertex_format.h"
15
16 // How to create a Gwn_VertBuf:
17 // 1) verts = GWN_vertbuf_create() or GWN_vertbuf_init(verts)
18 // 2) GWN_vertformat_attr_add(verts->format, ...)
19 // 3) GWN_vertbuf_data_alloc(verts, vertex_ct) <-- finalizes/packs vertex format
20 // 4) GWN_vertbuf_attr_fill(verts, pos, application_pos_buffer)
21
22 // Is Gwn_VertBuf always used as part of a Gwn_Batch?
23
24 typedef struct Gwn_VertBuf {
25         Gwn_VertFormat format;
26         unsigned vertex_ct;
27         GLubyte* data; // NULL indicates data in VRAM (unmapped) or not yet allocated
28         GLuint vbo_id; // 0 indicates not yet sent to VRAM
29 } Gwn_VertBuf;
30
31 Gwn_VertBuf* GWN_vertbuf_create(void);
32 Gwn_VertBuf* GWN_vertbuf_create_with_format(const Gwn_VertFormat*);
33
34 void GWN_vertbuf_clear(Gwn_VertBuf* verts);
35 void GWN_vertbuf_discard(Gwn_VertBuf*);
36
37 void GWN_vertbuf_init(Gwn_VertBuf*);
38 void GWN_vertbuf_init_with_format(Gwn_VertBuf*, const Gwn_VertFormat*);
39
40 unsigned GWN_vertbuf_size_get(const Gwn_VertBuf*);
41 void GWN_vertbuf_data_alloc(Gwn_VertBuf*, unsigned v_ct);
42 void GWN_vertbuf_data_resize(Gwn_VertBuf*, unsigned v_ct);
43
44 // The most important set_attrib variant is the untyped one. Get it right first.
45 // It takes a void* so the app developer is responsible for matching their app data types
46 // to the vertex attribute's type and component count. They're in control of both, so this
47 // should not be a problem.
48
49 void GWN_vertbuf_attr_set(Gwn_VertBuf*, unsigned a_idx, unsigned v_idx, const void* data);
50 void GWN_vertbuf_attr_fill(Gwn_VertBuf*, unsigned a_idx, const void* data); // tightly packed, non interleaved input data
51 void GWN_vertbuf_attr_fill_stride(Gwn_VertBuf*, unsigned a_idx, unsigned stride, const void* data);
52
53 // For low level access only
54 typedef struct Gwn_VertBufRaw {
55         unsigned size;
56         unsigned stride;
57         GLubyte* data;
58         GLubyte* data_init;
59 #if TRUST_NO_ONE
60         // Only for overflow check
61         GLubyte* _data_end;
62 #endif
63 } Gwn_VertBufRaw;
64
65 GWN_INLINE void *GWN_vertbuf_raw_step(Gwn_VertBufRaw *a)
66         {
67         GLubyte* data = a->data;
68         a->data += a->stride;
69 #if TRUST_NO_ONE
70         assert(data < a->_data_end);
71 #endif
72         return (void *)data;
73         }
74
75 GWN_INLINE unsigned GWN_vertbuf_raw_used(Gwn_VertBufRaw *a)
76         {
77         return ((a->data - a->data_init) / a->stride);
78         }
79
80 void GWN_vertbuf_attr_get_raw_data(Gwn_VertBuf*, unsigned a_idx, Gwn_VertBufRaw *access);
81
82 // TODO: decide whether to keep the functions below
83 // doesn't immediate mode satisfy these needs?
84
85 //      void setAttrib1f(unsigned a_idx, unsigned v_idx, float x);
86 //      void setAttrib2f(unsigned a_idx, unsigned v_idx, float x, float y);
87 //      void setAttrib3f(unsigned a_idx, unsigned v_idx, float x, float y, float z);
88 //      void setAttrib4f(unsigned a_idx, unsigned v_idx, float x, float y, float z, float w);
89 //
90 //      void setAttrib3ub(unsigned a_idx, unsigned v_idx, unsigned char r, unsigned char g, unsigned char b);
91 //      void setAttrib4ub(unsigned a_idx, unsigned v_idx, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
92
93 void GWN_vertbuf_use(Gwn_VertBuf*);
94
95
96 // Metrics
97
98 unsigned GWN_vertbuf_get_memory_usage(void);
99
100
101 // Macros
102
103 #define GWN_VERTBUF_DISCARD_SAFE(verts) do { \
104         if (verts != NULL) { \
105                 GWN_vertbuf_discard(verts); \
106                 verts = NULL; \
107         } \
108 } while (0)