pass Engine ref to Engine::Object for accessing program data
This commit is contained in:
parent
be307c2c32
commit
9fc482dbcc
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user