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)
{
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<float> > 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;

View File

@ -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<float> > 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;

View File

@ -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<float> > 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,