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
19#include "a3d/Math.h"
20#include "a3d/render/backend/ShaderType.h"
21#include "a3d/render/backend/opengl/GLTypes.h"
22
23namespace a3d {
24
25class GLSLProgram {
26
27public:
28 // [Internal Lifecycle Functions]
29
30 explicit GLSLProgram(const std::string& name);
31
32 GLSLProgram(const GLSLProgram&) = delete;
33 GLSLProgram& operator=(const GLSLProgram&) = delete;
34
35 GLSLProgram(GLSLProgram&&) = delete;
36 GLSLProgram& operator=(GLSLProgram&&) = delete;
37
38 ~GLSLProgram();
39
40 // [Internal Member Functions]
41
42 bool compile();
43 bool link();
44 bool validate();
45 void use();
46 void unuse();
47
48 void bindAttributeLocation(unsigned location, const char* name);
49
50 void setUniform(const char* name, float x, float y, float z);
51 void setUniform(const char* name, const math::vec2& v);
52 void setUniform(const char* name, const math::vec3& v);
53 void setUniform(const char* name, const math::vec4& v);
54 void setUniform(const char* name, const math::mat3& m);
55 void setUniform(const char* name, const math::mat4& m);
56 void setUniform(const char* name, bool val);
57 void setUniform(const char* name, int val);
58 void setUniform(const char* name, unsigned val);
59 void setUniform(const char* name, float val);
60
61 // void bindUniformBlock(const char* name, unsigned location);
62 void setUniformBlockBinding(const char* blockName, unsigned bindingPoint);
63
64 void bindTexture(const char* name,
65 const int& target,
66 const unsigned& slot,
67 const unsigned& textureID,
68 unsigned index);
69
70 unsigned getAttributeLocation(const char* name) const;
71
72 const std::string& name() const;
73 gl::uint_t glID();
74 bool isLinked() const;
75
76private:
77 // [Private Member Functions]
78
79 std::optional<std::string> shaderSource(const std::string& name, ShaderType type);
80 void prepare();
81 bool compile(const std::string& source, ShaderType type);
82 int getUniformLocation(const char* name);
83 void glID(unsigned glID);
84 void isLinked(bool isLinked);
85
86 // [Private Member Variables]
87
88 std::string _name;
89 unsigned _glID;
90 bool _isLinked;
91 std::optional<std::string> _logString;
92 std::string _vertexShaderSource;
93 std::string _fragmentShaderSource;
94};
95
96} // namespace a3d
97
98#endif // AVARA3D_RENDER_BACKEND_OPENGL_GLSLPROGRAM_H