diff --git a/src/easymesh/easymesh.cpp b/src/easymesh/easymesh.cpp index 199621b5..4d864419 100644 --- a/src/easymesh/easymesh.cpp +++ b/src/easymesh/easymesh.cpp @@ -107,6 +107,7 @@ DefaultShaderData::DefaultShaderData(DebugRenderMode render_mode) m_vert_decl_flags |= (1 << VertexUsage::TexCoord); with_UV = true; } + StoreUniformNames(); SetupDefaultData(with_UV); } @@ -114,19 +115,27 @@ DefaultShaderData::DefaultShaderData(DebugRenderMode render_mode) DefaultShaderData::DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, bool with_UV) : GpuShaderData(vert_decl_flags, shader, DebugRenderMode::Default) { + StoreUniformNames(); SetupDefaultData(with_UV); } +//----------------------------------------------------------------------------- +void DefaultShaderData::StoreUniformNames() +{ + m_uniform_names << String("u_Lights"); + m_uniform_names << String("in_ModelView"); + m_uniform_names << String("in_View"); + m_uniform_names << String("in_Inv_View"); + m_uniform_names << String("in_Proj"); + m_uniform_names << String("in_NormalMat"); + m_uniform_names << String("in_Damage"); +} + //----------------------------------------------------------------------------- void DefaultShaderData::SetupDefaultData(bool with_UV) { - AddUniform("in_ModelView"); - AddUniform("in_View"); - AddUniform("in_Inv_View"); - AddUniform("in_Proj"); - AddUniform("in_NormalMat"); - AddUniform("in_Damage"); - AddUniform("u_Lights"); + for (int i = 0; i < m_uniform_names.Count(); i++) + AddUniform(m_uniform_names[i].C()); } //----------------------------------------------------------------------------- @@ -136,26 +145,27 @@ void DefaultShaderData::SetupShaderDatas(mat4 const &model) mat4 view = g_scene->GetCamera()->GetView(); mat4 modelview = view * model; mat3 normalmat = transpose(inverse(mat3(modelview))); - /* FIXME: this should be hidden in the shader */ + Array const &lights = g_scene->GetLights(); + Array light_data; + //This is not very nice, but necessary for emscripten WebGL generation. + float f = 0.f; + int i = 0; + /* FIXME: the 4th component of the position can be used for other things */ /* FIXME: GetUniform("blabla") is costly */ - Array const lights = g_scene->GetLights(); - Array light_data; for (int i = 0; i < lights.Count(); ++i) light_data << lights[i]->GetPosition() << lights[i]->GetColor(); while (light_data.Count() < 8) light_data << vec4::zero << vec4::zero; - m_shader->SetUniform(*GetUniform("u_Lights"), light_data); - - m_shader->SetUniform(*GetUniform("in_ModelView"), modelview); - m_shader->SetUniform(*GetUniform("in_View"), view); - m_shader->SetUniform(*GetUniform("in_Inv_View"), inverse(view)); - m_shader->SetUniform(*GetUniform("in_Proj"), proj); - m_shader->SetUniform(*GetUniform("in_NormalMat"), normalmat); - //This is not very nice, but necessary for emscripten WebGL generation. - float f = 0.f; - m_shader->SetUniform(*GetUniform("in_Damage"), f); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), light_data); + + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), modelview); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), view); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), inverse(view)); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), proj); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), normalmat); + m_shader->SetUniform(*GetUniform(m_uniform_names[i++].C()), f); } //----------------------------------------------------------------------------- diff --git a/src/easymesh/easymesh.h b/src/easymesh/easymesh.h index f19b6941..4a157af2 100644 --- a/src/easymesh/easymesh.h +++ b/src/easymesh/easymesh.h @@ -102,9 +102,12 @@ public: DefaultShaderData(DebugRenderMode render_mode); DefaultShaderData(uint16_t vert_decl_flags, Shader* shader, bool with_UV); virtual ~DefaultShaderData() {} + void StoreUniformNames(); //--- void SetupDefaultData(bool with_UV); virtual void SetupShaderDatas(mat4 const &model); + //-- + Array m_uniform_names; }; class GpuEasyMeshData