diff --git a/src/debug/quad.cpp b/src/debug/quad.cpp index c8f79594..52b5129c 100644 --- a/src/debug/quad.cpp +++ b/src/debug/quad.cpp @@ -190,6 +190,9 @@ void DebugQuad::TickDraw(float deltams) colors[i * 3 + 2] = p.z; } + /* Our default quad color */ + vec4 orange(0.8f, 0.5f, 0.2f, 1.0f); + /* Cheap iterators */ #if !defined __CELLOS_LV2__ && !defined ANDROID_NDK GLuint *array = data->array; @@ -207,7 +210,7 @@ void DebugQuad::TickDraw(float deltams) * Renders an orange square. */ #if defined HAVE_GLBEGIN || defined USE_GLEW - glColor3f(0.8f, 0.5f, 0.2f); + glColor3f(orange.x, orange.y, orange.z); glBegin(GL_TRIANGLES); glVertex3f(data->aa.x, data->bb.y, 0.0f); glVertex3f(data->bb.x, data->bb.y, 0.0f); @@ -428,7 +431,7 @@ void DebugQuad::TickDraw(float deltams) * Renders an orange square. */ #if !defined ANDROID_NDK - glColor4f(0.8f, 0.5f, 0.2f, 1.0f); + glColor4f(orange.x, orange.y, orange.z, orange.w); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); @@ -574,12 +577,8 @@ void DebugQuad::TickDraw(float deltams) uni[0] = shader[0]->GetUniformLocation("in_Color"); } shader[0]->Bind(); + shader[0]->SetUniform(uni[0], orange); shader++; -#if !defined __CELLOS_LV2__ - glUniform4f(uni[0], 0.8f, 0.5f, 0.2f, 1.0f); -#else - cgGLSetParameter4f((CGparameter)(intptr_t)uni[0], 0.8f, 0.5f, 0.2f, 1.0f); -#endif uni++; glEnableClientState(GL_VERTEX_ARRAY); @@ -691,12 +690,8 @@ void DebugQuad::TickDraw(float deltams) uni[0] = shader[0]->GetUniformLocation("in_Matrix"); } shader[0]->Bind(); + shader[0]->SetUniform(uni[0], t2); shader++; -#if !defined __CELLOS_LV2__ - glUniformMatrix4fv(uni[0], 1, GL_FALSE, &t2[0][0]); -#else - cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni[0], &t2[0][0]); -#endif uni++; glEnableClientState(GL_VERTEX_ARRAY); diff --git a/src/scene.cpp b/src/scene.cpp index cb8594cf..27ad9495 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -266,24 +266,17 @@ void Scene::Render() // XXX: rename to Blit() stdshader->Bind(); -#if !defined __CELLOS_LV2__ uni_mat = stdshader->GetUniformLocation("proj_matrix"); - glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &Video::GetProjMatrix()[0][0]); + stdshader->SetUniform(uni_mat, Video::GetProjMatrix()); uni_mat = stdshader->GetUniformLocation("view_matrix"); - glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &Video::GetViewMatrix()[0][0]); + stdshader->SetUniform(uni_mat, Video::GetViewMatrix()); uni_mat = stdshader->GetUniformLocation("model_matrix"); - glUniformMatrix4fv(uni_mat, 1, GL_FALSE, &data->model_matrix[0][0]); + stdshader->SetUniform(uni_mat, data->model_matrix); +#if !defined __CELLOS_LV2__ uni_tex = stdshader->GetUniformLocation("in_Texture"); glUniform1i(uni_tex, 0); #else - uni_mat = stdshader->GetUniformLocation("proj_matrix"); - cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &Video::GetProjMatrix()[0][0]); - uni_mat = stdshader->GetUniformLocation("view_matrix"); - cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &Video::GetViewMatrix()[0][0]); - uni_mat = stdshader->GetUniformLocation("model_matrix"); - cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni_mat, &data->model_matrix[0][0]); - // WTF? this doesn't exist //uni_tex = stdshader->GetUniformLocation("in_Texture"); //cgGLSetParameter1i((CGparameter)(intptr_t)uni_tex, 0); diff --git a/src/shader/shader.cpp b/src/shader/shader.cpp index 73e5016d..7b6e3173 100644 --- a/src/shader/shader.cpp +++ b/src/shader/shader.cpp @@ -186,6 +186,52 @@ int Shader::GetUniformLocation(char const *uni) const #endif } +void Shader::SetUniform(int uni, float f) +{ +#if !defined __CELLOS_LV2__ + glUniform1f(uni, f); +#else + cgGLSetParameter1f((CGparameter)(intptr_t)uni, f); +#endif +} + +void Shader::SetUniform(int uni, vec2 const &v) +{ +#if !defined __CELLOS_LV2__ + glUniform2f(uni, v.x, v.y); +#else + cgGLSetParameter2f((CGparameter)(intptr_t)uni, v.x, v.y); +#endif +} + +void Shader::SetUniform(int uni, vec3 const &v) +{ +#if !defined __CELLOS_LV2__ + glUniform3f(uni, v.x, v.y, v.z); +#else + cgGLSetParameter3f((CGparameter)(intptr_t)uni, v.x, v.y, v.z); +#endif +} + +void Shader::SetUniform(int uni, vec4 const &v) +{ + /* FIXME: use the array versions of these functions */ +#if !defined __CELLOS_LV2__ + glUniform4f(uni, v.x, v.y, v.z, v.w); +#else + cgGLSetParameter4f((CGparameter)(intptr_t)uni, v.x, v.y, v.z, v.w); +#endif +} + +void Shader::SetUniform(int uni, mat4 const &m) +{ +#if !defined __CELLOS_LV2__ + glUniformMatrix4fv(uni, 1, GL_FALSE, &m[0][0]); +#else + cgGLSetMatrixParameterfc((CGparameter)(intptr_t)uni, &m[0][0]); +#endif +} + void Shader::Bind() const { #if !defined __CELLOS_LV2__ diff --git a/src/shader/shader.h b/src/shader/shader.h index 4a46b1c7..5e1b39ed 100644 --- a/src/shader/shader.h +++ b/src/shader/shader.h @@ -28,7 +28,13 @@ public: static void Destroy(Shader *shader); int GetAttribLocation(char const *attr) const; + int GetUniformLocation(char const *uni) const; + void SetUniform(int uni, float f); + void SetUniform(int uni, vec2 const &v); + void SetUniform(int uni, vec3 const &v); + void SetUniform(int uni, vec4 const &v); + void SetUniform(int uni, mat4 const &m); void Bind() const;