33 class API_AUI_VIEWS Uniform {
35 const char* mUniformString;
38 static unsigned next();
41 explicit Uniform(
const char* uniformString) : mUniformString(uniformString), mId(next()) {}
43 const char* getUniformName()
const {
return mUniformString; }
45 unsigned getId()
const {
return mId; }
49 explicit Program(Program&& program)
noexcept {
50 operator=(std::move(program));
55 void loadVertexShader(
const AString& vertex,
bool raw);
56 void loadFragmentShader(
const AString& fragment,
bool raw);
57 void loadRaw(
const AString& vertex,
const AString& fragment);
59 void bindAttribute(uint32_t index,
const AString& name);
62 Program(
const Program&) =
delete;
64 uint32_t handle()
const {
return mProgram; }
66 int32_t getLocation(
const Uniform& uniform)
const;
68 void set(
const gl::Program::Uniform& uniform,
int value)
const;
69 void set(
const gl::Program::Uniform& uniform,
float value)
const;
70 void set(
const gl::Program::Uniform& uniform,
double value)
const;
71 void set(
const gl::Program::Uniform& uniform, glm::mat4 value)
const;
72 void set(
const gl::Program::Uniform& uniform, glm::mat3 value)
const;
73 void set(
const gl::Program::Uniform& uniform, glm::dmat4 value)
const;
74 void set(
const gl::Program::Uniform& uniform, glm::vec2 value)
const;
75 void set(
const gl::Program::Uniform& uniform, glm::vec3 value)
const;
76 void set(
const gl::Program::Uniform& uniform, glm::vec4 value)
const;
78 void setArray(
const gl::Program::Uniform& uniform, AArrayView<float> value)
const;
80 static gl::Program*& currentShader() {
81 static gl::Program*
c;
85 Program& operator=(Program&& program)
noexcept {
86 if (
this == &program) {
89 mProgram = std::exchange(program.mProgram, 0);
90 mUniforms = std::exchange(program.mUniforms, {});
91 mVertex = std::exchange(program.mVertex, 0);
92 mFragment = std::exchange(program.mFragment, 0);
100 uint32_t mFragment = 0;
102 struct UniformCache {
103 int32_t
id = UniformState::UNINITIALIZED;
104 using Value = std::variant<
105 std::nullopt_t, int, float, double, glm::vec2, glm::vec3, glm::vec4, glm::mat3, glm::mat4, glm::dmat4>;
106 Value lastValue = std::nullopt;
108 mutable std::array<UniformCache, 64> mUniforms;
112 enum Value { UNINITIALIZED = -2, DOES_NOT_EXIST = -1 };
115 template <
typename T>
116 inline bool sameAsCache(
const gl::Program::Uniform& uniform, T value)
const {
117 if (
auto p = std::get_if<T>(&mUniforms[uniform.getId()].lastValue)) {
122 uint32_t load(
const AString& code, uint32_t type,
bool raw) {
125 uint32_t load(std::string code, uint32_t type,
bool raw);