diff --git a/src/Engine.cc b/src/Engine.cc index 50d2dc2..c68cab2 100644 --- a/src/Engine.cc +++ b/src/Engine.cc @@ -356,7 +356,7 @@ int Engine::addObject(WFObj * obj, bool is_static, bool is_reference, bool enable_blending, float scale) { Object * o = new Object(is_static, is_reference, enable_blending, - m_world, obj, scale); + m_world, *this, obj, scale); int id = m_objects.add(o); o->setID(id); return id; @@ -366,7 +366,7 @@ int Engine::addObject(bool is_static, bool is_reference, bool enable_blending, OdeWorld::GeomType geom_type, refptr< vector > args) { Object * o = new Object(is_static, is_reference, enable_blending, - m_world, geom_type, args); + m_world, *this, geom_type, args); int id = m_objects.add(o); o->setID(id); return id; diff --git a/src/Engine.h b/src/Engine.h index fdf40b9..7776f2f 100644 --- a/src/Engine.h +++ b/src/Engine.h @@ -23,10 +23,11 @@ class Engine { public: Object(bool is_static, bool is_reference, bool enable_blending, - OdeWorld & world, WFObj * wfobj, + OdeWorld & world, Engine & e, WFObj * wfobj, float scale = 1.0f); Object(bool is_static, bool is_reference, bool enable_blending, - OdeWorld & world, OdeWorld::GeomType geom_type, + OdeWorld & world, Engine & e, + OdeWorld::GeomType geom_type, refptr< std::vector > args); Object(const Object & orig); ~Object(); @@ -102,6 +103,7 @@ class Engine void createManagedObject(); void render(); + Engine & m_engine; OdeWorld::Object * m_ode_object; GLuint m_display_list; bool m_is_visible; diff --git a/src/Engine_Object.cc b/src/Engine_Object.cc index b5face4..b15f5a3 100644 --- a/src/Engine_Object.cc +++ b/src/Engine_Object.cc @@ -27,8 +27,8 @@ static void checkGLErrorLine(const char * function, int line) /* used for objects loaded directly from model files */ Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, - OdeWorld & world, WFObj * obj, float scale) - : m_world(world) + OdeWorld & world, Engine & e, WFObj * obj, float scale) + : m_engine(e), m_world(world) { m_is_reference = is_reference; if (m_is_reference) @@ -60,9 +60,10 @@ Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, /* used for "managed" objects with one geom */ Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, - OdeWorld & world, OdeWorld::GeomType geom_type, + OdeWorld & world, Engine & e, + OdeWorld::GeomType geom_type, refptr< std::vector > args) - : m_world(world) + : m_engine(e), m_world(world) { m_is_reference = is_reference; m_enable_blending = enable_blending; @@ -98,7 +99,7 @@ Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, /* used to clone objects */ Engine::Object::Object(const Engine::Object & orig) - : m_world(orig.m_world) + : m_engine(orig.m_engine), m_world(orig.m_world) { m_is_reference = false; m_is_visible = orig.m_is_visible; @@ -525,7 +526,7 @@ void Engine::Object::draw() } else { - GLuint program = m_programs[PROG_OBJ]; + GLuint program = m_engine.m_programs[PROG_OBJ]; glUseProgram(program); glEnableVertexAttribArray(ATTRIBUTE_OBJ_POS); glEnableVertexAttribArray(ATTRIBUTE_OBJ_NORMAL); @@ -548,56 +549,60 @@ void Engine::Object::draw() WFObj::Material & m = it->second; if (m.flags & WFObj::Material::TEXTURE_BIT) { - if (program != m_programs[PROG_OBJ_TEX]) + if (program != m_engine.m_programs[PROG_OBJ_TEX]) { - program = m_programs[PROG_OBJ_TEX]; + program = m_engine.m_programs[PROG_OBJ_TEX]; glUseProgram(program); glEnableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD); } } else { - if (program != m_programs[PROG_OBJ]) + if (program != m_engine.m_programs[PROG_OBJ]) { - program = m_programs[PROG_OBJ]; + program = m_engine.m_programs[PROG_OBJ]; glUseProgram(program); glDisableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD); } } if (m.flags & WFObj::Material::SHININESS_BIT) { - if (program == m_programs[PROG_OBJ_TEX]) - glUniform1f( - m_uniforms_obj_tex[UNIFORM_OBJ_TEX_SHININESS], + if (program == m_engine.m_programs[PROG_OBJ_TEX]) + glUniform1f(m_engine.m_uniforms_obj_tex[ + UNIFORM_OBJ_TEX_SHININESS], m.shininess); else - glUniform1f(m_uniforms_obj[UNIFORM_OBJ_SHININESS], + glUniform1f(m_engine.m_uniforms_obj[ + UNIFORM_OBJ_SHININESS], m.shininess); } if (m.flags & WFObj::Material::AMBIENT_BIT) { - if (program == m_programs[PROG_OBJ_TEX]) - glUniform4fv( - m_uniforms_obj_tex[UNIFORM_OBJ_TEX_AMBIENT], + if (program == m_engine.m_programs[PROG_OBJ_TEX]) + glUniform4fv(m_engine.m_uniforms_obj_tex[ + UNIFORM_OBJ_TEX_AMBIENT], 1, &m.ambient[0]); else - glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_AMBIENT], + glUniform4fv(m_engine.m_uniforms_obj[ + UNIFORM_OBJ_AMBIENT], 1, &m.ambient[0]); } if (m.flags & WFObj::Material::DIFFUSE_BIT) { - if (program != m_programs[PROG_OBJ_TEX]) - glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_DIFFUSE], + if (program != m_engine.m_programs[PROG_OBJ_TEX]) + glUniform4fv(m_engine.m_uniforms_obj[ + UNIFORM_OBJ_DIFFUSE], 1, &m.diffuse[0]); } if (m.flags & WFObj::Material::SPECULAR_BIT) { - if (program == m_programs[PROG_OBJ_TEX]) - glUniform4fv( - m_uniforms_obj_tex[UNIFORM_OBJ_TEX_SPECULAR], + if (program == m_engine.m_programs[PROG_OBJ_TEX]) + glUniform4fv(m_engine.m_uniforms_obj_tex[ + UNIFORM_OBJ_TEX_SPECULAR], 1, &m.specular[0]); else - glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_SPECULAR], + glUniform4fv(m_engine.m_uniforms_obj[ + UNIFORM_OBJ_SPECULAR], 1, &m.specular[0]); } glDrawElements(GL_TRIANGLES, m.num_vertices,