Gawain: name struct's
[blender.git] / intern / gawain / gawain / gwn_batch.h
1
2 // Gawain geometry batch
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_buffer.h"
15 #include "gwn_element.h"
16 #include "gwn_shader_interface.h"
17
18 typedef enum {
19         GWN_BATCH_READY_TO_FORMAT,
20         GWN_BATCH_READY_TO_BUILD,
21         GWN_BATCH_BUILDING,
22         GWN_BATCH_READY_TO_DRAW
23 } Gwn_BatchPhase;
24
25 #define GWN_BATCH_VBO_MAX_LEN 3
26
27 typedef struct Gwn_Batch {
28         // geometry
29         Gwn_VertBuf* verts[GWN_BATCH_VBO_MAX_LEN]; // verts[0] is required, others can be NULL
30         Gwn_IndexBuf* elem; // NULL if element list not needed
31         Gwn_PrimType prim_type;
32         GLenum gl_prim_type;
33
34         // book-keeping
35         GLuint vao_id; // remembers all geometry state (vertex attrib bindings & element buffer)
36         Gwn_BatchPhase phase;
37         bool program_dirty;
38         bool program_in_use;
39         unsigned owns_flag;
40
41         // state
42         GLuint program;
43         const Gwn_ShaderInterface* interface;
44 } Gwn_Batch;
45
46 enum {
47         GWN_BATCH_OWNS_VBO = (1 << 0),
48         /* each vbo index gets bit-shifted */
49         GWN_BATCH_OWNS_INDEX = (1 << 31),
50 };
51
52 Gwn_Batch* GWN_batch_create_ex(Gwn_PrimType, Gwn_VertBuf*, Gwn_IndexBuf*, unsigned owns_flag);
53 void GWN_batch_init_ex(Gwn_Batch*, Gwn_PrimType, Gwn_VertBuf*, Gwn_IndexBuf*, unsigned owns_flag);
54
55 #define GWN_batch_create(prim, verts, elem) \
56         GWN_batch_create_ex(prim, verts, elem, 0)
57 #define GWN_batch_init(batch, prim, verts, elem) \
58         GWN_batch_init_ex(batch, prim, verts, elem, 0)
59
60 void GWN_batch_discard(Gwn_Batch*); // verts & elem are not discarded
61
62 int GWN_batch_vertbuf_add_ex(Gwn_Batch*, Gwn_VertBuf*, bool own_vbo);
63
64 #define GWN_batch_vertbuf_add(batch, verts) \
65         GWN_batch_vertbuf_add_ex(batch, verts, false)
66
67 void GWN_batch_program_set(Gwn_Batch*, GLuint program, const Gwn_ShaderInterface*);
68 // Entire batch draws with one shader program, but can be redrawn later with another program.
69 // Vertex shader's inputs must be compatible with the batch's vertex format.
70
71 void GWN_batch_program_use_begin(Gwn_Batch*); // call before Batch_Uniform (temp hack?)
72 void GWN_batch_program_use_end(Gwn_Batch*);
73
74 void GWN_batch_uniform_1i(Gwn_Batch*, const char* name, int value);
75 void GWN_batch_uniform_1b(Gwn_Batch*, const char* name, bool value);
76 void GWN_batch_uniform_1f(Gwn_Batch*, const char* name, float value);
77 void GWN_batch_uniform_2f(Gwn_Batch*, const char* name, float x, float y);
78 void GWN_batch_uniform_3f(Gwn_Batch*, const char* name, float x, float y, float z);
79 void GWN_batch_uniform_4f(Gwn_Batch*, const char* name, float x, float y, float z, float w);
80 void GWN_batch_uniform_3fv(Gwn_Batch*, const char* name, const float data[3]);
81 void GWN_batch_uniform_4fv(Gwn_Batch*, const char* name, const float data[4]);
82
83 void GWN_batch_draw(Gwn_Batch*);
84
85
86 // clement : temp stuff
87 void GWN_batch_draw_stupid(Gwn_Batch*);
88 void GWN_batch_draw_stupid_instanced(Gwn_Batch*, unsigned int instance_vbo, int instance_count,
89                                  int attrib_nbr, int attrib_stride, int attrib_loc[16], int attrib_size[16]);
90 void GWN_batch_draw_stupid_instanced_with_batch(Gwn_Batch*, Gwn_Batch*);
91
92
93
94
95
96 #if 0 // future plans
97
98 // Can multiple batches share a Gwn_VertBuf? Use ref count?
99
100
101 // We often need a batch with its own data, to be created and discarded together.
102 // WithOwn variants reduce number of system allocations.
103
104 typedef struct BatchWithOwnVertexBuffer {
105         Gwn_Batch batch;
106         Gwn_VertBuf verts; // link batch.verts to this
107 } BatchWithOwnVertexBuffer;
108
109 typedef struct BatchWithOwnElementList {
110         Gwn_Batch batch;
111         Gwn_IndexBuf elem; // link batch.elem to this
112 } BatchWithOwnElementList;
113
114 typedef struct BatchWithOwnVertexBufferAndElementList {
115         Gwn_Batch batch;
116         Gwn_IndexBuf elem; // link batch.elem to this
117         Gwn_VertBuf verts; // link batch.verts to this
118 } BatchWithOwnVertexBufferAndElementList;
119
120 Gwn_Batch* create_BatchWithOwnVertexBuffer(Gwn_PrimType, Gwn_VertFormat*, unsigned v_ct, Gwn_IndexBuf*);
121 Gwn_Batch* create_BatchWithOwnElementList(Gwn_PrimType, Gwn_VertBuf*, unsigned prim_ct);
122 Gwn_Batch* create_BatchWithOwnVertexBufferAndElementList(Gwn_PrimType, Gwn_VertFormat*, unsigned v_ct, unsigned prim_ct);
123 // verts: shared, own
124 // elem: none, shared, own
125 Gwn_Batch* create_BatchInGeneral(Gwn_PrimType, VertexBufferStuff, ElementListStuff);
126
127 #endif // future plans
128
129
130 /* Macros */
131
132 #define GWN_BATCH_DISCARD_SAFE(batch) do { \
133         if (batch != NULL) { \
134                 GWN_batch_discard(batch); \
135                 batch = NULL; \
136         } \
137 } while (0)