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