pass Engine ref to Engine::Object for accessing program data

This commit is contained in:
Josh Holtrop 2011-05-25 16:08:02 -04:00
parent be307c2c32
commit 9fc482dbcc
3 changed files with 35 additions and 28 deletions

View File

@ -356,7 +356,7 @@ int Engine::addObject(WFObj * obj, bool is_static, bool is_reference,
bool enable_blending, float scale) bool enable_blending, float scale)
{ {
Object * o = new Object(is_static, is_reference, enable_blending, 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); int id = m_objects.add(o);
o->setID(id); o->setID(id);
return 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<float> > args) OdeWorld::GeomType geom_type, refptr< vector<float> > args)
{ {
Object * o = new Object(is_static, is_reference, enable_blending, 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); int id = m_objects.add(o);
o->setID(id); o->setID(id);
return id; return id;

View File

@ -23,10 +23,11 @@ class Engine
{ {
public: public:
Object(bool is_static, bool is_reference, bool enable_blending, Object(bool is_static, bool is_reference, bool enable_blending,
OdeWorld & world, WFObj * wfobj, OdeWorld & world, Engine & e, WFObj * wfobj,
float scale = 1.0f); float scale = 1.0f);
Object(bool is_static, bool is_reference, bool enable_blending, 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<float> > args); refptr< std::vector<float> > args);
Object(const Object & orig); Object(const Object & orig);
~Object(); ~Object();
@ -102,6 +103,7 @@ class Engine
void createManagedObject(); void createManagedObject();
void render(); void render();
Engine & m_engine;
OdeWorld::Object * m_ode_object; OdeWorld::Object * m_ode_object;
GLuint m_display_list; GLuint m_display_list;
bool m_is_visible; bool m_is_visible;

View File

@ -27,8 +27,8 @@ static void checkGLErrorLine(const char * function, int line)
/* used for objects loaded directly from model files */ /* used for objects loaded directly from model files */
Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending,
OdeWorld & world, WFObj * obj, float scale) OdeWorld & world, Engine & e, WFObj * obj, float scale)
: m_world(world) : m_engine(e), m_world(world)
{ {
m_is_reference = is_reference; m_is_reference = is_reference;
if (m_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 */ /* used for "managed" objects with one geom */
Engine::Object::Object(bool is_static, bool is_reference, bool enable_blending, 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<float> > args) refptr< std::vector<float> > args)
: m_world(world) : m_engine(e), m_world(world)
{ {
m_is_reference = is_reference; m_is_reference = is_reference;
m_enable_blending = enable_blending; 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 */ /* used to clone objects */
Engine::Object::Object(const Engine::Object & orig) 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_reference = false;
m_is_visible = orig.m_is_visible; m_is_visible = orig.m_is_visible;
@ -525,7 +526,7 @@ void Engine::Object::draw()
} }
else else
{ {
GLuint program = m_programs[PROG_OBJ]; GLuint program = m_engine.m_programs[PROG_OBJ];
glUseProgram(program); glUseProgram(program);
glEnableVertexAttribArray(ATTRIBUTE_OBJ_POS); glEnableVertexAttribArray(ATTRIBUTE_OBJ_POS);
glEnableVertexAttribArray(ATTRIBUTE_OBJ_NORMAL); glEnableVertexAttribArray(ATTRIBUTE_OBJ_NORMAL);
@ -548,56 +549,60 @@ void Engine::Object::draw()
WFObj::Material & m = it->second; WFObj::Material & m = it->second;
if (m.flags & WFObj::Material::TEXTURE_BIT) 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); glUseProgram(program);
glEnableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD); glEnableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD);
} }
} }
else 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); glUseProgram(program);
glDisableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD); glDisableVertexAttribArray(ATTRIBUTE_OBJ_TEX_TEX_COORD);
} }
} }
if (m.flags & WFObj::Material::SHININESS_BIT) if (m.flags & WFObj::Material::SHININESS_BIT)
{ {
if (program == m_programs[PROG_OBJ_TEX]) if (program == m_engine.m_programs[PROG_OBJ_TEX])
glUniform1f( glUniform1f(m_engine.m_uniforms_obj_tex[
m_uniforms_obj_tex[UNIFORM_OBJ_TEX_SHININESS], UNIFORM_OBJ_TEX_SHININESS],
m.shininess); m.shininess);
else else
glUniform1f(m_uniforms_obj[UNIFORM_OBJ_SHININESS], glUniform1f(m_engine.m_uniforms_obj[
UNIFORM_OBJ_SHININESS],
m.shininess); m.shininess);
} }
if (m.flags & WFObj::Material::AMBIENT_BIT) if (m.flags & WFObj::Material::AMBIENT_BIT)
{ {
if (program == m_programs[PROG_OBJ_TEX]) if (program == m_engine.m_programs[PROG_OBJ_TEX])
glUniform4fv( glUniform4fv(m_engine.m_uniforms_obj_tex[
m_uniforms_obj_tex[UNIFORM_OBJ_TEX_AMBIENT], UNIFORM_OBJ_TEX_AMBIENT],
1, &m.ambient[0]); 1, &m.ambient[0]);
else else
glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_AMBIENT], glUniform4fv(m_engine.m_uniforms_obj[
UNIFORM_OBJ_AMBIENT],
1, &m.ambient[0]); 1, &m.ambient[0]);
} }
if (m.flags & WFObj::Material::DIFFUSE_BIT) if (m.flags & WFObj::Material::DIFFUSE_BIT)
{ {
if (program != m_programs[PROG_OBJ_TEX]) if (program != m_engine.m_programs[PROG_OBJ_TEX])
glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_DIFFUSE], glUniform4fv(m_engine.m_uniforms_obj[
UNIFORM_OBJ_DIFFUSE],
1, &m.diffuse[0]); 1, &m.diffuse[0]);
} }
if (m.flags & WFObj::Material::SPECULAR_BIT) if (m.flags & WFObj::Material::SPECULAR_BIT)
{ {
if (program == m_programs[PROG_OBJ_TEX]) if (program == m_engine.m_programs[PROG_OBJ_TEX])
glUniform4fv( glUniform4fv(m_engine.m_uniforms_obj_tex[
m_uniforms_obj_tex[UNIFORM_OBJ_TEX_SPECULAR], UNIFORM_OBJ_TEX_SPECULAR],
1, &m.specular[0]); 1, &m.specular[0]);
else else
glUniform4fv(m_uniforms_obj[UNIFORM_OBJ_SPECULAR], glUniform4fv(m_engine.m_uniforms_obj[
UNIFORM_OBJ_SPECULAR],
1, &m.specular[0]); 1, &m.specular[0]);
} }
glDrawElements(GL_TRIANGLES, m.num_vertices, glDrawElements(GL_TRIANGLES, m.num_vertices,