Avara3D 0.2.0
C++ 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
25 class GLSLProgram {
26
27 public:
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,
62// 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
77 private:
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 };
96
97}
98
99#endif // AVARA3D_RENDER_BACKEND_OPENGL_GLSLPROGRAM_H