BGE C++ API

PyObjectPlus::ProcessReplica() is now called when any of its subclasses are replicated.

This is important because PyObjectPlus::ProcessReplica() NULL's the 'm_proxy' python pointer I added recently.
Without this a replicated subclass of PyObjectPlus could have an invalid pointer (crashing the BGE).

This change also means CValue::AddDataToReplica() can be moved into CValue::ProcessReplica() since ProcessReplica is always called.
This commit is contained in:
Campbell Barton 2009-04-22 14:42:00 +00:00
parent a8592d09d0
commit 5553d2c014
61 changed files with 63 additions and 140 deletions

@ -66,9 +66,9 @@ BL_ActionActuator::~BL_ActionActuator()
game_free_pose(m_blendpose);
}
void BL_ActionActuator::ProcessReplica(){
// bPose *oldpose = m_pose;
// bPose *oldbpose = m_blendpose;
void BL_ActionActuator::ProcessReplica()
{
SCA_IActuator::ProcessReplica();
m_pose = NULL;
m_blendpose = NULL;
@ -84,9 +84,6 @@ void BL_ActionActuator::SetBlendTime (float newtime){
CValue* BL_ActionActuator::GetReplica() {
BL_ActionActuator* replica = new BL_ActionActuator(*this);//m_float,GetName());
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -70,10 +70,6 @@ BL_ArmatureObject::BL_ArmatureObject(
CValue* BL_ArmatureObject::GetReplica()
{
BL_ArmatureObject* replica = new BL_ArmatureObject(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -53,10 +53,6 @@ CValue* BL_DeformableGameObject::GetReplica()
{
BL_DeformableGameObject* replica = new BL_DeformableGameObject(*this);//m_float,GetName());
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -87,6 +87,7 @@ RAS_Deformer *BL_ModifierDeformer::GetReplica(class KX_GameObject* replica)
void BL_ModifierDeformer::ProcessReplica()
{
/* Note! - This is not inherited from PyObjectPlus */
BL_ShapeDeformer::ProcessReplica();
m_dm = NULL;
m_lastModifierUpdate = -1;

@ -61,6 +61,7 @@ BL_ShapeActionActuator::~BL_ShapeActionActuator()
void BL_ShapeActionActuator::ProcessReplica()
{
SCA_IActuator::ProcessReplica();
m_localtime=m_startframe;
m_lastUpdate=-1;
}
@ -74,9 +75,6 @@ CValue* BL_ShapeActionActuator::GetReplica()
{
BL_ShapeActionActuator* replica = new BL_ShapeActionActuator(*this);//m_float,GetName());
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -156,6 +156,8 @@ RAS_Deformer *BL_SkinDeformer::GetReplica(class KX_GameObject* replica)
BL_SkinDeformer *result;
result = new BL_SkinDeformer(*this);
/* Not inherited from PyObjectPlus so this isnt needed */
/* Just call a dummy function below, will be optimized out */
result->ProcessReplica();
return result;
}

@ -201,7 +201,7 @@ const STR_String& CBoolValue::GetText()
CValue* CBoolValue::GetReplica()
{
CBoolValue* replica = new CBoolValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -121,7 +121,7 @@ const STR_String & CEmptyValue::GetText()
CValue* CEmptyValue::GetReplica()
{
CEmptyValue* replica = new CEmptyValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -307,8 +307,8 @@ const STR_String & CFloatValue::GetText()
CValue* CFloatValue::GetReplica()
{
CFloatValue* replica = new CFloatValue(*this);
replica->m_pstrRep = NULL;
CValue::AddDataToReplica(replica);
replica->m_pstrRep = NULL; /* should be in CFloatValue::ProcessReplica() but its not defined, no matter */
replica->ProcessReplica();
return replica;
}

@ -311,7 +311,7 @@ const STR_String & CIntValue::GetText()
CValue* CIntValue::GetReplica() {
CIntValue* replica = new CIntValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->m_pstrRep = NULL;
return replica;

@ -324,7 +324,7 @@ const STR_String & CListValue::GetText()
CValue* CListValue::GetReplica() {
CListValue* replica = new CListValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->m_bReleaseContents=true; // for copy, complete array is copied for now...
// copy all values

@ -133,7 +133,7 @@ bool CStringValue::IsEqual(const STR_String & other)
CValue* CStringValue::GetReplica()
{
CStringValue* replica = new CStringValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
};

@ -439,27 +439,6 @@ int CValue::GetPropertyCount()
}
void CValue::CloneProperties(CValue *replica)
{
if (m_pNamedPropertyArray)
{
replica->m_pNamedPropertyArray=NULL;
std::map<STR_String,CValue*>::iterator it;
for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++)
{
CValue *val = (*it).second->GetReplica();
replica->SetProperty((*it).first,val);
val->Release();
}
}
}
double* CValue::GetVector3(bool bGetTransformedVec)
{
assertd(false); // don;t get vector from me
@ -534,23 +513,34 @@ void CValue::DisableRefCount()
void CValue::AddDataToReplica(CValue *replica)
void CValue::ProcessReplica() /* was AddDataToReplica in 2.48 */
{
replica->m_refcount = 1;
m_refcount = 1;
#ifdef _DEBUG
//gRefCountValue++;
#endif
replica->m_ValFlags.RefCountDisabled = false;
PyObjectPlus::ProcessReplica();
replica->ReplicaSetName(GetName());
m_ValFlags.RefCountDisabled = false;
//copy all props
CloneProperties(replica);
ReplicaSetName(GetName());
/* copy all props */
if (m_pNamedPropertyArray)
{
std::map<STR_String,CValue*> *pOldArray = m_pNamedPropertyArray;
m_pNamedPropertyArray=NULL;
std::map<STR_String,CValue*>::iterator it;
for (it= pOldArray->begin(); (it != pOldArray->end()); it++)
{
CValue *val = (*it).second->GetReplica();
SetProperty((*it).first,val);
val->Release();
}
}
}
CValue* CValue::FindIdentifier(const STR_String& identifiername)
{

@ -281,7 +281,6 @@ public:
virtual CValue* GetProperty(int inIndex); // Get property number <inIndex>
virtual int GetPropertyCount(); // Get the amount of properties assiocated with this value
virtual void CloneProperties(CValue* replica);
virtual CValue* FindIdentifier(const STR_String& identifiername);
/** Set the wireframe color of this value depending on the CSG
* operator type <op>
@ -300,6 +299,7 @@ public:
* @attention this particular function should never be called. Why not abstract? */
virtual void SetValue(CValue* newval);
virtual CValue* GetReplica() =0;
virtual void ProcessReplica();
//virtual CValue* Copy() = 0;
@ -328,10 +328,10 @@ public:
virtual void SetCustomFlag2(bool bCustomFlag) { m_ValFlags.CustomFlag2 = bCustomFlag;};
virtual bool IsCustomFlag2() { return m_ValFlags.CustomFlag2;};
protected:
virtual void DisableRefCount(); // Disable reference counting for this value
virtual void AddDataToReplica(CValue* replica);
//virtual void AddDataToReplica(CValue* replica);
virtual ~CValue();
private:
// Member variables

@ -204,7 +204,7 @@ const STR_String & CVectorValue::GetText()
CValue* CVectorValue::GetReplica() {
CVectorValue* replica = new CVectorValue(*this);
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
};

@ -64,8 +64,6 @@ CValue* SCA_2DFilterActuator::GetReplica()
{
SCA_2DFilterActuator* replica = new SCA_2DFilterActuator(*this);
replica->ProcessReplica();
CValue::AddDataToReplica(replica);
return replica;
}

@ -94,7 +94,7 @@ CValue* SCA_ANDController::GetReplica()
{
CValue* replica = new SCA_ANDController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -60,7 +60,7 @@ CValue* SCA_ActuatorSensor::GetReplica()
{
SCA_ActuatorSensor* replica = new SCA_ActuatorSensor(*this);
// m_range_expr must be recalculated on replica!
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
return replica;

@ -72,7 +72,7 @@ CValue* SCA_AlwaysSensor::GetReplica()
{
CValue* replica = new SCA_AlwaysSensor(*this);//m_float,GetName());
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -77,7 +77,7 @@ CValue* SCA_DelaySensor::GetReplica()
{
CValue* replica = new SCA_DelaySensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -70,7 +70,7 @@ CValue* SCA_ExpressionController::GetReplica()
replica->m_exprText = m_exprText;
replica->m_exprCache = NULL;
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -100,6 +100,7 @@ bool SCA_IActuator::Update()
void SCA_IActuator::ProcessReplica()
{
SCA_ILogicBrick::ProcessReplica();
m_events.clear();
}

@ -87,7 +87,7 @@ CValue* SCA_JoystickSensor::GetReplica()
{
SCA_JoystickSensor* replica = new SCA_JoystickSensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
return replica;
}

@ -85,7 +85,7 @@ CValue* SCA_KeyboardSensor::GetReplica()
{
SCA_KeyboardSensor* replica = new SCA_KeyboardSensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
return replica;
}

@ -111,7 +111,7 @@ CValue* SCA_MouseSensor::GetReplica()
{
SCA_MouseSensor* replica = new SCA_MouseSensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
return replica;

@ -94,7 +94,7 @@ CValue* SCA_NANDController::GetReplica()
{
CValue* replica = new SCA_NANDController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -94,7 +94,7 @@ CValue* SCA_NORController::GetReplica()
{
CValue* replica = new SCA_NORController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -60,7 +60,7 @@ CValue* SCA_ORController::GetReplica()
{
CValue* replica = new SCA_ORController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -186,11 +186,6 @@ GetReplica() {
SCA_PropertyActuator* replica = new SCA_PropertyActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -111,7 +111,7 @@ CValue* SCA_PropertySensor::GetReplica()
{
SCA_PropertySensor* replica = new SCA_PropertySensor(*this);
// m_range_expr must be recalculated on replica!
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
replica->m_range_expr = NULL;

@ -110,7 +110,7 @@ CValue* SCA_PythonController::GetReplica()
*/
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -78,8 +78,6 @@ CValue* SCA_RandomActuator::GetReplica()
SCA_RandomActuator* replica = new SCA_RandomActuator(*this);
// replication just copy the m_base pointer => common random generator
replica->ProcessReplica();
CValue::AddDataToReplica(replica);
return replica;
}

@ -76,7 +76,7 @@ CValue* SCA_RandomSensor::GetReplica()
CValue* replica = new SCA_RandomSensor(*this);
// replication copies m_basegenerator pointer => share same generator
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -98,7 +98,7 @@ CValue* SCA_XNORController::GetReplica()
{
CValue* replica = new SCA_XNORController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -98,7 +98,7 @@ CValue* SCA_XORController::GetReplica()
{
CValue* replica = new SCA_XORController(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -93,9 +93,6 @@ CValue* KX_NetworkMessageActuator::GetReplica()
new KX_NetworkMessageActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -79,9 +79,7 @@ CValue* KX_NetworkMessageSensor::GetReplica() {
CValue* replica = new KX_NetworkMessageSensor(*this);
if (replica == NULL) return NULL;
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -74,9 +74,6 @@ CValue* KX_CDActuator::GetReplica()
{
KX_CDActuator* replica = new KX_CDActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -71,7 +71,6 @@ CValue* KX_Camera::GetReplica()
KX_Camera* replica = new KX_Camera(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;

@ -82,8 +82,6 @@ GetReplica(
) {
KX_CameraActuator* replica = new KX_CameraActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -132,8 +132,6 @@ protected:
virtual CValue* GetReplica() {
KX_ConstraintActuator* replica = new KX_ConstraintActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -73,8 +73,6 @@ CValue* KX_GameActuator::GetReplica()
{
KX_GameActuator* replica = new KX_GameActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -333,6 +333,8 @@ void KX_GameObject::RemoveParent(KX_Scene *scene)
void KX_GameObject::ProcessReplica()
{
SCA_IObject::ProcessReplica();
m_pPhysicsController1 = NULL;
m_pGraphicController = NULL;
m_pSGNode = NULL;
@ -351,7 +353,6 @@ CValue* KX_GameObject::GetReplica()
KX_GameObject* replica = new KX_GameObject(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;

@ -128,8 +128,6 @@ public:
virtual CValue* GetReplica() {
KX_IpoActuator* replica = new KX_IpoActuator(*this);//m_float,GetName());
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -82,9 +82,6 @@ CValue* KX_LightObject::GetReplica()
KX_LightObject* replica = new KX_LightObject(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->m_lightobj.m_worldmatrix = replica->GetOpenGLMatrixPtr();

@ -63,7 +63,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
virtual CValue* GetReplica() {
CValue* replica = new KX_MouseFocusSensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
};
/**

@ -111,8 +111,7 @@ CValue* KX_NearSensor::GetReplica()
KX_NearSensor* replica = new KX_NearSensor(*this);
replica->m_colliders = new CListValue();
replica->Init();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_gameobject, KX_ClientObjectInfo::NEAR);

@ -253,9 +253,6 @@ CValue* KX_ObjectActuator::GetReplica()
KX_ObjectActuator* replica = new KX_ObjectActuator(*this);//m_float,GetName());
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -73,8 +73,6 @@ CValue* KX_ParentActuator::GetReplica()
KX_ParentActuator* replica = new KX_ParentActuator(*this);
// replication just copy the m_base pointer => common random generator
replica->ProcessReplica();
CValue::AddDataToReplica(replica);
return replica;
}

@ -82,8 +82,7 @@ CValue* KX_RadarSensor::GetReplica()
KX_RadarSensor* replica = new KX_RadarSensor(*this);
replica->m_colliders = new CListValue();
replica->Init();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_gameobject, KX_ClientObjectInfo::RADAR);

@ -88,8 +88,7 @@ KX_RaySensor::~KX_RaySensor()
CValue* KX_RaySensor::GetReplica()
{
KX_RaySensor* replica = new KX_RaySensor(*this);
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
replica->Init();
return replica;

@ -125,7 +125,6 @@ CValue* KX_SCA_AddObjectActuator::GetReplica()
// this will copy properties and so on...
replica->ProcessReplica();
CValue::AddDataToReplica(replica);
return replica;
}

@ -215,10 +215,6 @@ CValue* KX_SCA_DynamicActuator::GetReplica()
return NULL;
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -82,8 +82,6 @@ CValue* KX_SCA_EndObjectActuator::GetReplica()
if (replica == NULL) return NULL;
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -217,9 +217,6 @@ CValue* KX_SCA_ReplaceMeshActuator::GetReplica()
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -76,9 +76,6 @@ CValue* KX_SceneActuator::GetReplica()
{
KX_SceneActuator* replica = new KX_SceneActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -90,8 +90,6 @@ CValue* KX_SoundActuator::GetReplica()
m_soundScene->AddObject(soundobj);
}
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -62,8 +62,6 @@ KX_StateActuator::GetReplica(
{
KX_StateActuator* replica = new KX_StateActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}

@ -144,8 +144,7 @@ CValue* KX_TouchSensor::GetReplica()
KX_TouchSensor* replica = new KX_TouchSensor(*this);
replica->m_colliders = new CListValue();
replica->Init();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->ProcessReplica();
return replica;
}

@ -61,8 +61,6 @@ class KX_TrackToActuator : public SCA_IActuator
virtual CValue* GetReplica() {
KX_TrackToActuator* replica = new KX_TrackToActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
};

@ -64,8 +64,6 @@ KX_VisibilityActuator::GetReplica(
{
KX_VisibilityActuator* replica = new KX_VisibilityActuator(*this);
replica->ProcessReplica();
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
return replica;
}