61bdd05d5e049e23dd9e368302cb729a2ddbb8c0
[blender.git] / intern / gawain / gawain / gwn_shader_interface.h
1
2 // Gawain shader interface (C --> GLSL)
3 //
4 // This code is part of the Gawain library, with modifications
5 // specific to integration with Blender.
6 //
7 // Copyright 2017 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_common.h"
15
16 typedef enum {
17         GWN_UNIFORM_NONE, // uninitialized/unknown
18
19         GWN_UNIFORM_MODELVIEW,  // mat4 ModelViewMatrix
20         GWN_UNIFORM_PROJECTION, // mat4 ProjectionMatrix
21         GWN_UNIFORM_MVP,        // mat4 ModelViewProjectionMatrix
22
23         GWN_UNIFORM_MODELVIEW_INV,  // mat4 ModelViewInverseMatrix
24         GWN_UNIFORM_PROJECTION_INV, // mat4 ProjectionInverseMatrix
25
26         GWN_UNIFORM_NORMAL,     // mat3 NormalMatrix
27
28         GWN_UNIFORM_COLOR, // vec4 color
29
30         GWN_UNIFORM_CUSTOM // custom uniform, not one of the above built-ins
31 } Gwn_UniformBuiltin;
32
33 typedef struct {
34         const char* name;
35         unsigned name_hash;
36         GLenum gl_type;
37         Gwn_UniformBuiltin builtin_type; // only for uniform inputs
38         GLint size;
39         GLint location;
40 } Gwn_ShaderInput;
41
42 typedef struct {
43         uint16_t uniform_ct;
44         uint16_t attrib_ct;
45         Gwn_ShaderInput inputs[0]; // dynamic size, uniforms followed by attribs
46 } Gwn_ShaderInterface;
47
48 Gwn_ShaderInterface* GWN_shaderinterface_create(GLint program_id);
49 void GWN_shaderinterface_discard(Gwn_ShaderInterface*);
50
51 const Gwn_ShaderInput* GWN_shaderinterface_uniform(const Gwn_ShaderInterface*, const char* name);
52 const Gwn_ShaderInput* GWN_shaderinterface_uniform_builtin(const Gwn_ShaderInterface*, Gwn_UniformBuiltin);
53 const Gwn_ShaderInput* GWN_shaderinterface_attr(const Gwn_ShaderInterface*, const char* name);