#pragma once class FBufferedUniform1f { float mBuffer; int mIndex; public: void Init(GLuint hShader, const GLchar *name) { mIndex = glGetUniformLocation(hShader, name); mBuffer = 0; } void Set(float newvalue) { if (newvalue != mBuffer) { mBuffer = newvalue; glUniform1f(mIndex, newvalue); } } }; class FBufferedUniform2f { float mBuffer[2]; int mIndex; public: void Init(GLuint hShader, const GLchar *name) { mIndex = glGetUniformLocation(hShader, name); memset(mBuffer, 0, sizeof(mBuffer)); } void Set(const float *newvalue) { if (memcmp(newvalue, mBuffer, sizeof(mBuffer))) { memcpy(mBuffer, newvalue, sizeof(mBuffer)); glUniform2fv(mIndex, 1, newvalue); } } void Set(float f1, float f2) { if (mBuffer[0] != f1 || mBuffer[1] != f2) { mBuffer[0] = f1; mBuffer[1] = f2; glUniform2fv(mIndex, 1, mBuffer); } } }; class FBufferedUniform4f { float mBuffer[4]; int mIndex; public: void Init(GLuint hShader, const GLchar *name) { mIndex = glGetUniformLocation(hShader, name); memset(mBuffer, 0, sizeof(mBuffer)); } void Set(const float *newvalue) { if (memcmp(newvalue, mBuffer, sizeof(mBuffer))) { memcpy(mBuffer, newvalue, sizeof(mBuffer)); glUniform4fv(mIndex, 1, newvalue); } } }; class FUniformMatrix4f { int mIndex; public: void Init(GLuint hShader, const GLchar *name) { mIndex = glGetUniformLocation(hShader, name); } void Set(const float *newvalue) { glUniformMatrix4fv(mIndex, 1, false, newvalue); } };