Gawain: remove GL enum from primitive API
[blender.git] / intern / gawain / gawain / 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 "vertex_buffer.h"
15 #include "element.h"
16
17 typedef enum {
18         READY_TO_FORMAT,
19         READY_TO_BUILD,
20         BUILDING,
21         READY_TO_DRAW
22 } BatchPhase;
23
24 #define BATCH_MAX_VBO_CT 3
25
26 typedef struct Batch {
27         // geometry
28         VertexBuffer* verts[BATCH_MAX_VBO_CT]; // verts[0] is required, others can be NULL
29         ElementList* elem; // NULL if element list not needed
30         PrimitiveType prim_type;
31         GLenum gl_prim_type;
32
33         // book-keeping
34         GLuint vao_id; // remembers all geometry state (vertex attrib bindings & element buffer)
35         BatchPhase phase;
36         bool program_dirty;
37         bool program_in_use;
38
39         // state
40         GLuint program;
41 } Batch;
42
43 Batch* Batch_create(PrimitiveType, VertexBuffer*, ElementList*);
44 void Batch_init(Batch*, PrimitiveType, VertexBuffer*, ElementList*);
45
46 void Batch_discard(Batch*); // verts & elem are not discarded
47 void Batch_discard_all(Batch*); // including verts & elem
48
49 int Batch_add_VertexBuffer(Batch*, VertexBuffer*);
50
51 void Batch_set_program(Batch*, GLuint program);
52 // Entire batch draws with one shader program, but can be redrawn later with another program.
53 // Vertex shader's inputs must be compatible with the batch's vertex format.
54
55 void Batch_use_program(Batch*); // call before Batch_Uniform (temp hack?)
56 void Batch_done_using_program(Batch*);
57
58 void Batch_Uniform1i(Batch*, const char* name, int value);
59 void Batch_Uniform1b(Batch*, const char* name, bool value);
60 void Batch_Uniform1f(Batch*, const char* name, float value);
61 void Batch_Uniform2f(Batch*, const char* name, float x, float y);
62 void Batch_Uniform3f(Batch*, const char* name, float x, float y, float z);
63 void Batch_Uniform4f(Batch*, const char* name, float x, float y, float z, float w);
64 void Batch_Uniform3fv(Batch*, const char* name, const float data[3]);
65 void Batch_Uniform4fv(Batch*, const char* name, const float data[4]);
66
67 void Batch_draw(Batch*);
68
69
70 // clement : temp stuff
71 void Batch_draw_stupid(Batch*);
72 void Batch_draw_stupid_instanced(Batch*, unsigned int instance_vbo, int instance_count,
73                                  int attrib_nbr, int attrib_stride, int attrib_loc[16], int attrib_size[16]);
74
75
76
77
78
79
80 #if 0 // future plans
81
82 // Can multiple batches share a VertexBuffer? Use ref count?
83
84
85 // We often need a batch with its own data, to be created and discarded together.
86 // WithOwn variants reduce number of system allocations.
87
88 typedef struct {
89         Batch batch;
90         VertexBuffer verts; // link batch.verts to this
91 } BatchWithOwnVertexBuffer;
92
93 typedef struct {
94         Batch batch;
95         ElementList elem; // link batch.elem to this
96 } BatchWithOwnElementList;
97
98 typedef struct {
99         Batch batch;
100         ElementList elem; // link batch.elem to this
101         VertexBuffer verts; // link batch.verts to this
102 } BatchWithOwnVertexBufferAndElementList;
103
104 Batch* create_BatchWithOwnVertexBuffer(PrimitiveType, VertexFormat*, unsigned v_ct, ElementList*);
105 Batch* create_BatchWithOwnElementList(PrimitiveType, VertexBuffer*, unsigned prim_ct);
106 Batch* create_BatchWithOwnVertexBufferAndElementList(PrimitiveType, VertexFormat*, unsigned v_ct, unsigned prim_ct);
107 // verts: shared, own
108 // elem: none, shared, own
109 Batch* create_BatchInGeneral(PrimitiveType, VertexBufferStuff, ElementListStuff);
110
111 #endif // future plans