fix BGE bug #8869: Added objects are not lit correctly

The current layer information is now stored in KX_GameObject and inherited from the parent object when dynamically added. This information is used during the rendering the select the lamps. As the selected lamps are always coming from active layers, their position and orientation are correct.
This commit is contained in:
Benoit Bolsee 2008-04-30 19:58:44 +00:00
parent 93ba2dd6a1
commit 3a430c33d2
8 changed files with 54 additions and 7 deletions

@ -91,6 +91,10 @@ int KX_BlenderRenderTools::ProcessLighting(int layer)
{ {
if (m_clientobject) if (m_clientobject)
{ {
if (layer == RAS_LIGHT_OBJECT_LAYER)
{
layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
}
if (applyLights(layer)) if (applyLights(layer))
{ {
EnableOpenGLLights(); EnableOpenGLLights();

@ -1680,8 +1680,11 @@ static KX_GameObject *gameobject_from_blenderobject(
break; break;
} }
} }
if (gameobj) if (gameobj)
{
gameobj->SetPhysicsEnvironment(kxscene->GetPhysicsEnvironment()); gameobj->SetPhysicsEnvironment(kxscene->GetPhysicsEnvironment());
gameobj->SetLayer(ob->lay);
}
return gameobj; return gameobj;
} }

@ -137,6 +137,10 @@ int GPC_RenderTools::ProcessLighting(int layer)
{ {
if (m_clientobject) if (m_clientobject)
{ {
if (layer == RAS_LIGHT_OBJECT_LAYER)
{
layer = static_cast<KX_GameObject*>(m_clientobject)->GetLayer();
}
if (applyLights(layer)) if (applyLights(layer))
{ {
EnableOpenGLLights(); EnableOpenGLLights();

@ -74,6 +74,7 @@ KX_GameObject::KX_GameObject(
) : ) :
SCA_IObject(T), SCA_IObject(T),
m_bDyna(false), m_bDyna(false),
m_layer(0),
m_bSuspendDynamics(false), m_bSuspendDynamics(false),
m_bUseObjectColor(false), m_bUseObjectColor(false),
m_bVisible(true), m_bVisible(true),
@ -479,6 +480,22 @@ KX_GameObject::SetVisible(
m_bVisible = v; m_bVisible = v;
} }
void
KX_GameObject::SetLayer(
int l
)
{
m_layer = l;
}
int
KX_GameObject::GetLayer(
void
)
{
return m_layer;
}
// used by Python, and the actuatorshould _not_ be misused by the // used by Python, and the actuatorshould _not_ be misused by the
// scene! // scene!
void void

@ -70,6 +70,7 @@ protected:
KX_ClientObjectInfo* m_pClient_info; KX_ClientObjectInfo* m_pClient_info;
STR_String m_name; STR_String m_name;
STR_String m_text; STR_String m_text;
int m_layer;
std::vector<RAS_MeshObject*> m_meshes; std::vector<RAS_MeshObject*> m_meshes;
bool m_bSuspendDynamics; bool m_bSuspendDynamics;
@ -571,6 +572,22 @@ public:
bool b bool b
); );
/**
* Change the layer of the object (when it is added in another layer
* than the original layer)
*/
void
SetLayer(
int l
);
/**
* Get the object layer
*/
int
GetLayer(
void
);
/** /**
* @section Logic bubbling methods. * @section Logic bubbling methods.

@ -650,6 +650,8 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git) for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
{ {
(*git)->Relink(&m_map_gameobject_to_replica); (*git)->Relink(&m_map_gameobject_to_replica);
// add the object in the layer of the parent
(*git)->SetLayer(parentobj->GetLayer());
} }
// now replicate logic // now replicate logic

@ -61,6 +61,10 @@ public:
RAS_TEXT_PADDED, RAS_TEXT_PADDED,
RAS_TEXT_MAX RAS_TEXT_MAX
}; };
enum RAS_LIGHT_MODE {
RAS_LIGHT_NONE = -1,
RAS_LIGHT_OBJECT_LAYER = 0
};
RAS_IRenderTools( RAS_IRenderTools(
) : ) :

@ -189,7 +189,7 @@ bool RAS_MaterialBucket::ActivateMaterial(const MT_Transform& cameratrans, RAS_I
} }
else else
{ {
rendertools->ProcessLighting(m_material->GetLightLayer()); rendertools->ProcessLighting(RAS_IRenderTools::RAS_LIGHT_OBJECT_LAYER/*m_material->GetLightLayer()*/);
} }
drawmode = (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ? drawmode = (rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID ?
@ -204,7 +204,6 @@ void RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRa
if (!ms.m_bVisible) if (!ms.m_bVisible)
return; return;
rendertools->SetClientObject(ms.m_clientObj);
m_material->ActivateMeshSlot(ms, rasty); m_material->ActivateMeshSlot(ms, rasty);
/* __NLA Do the deformation */ /* __NLA Do the deformation */
@ -317,15 +316,12 @@ void RAS_MaterialBucket::Render(const MT_Transform& cameratrans,
//rasty->SetMaterial(*m_material); //rasty->SetMaterial(*m_material);
if (m_meshSlots.size() >0)
{
rendertools->SetClientObject((*m_meshSlots.begin()).m_clientObj);
}
int drawmode; int drawmode;
for (T_MeshSlotList::const_iterator it = m_meshSlots.begin(); for (T_MeshSlotList::const_iterator it = m_meshSlots.begin();
! (it == m_meshSlots.end()); ++it) ! (it == m_meshSlots.end()); ++it)
{ {
rendertools->SetClientObject((*it).m_clientObj);
while (ActivateMaterial(cameratrans, rasty, rendertools, drawmode)) while (ActivateMaterial(cameratrans, rasty, rendertools, drawmode))
RenderMeshSlot(cameratrans, rasty, rendertools, *it, drawmode); RenderMeshSlot(cameratrans, rasty, rendertools, *it, drawmode);
} }