v0.3.0 API Reference
GLSLProgram.h
1//
2// GLSLProgram.h
3// avara3d
4//
5// Created by Morgan Davis on 12/23/16.
6// Copyright © 2026 Morgan K Davis. All rights reserved.
7//
8// Based largely on code from "OpenGL 4 Shading Language Cookbook" by David Wolff
9//
10
11#ifndef AVARA3D_RENDER_BACKEND_OPENGL_GLSLPROGRAM_H
12#define AVARA3D_RENDER_BACKEND_OPENGL_GLSLPROGRAM_H
13
14#include <map>
15#include <memory>
16#include <optional>
17#include <string>
18#include <unordered_map>
19
20#include "a3d/Math.h"
21#include "a3d/render/backend/ShaderType.h"
22#include "a3d/render/backend/opengl/GLTypes.h"
23
24namespace a3d {
25
26class GLSLProgram {
27
28public:
29 // [Internal Lifecycle Functions]
30
31 explicit GLSLProgram(const std::string& name);
32
33 GLSLProgram(const GLSLProgram&) = delete;
34 GLSLProgram& operator=(const GLSLProgram&) = delete;
35
36 GLSLProgram(GLSLProgram&&) = delete;
37 GLSLProgram& operator=(GLSLProgram&&) = delete;
38
39 ~GLSLProgram();
40
41 // [Internal Member Functions]
42
43 bool compile();
44 bool link();
45 bool validate();
46 void use();
47 void unuse();
48
49 void bindAttributeLocation(unsigned location, const char* name);
50
51 void setUniform(const char* name, float x, float y, float z);
52 void setUniform(const char* name, const math::vec2& v);
53 void setUniform(const char* name, const math::vec3& v);
54 void setUniform(const char* name, const math::vec4& v);
55 void setUniform(const char* name, const math::mat3& m);
56 void setUniform(const char* name, const math::mat4& m);
57 void setUniform(const char* name, bool val);
58 void setUniform(const char* name, int val);
59 void setUniform(const char* name, unsigned val);
60 void setUniform(const char* name, float val);
61
62 // void bindUniformBlock(const char* name, unsigned location);
63 void setUniformBlockBinding(const char* blockName, unsigned bindingPoint);
64
65 void bindTexture(const char* name,
66 const int& target,
67 const unsigned& slot,
68 const unsigned& textureID,
69 unsigned index);
70
71 unsigned getAttributeLocation(const char* name) const;
72
73 const std::string& name() const;
74 gl::uint_t glID();
75 bool isLinked() const;
76
77private:
78 // [Private Member Functions]
79
80 std::optional<std::string> shaderSource(const std::string& name, ShaderType type);
81 void prepare();
82 bool compile(const std::string& source, ShaderType type);
83 int getUniformLocation(const char* name);
84 void glID(unsigned glID);
85 void isLinked(bool isLinked);
86
87 // [Private Member Variables]
88
89 std::string _name;
90 unsigned _glID;
91 bool _isLinked;
92 std::optional<std::string> _logString;
93 std::string _vertexShaderSource;
94 std::string _fragmentShaderSource;
95 std::unordered_map<std::string, int> _uniformLocationCache;
96};
97
98} // namespace a3d
99
100#endif // AVARA3D_RENDER_BACKEND_OPENGL_GLSLPROGRAM_H