diff --git a/src/dlangui/graphics/glsupport.d b/src/dlangui/graphics/glsupport.d index 4b61a6ef..90b1247c 100644 --- a/src/dlangui/graphics/glsupport.d +++ b/src/dlangui/graphics/glsupport.d @@ -263,21 +263,46 @@ class GLProgram : GraphicsEffect { currentProgram = 0; } + protected int[string] _uniformLocations; + protected int[string] _attribLocations; + /// get uniform location from program, returns -1 if location is not found int getUniformLocation(string variableName) { + if (auto p = variableName in _uniformLocations) + return *p; int res = checkgl!glGetUniformLocation(program, variableName.toStringz); if (res == -1) Log.e("glGetUniformLocation failed for " ~ variableName); + _uniformLocations[variableName] = res; return res; } /// get attribute location from program, returns -1 if location is not found int getAttribLocation(string variableName) { + if (auto p = variableName in _attribLocations) + return *p; int res = checkgl!glGetAttribLocation(program, variableName.toStringz); if (res == -1) Log.e("glGetAttribLocation failed for " ~ variableName); + _attribLocations[variableName] = res; return res; } + + override void setUniform(string uniformName, mat4 matrix) { + checkgl!glUniformMatrix4fv(getUniformLocation(uniformName), 1, false, matrix.m.ptr); + } + + override void setUniform(string uniformName, vec2 vec) { + checkgl!glUniform2fv(getAttribLocation(uniformName), 1, vec.vec.ptr); + } + + override void setUniform(string uniformName, vec3 vec) { + checkgl!glUniform3fv(getAttribLocation(uniformName), 1, vec.vec.ptr); + } + + override void setUniform(string uniformName, vec4 vec) { + checkgl!glUniform4fv(getAttribLocation(uniformName), 1, vec.vec.ptr); + } } class SolidFillProgram : GLProgram { diff --git a/src/dlangui/graphics/scene/mesh.d b/src/dlangui/graphics/scene/mesh.d index 7cbbf1bb..108d329e 100644 --- a/src/dlangui/graphics/scene/mesh.d +++ b/src/dlangui/graphics/scene/mesh.d @@ -45,11 +45,17 @@ class VertexBuffer { enum VERTEX_ELEMENT_NOT_FOUND = -1; /// Base class for graphics effect / program - e.g. for OpenGL shader program -class GraphicsEffect { +abstract class GraphicsEffect { /// get location for vertex attribute - int getVertexElementLocation(VertexElementType type) { - return VERTEX_ELEMENT_NOT_FOUND; - } + int getVertexElementLocation(VertexElementType type); + + void setUniform(string uniformName, mat4 matrix); + + void setUniform(string uniformName, vec2 vec); + + void setUniform(string uniformName, vec3 vec); + + void setUniform(string uniformName, vec4 vec); } /// vertex attribute properties