BGE patch: logic optimization part 2: remove inactive sensors from logic manager.
With this patch, only sensors that are connected to active states are actually registered in the logic manager. Inactive sensors won't take any CPU, especially the Radar and Near sensors that use a physical object for the detection: these objects are removed from the physics engine. To take advantage of this optimization patch, you need to define very light idle state when the objects are inactive: make them transparent, suspend the physics, keep few sensors active (e,g a message sensor to wake up), etc.
This commit is contained in:
@@ -2441,13 +2441,13 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
|
||||
int layerMask = (groupobj.find(blenderobj) == groupobj.end()) ? activeLayerBitInfo : 0;
|
||||
bool isInActiveLayer = (blenderobj->lay & layerMask)!=0;
|
||||
BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,keydev,executePriority,layerMask,isInActiveLayer,canvas,converter);
|
||||
}
|
||||
// apply the initial state to controllers
|
||||
for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
|
||||
{
|
||||
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
|
||||
struct Object* blenderobj = converter->FindBlenderObject(gameobj);
|
||||
// set the init state to all objects
|
||||
gameobj->SetInitState((blenderobj->init_state)?blenderobj->init_state:blenderobj->state);
|
||||
}
|
||||
// apply the initial state to controllers, only on the active objects as this registers the sensors
|
||||
for ( i=0;i<objectlist->GetCount();i++)
|
||||
{
|
||||
KX_GameObject* gameobj = static_cast<KX_GameObject*>(objectlist->GetValue(i));
|
||||
gameobj->ResetState();
|
||||
}
|
||||
|
||||
|
||||
@@ -733,9 +733,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
|
||||
gameobj->AddSensor(gamesensor);
|
||||
|
||||
// only register to manager if it's in an active layer
|
||||
|
||||
if (isInActiveLayer)
|
||||
gamesensor->RegisterToManager();
|
||||
// Make registration dynamic: only when sensor is activated
|
||||
//if (isInActiveLayer)
|
||||
// gamesensor->RegisterToManager();
|
||||
|
||||
|
||||
for (int i=0;i<sens->totlinks;i++)
|
||||
|
||||
@@ -48,19 +48,10 @@ SCA_ActuatorEventManager::~SCA_ActuatorEventManager()
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_ActuatorEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_ActuatorEventManager::NextFrame()
|
||||
{
|
||||
// check for changed actuator
|
||||
for (vector<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
for (set<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
{
|
||||
(*it)->Activate(m_logicmgr,NULL);
|
||||
}
|
||||
@@ -69,7 +60,7 @@ void SCA_ActuatorEventManager::NextFrame()
|
||||
void SCA_ActuatorEventManager::UpdateFrame()
|
||||
{
|
||||
// update the state of actuator before executing them
|
||||
for (vector<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
for (set<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
{
|
||||
((SCA_ActuatorSensor*)(*it))->Update();
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@ public:
|
||||
virtual ~SCA_ActuatorEventManager();
|
||||
virtual void NextFrame();
|
||||
virtual void UpdateFrame();
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
//SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
|
||||
};
|
||||
|
||||
|
||||
@@ -51,16 +51,9 @@ SCA_AlwaysEventManager::SCA_AlwaysEventManager(class SCA_LogicManager* logicmgr)
|
||||
|
||||
void SCA_AlwaysEventManager::NextFrame()
|
||||
{
|
||||
for (vector<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
for (set<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
{
|
||||
SCA_ISensor* sensor = *i;
|
||||
sensor->Activate(m_logicmgr, NULL);
|
||||
(*i)->Activate(m_logicmgr, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_AlwaysEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,6 @@ class SCA_AlwaysEventManager : public SCA_EventManager
|
||||
public:
|
||||
SCA_AlwaysEventManager(class SCA_LogicManager* logicmgr);
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -45,17 +45,14 @@ SCA_EventManager::~SCA_EventManager()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void SCA_EventManager::RegisterSensor(class SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.insert(sensor);
|
||||
}
|
||||
|
||||
void SCA_EventManager::RemoveSensor(class SCA_ISensor* sensor)
|
||||
{
|
||||
std::vector<SCA_ISensor*>::iterator i =
|
||||
std::find(m_sensors.begin(), m_sensors.end(), sensor);
|
||||
if (!(i == m_sensors.end()))
|
||||
{
|
||||
std::swap(*i, m_sensors.back());
|
||||
m_sensors.pop_back();
|
||||
}
|
||||
m_sensors.erase(sensor);
|
||||
}
|
||||
|
||||
void SCA_EventManager::NextFrame(double curtime, double fixedtime)
|
||||
|
||||
@@ -30,12 +30,14 @@
|
||||
#define __KX_EVENTMANAGER
|
||||
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
|
||||
class SCA_EventManager
|
||||
{
|
||||
protected:
|
||||
std::vector <class SCA_ISensor*> m_sensors;
|
||||
// use a set to speed-up insertion/removal
|
||||
std::set <class SCA_ISensor*> m_sensors;
|
||||
|
||||
public:
|
||||
enum EVENT_MANAGER_TYPE {
|
||||
@@ -61,7 +63,7 @@ public:
|
||||
virtual void NextFrame();
|
||||
virtual void UpdateFrame();
|
||||
virtual void EndFrame();
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor)=0;
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor);
|
||||
int GetType();
|
||||
|
||||
protected:
|
||||
|
||||
@@ -337,12 +337,31 @@ void SCA_IObject::Resume(void)
|
||||
|
||||
void SCA_IObject::SetState(unsigned int state)
|
||||
{
|
||||
m_state = state;
|
||||
// update the status of the controllers
|
||||
unsigned int tmpstate;
|
||||
SCA_ControllerList::iterator contit;
|
||||
for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
|
||||
|
||||
// we will update the state in two steps:
|
||||
// 1) set the new state bits that are 1
|
||||
// 2) clr the new state bits that are 0
|
||||
// This to ensure continuity if a sensor is attached to two states
|
||||
// that are switching state: no need to deactive and reactive the sensor
|
||||
|
||||
tmpstate = m_state | state;
|
||||
if (tmpstate != m_state)
|
||||
{
|
||||
(*contit)->ApplyState(m_state);
|
||||
// update the status of the controllers
|
||||
for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
|
||||
{
|
||||
(*contit)->ApplyState(tmpstate);
|
||||
}
|
||||
}
|
||||
m_state = state;
|
||||
if (m_state != tmpstate)
|
||||
{
|
||||
for (contit = m_controllers.begin(); contit != m_controllers.end(); contit++)
|
||||
{
|
||||
(*contit)->ApplyState(m_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,8 @@
|
||||
void SCA_ISensor::ReParent(SCA_IObject* parent)
|
||||
{
|
||||
SCA_ILogicBrick::ReParent(parent);
|
||||
m_eventmgr->RegisterSensor(this);
|
||||
// will be done when the sensor is activated
|
||||
//m_eventmgr->RegisterSensor(this);
|
||||
this->SetActive(false);
|
||||
}
|
||||
|
||||
@@ -133,6 +134,7 @@ void SCA_ISensor::DecLink() {
|
||||
{
|
||||
// sensor is detached from all controllers, initialize it so that it
|
||||
// is fresh as at startup when it is reattached again.
|
||||
UnregisterToManager();
|
||||
Init();
|
||||
}
|
||||
}
|
||||
@@ -203,6 +205,11 @@ void SCA_ISensor::RegisterToManager()
|
||||
m_eventmgr->RegisterSensor(this);
|
||||
}
|
||||
|
||||
void SCA_ISensor::UnregisterToManager()
|
||||
{
|
||||
m_eventmgr->RemoveSensor(this);
|
||||
}
|
||||
|
||||
void SCA_ISensor::Activate(class SCA_LogicManager* logicmgr, CValue* event)
|
||||
{
|
||||
|
||||
|
||||
@@ -115,6 +115,8 @@ public:
|
||||
void SetLevel(bool lvl);
|
||||
|
||||
void RegisterToManager();
|
||||
void UnregisterToManager();
|
||||
|
||||
virtual float GetNumber();
|
||||
|
||||
/** Stop sensing for a while. */
|
||||
@@ -129,7 +131,7 @@ public:
|
||||
void ClrLink()
|
||||
{ m_links = 0; }
|
||||
void IncLink()
|
||||
{ m_links++; }
|
||||
{ if (!m_links++) RegisterToManager(); }
|
||||
void DecLink();
|
||||
bool IsNoLink() const
|
||||
{ return !m_links; }
|
||||
|
||||
@@ -52,9 +52,10 @@ SCA_JoystickManager::~SCA_JoystickManager()
|
||||
|
||||
void SCA_JoystickManager::NextFrame(double curtime,double deltatime)
|
||||
{
|
||||
for (unsigned int i = 0; i < m_sensors.size(); i++)
|
||||
set<SCA_ISensor*>::iterator it;
|
||||
for (it = m_sensors.begin(); it != m_sensors.end(); it++)
|
||||
{
|
||||
SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*) m_sensors[i];
|
||||
SCA_JoystickSensor* joysensor = (SCA_JoystickSensor*)(*it);
|
||||
if(!joysensor->IsSuspended())
|
||||
{
|
||||
m_joystick->HandleEvents();
|
||||
@@ -64,12 +65,6 @@ void SCA_JoystickManager::NextFrame(double curtime,double deltatime)
|
||||
}
|
||||
|
||||
|
||||
void SCA_JoystickManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
}
|
||||
|
||||
|
||||
SCA_Joystick *SCA_JoystickManager::GetJoystickDevice()
|
||||
{
|
||||
/*
|
||||
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
SCA_JoystickManager(class SCA_LogicManager* logicmgr);
|
||||
virtual ~SCA_JoystickManager();
|
||||
virtual void NextFrame(double curtime,double deltatime);
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
SCA_Joystick* GetJoystickDevice(void);
|
||||
|
||||
};
|
||||
|
||||
@@ -62,23 +62,14 @@ void SCA_KeyboardManager::NextFrame()
|
||||
{
|
||||
//const SCA_InputEvent& event = GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
|
||||
// cerr << "SCA_KeyboardManager::NextFrame"<< endl;
|
||||
for (unsigned int i=0;i<m_sensors.size();i++)
|
||||
set<SCA_ISensor*>::iterator it;
|
||||
for (it=m_sensors.begin(); it != m_sensors.end(); it++)
|
||||
{
|
||||
SCA_KeyboardSensor* keysensor = (SCA_KeyboardSensor*)m_sensors[i];
|
||||
keysensor->Activate(m_logicmanager,NULL);
|
||||
(*it)->Activate(m_logicmanager,NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_KeyboardManager::RegisterSensor(SCA_ISensor* keysensor)
|
||||
{
|
||||
m_sensors.push_back(keysensor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SCA_KeyboardManager::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)
|
||||
{
|
||||
return false;
|
||||
|
||||
@@ -55,7 +55,6 @@ public:
|
||||
bool IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode);
|
||||
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor);
|
||||
SCA_IInputDevice* GetInputDevice();
|
||||
};
|
||||
|
||||
|
||||
@@ -176,12 +176,7 @@ void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor)
|
||||
(*c)->UnlinkSensor(sensor);
|
||||
}
|
||||
m_sensorcontrollermapje.erase(sensor);
|
||||
|
||||
for (vector<SCA_EventManager*>::const_iterator ie=m_eventmanagers.begin();
|
||||
!(ie==m_eventmanagers.end());ie++)
|
||||
{
|
||||
(*ie)->RemoveSensor(sensor);
|
||||
}
|
||||
sensor->UnregisterToManager();
|
||||
}
|
||||
|
||||
void SCA_LogicManager::RemoveController(SCA_IController* controller)
|
||||
|
||||
@@ -75,9 +75,10 @@ void SCA_MouseManager::NextFrame()
|
||||
{
|
||||
if (m_mousedevice)
|
||||
{
|
||||
for (unsigned int i = 0; i < m_sensors.size(); i++)
|
||||
set<SCA_ISensor*>::iterator it;
|
||||
for (it=m_sensors.begin(); it!=m_sensors.end(); it++)
|
||||
{
|
||||
SCA_MouseSensor* mousesensor = (SCA_MouseSensor*) m_sensors[i];
|
||||
SCA_MouseSensor* mousesensor = (SCA_MouseSensor*)(*it);
|
||||
// (0,0) is the Upper Left corner in our local window
|
||||
// coordinates
|
||||
if (!mousesensor->IsSuspended())
|
||||
@@ -98,15 +99,6 @@ void SCA_MouseManager::NextFrame()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_MouseManager::RegisterSensor(SCA_ISensor* keysensor)
|
||||
{
|
||||
m_sensors.push_back(keysensor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SCA_MouseManager::IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode)
|
||||
{
|
||||
/* We should guard for non-mouse events maybe? A rather silly side */
|
||||
|
||||
@@ -62,7 +62,6 @@ public:
|
||||
*/
|
||||
bool IsPressed(SCA_IInputDevice::KX_EnumInputs inputcode);
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor);
|
||||
SCA_IInputDevice* GetInputDevice();
|
||||
};
|
||||
|
||||
|
||||
@@ -47,19 +47,10 @@ SCA_PropertyEventManager::~SCA_PropertyEventManager()
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_PropertyEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_PropertyEventManager::NextFrame()
|
||||
{
|
||||
// check for changed properties
|
||||
for (vector<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
for (set<SCA_ISensor*>::const_iterator it = m_sensors.begin();!(it==m_sensors.end());it++)
|
||||
{
|
||||
(*it)->Activate(m_logicmgr,NULL);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ public:
|
||||
SCA_PropertyEventManager(class SCA_LogicManager* logicmgr);
|
||||
virtual ~SCA_PropertyEventManager();
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
//SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
|
||||
};
|
||||
|
||||
|
||||
@@ -50,16 +50,9 @@ SCA_RandomEventManager::SCA_RandomEventManager(class SCA_LogicManager* logicmgr)
|
||||
|
||||
void SCA_RandomEventManager::NextFrame()
|
||||
{
|
||||
for (vector<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
for (set<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
{
|
||||
SCA_ISensor *sensor = *i;
|
||||
sensor->Activate(m_logicmgr, NULL);
|
||||
(*i)->Activate(m_logicmgr, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_RandomEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
};
|
||||
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
SCA_RandomEventManager(class SCA_LogicManager* logicmgr);
|
||||
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
};
|
||||
|
||||
#endif //__KX_RANDOMEVENTMGR
|
||||
|
||||
@@ -65,6 +65,11 @@ void SCA_TimeEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
// not yet
|
||||
}
|
||||
|
||||
void SCA_TimeEventManager::RemoveSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
// empty
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_TimeEventManager::NextFrame(double curtime, double fixedtime)
|
||||
|
||||
@@ -45,6 +45,7 @@ public:
|
||||
|
||||
virtual void NextFrame(double curtime, double fixedtime);
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor);
|
||||
virtual void RemoveSensor(class SCA_ISensor* sensor);
|
||||
void AddTimeProperty(CValue* timeval);
|
||||
void RemoveTimeProperty(CValue* timeval);
|
||||
};
|
||||
|
||||
@@ -55,28 +55,13 @@ KX_NetworkEventManager::~KX_NetworkEventManager()
|
||||
//printf("KX_NetworkEventManager destructor\n");
|
||||
}
|
||||
|
||||
void KX_NetworkEventManager::RegisterSensor(class SCA_ISensor* sensor)
|
||||
{
|
||||
//printf("KX_NetworkEventManager RegisterSensor\n");
|
||||
m_sensors.push_back(sensor);
|
||||
}
|
||||
|
||||
void KX_NetworkEventManager::RemoveSensor(class SCA_ISensor* sensor)
|
||||
{
|
||||
//printf("KX_NetworkEventManager RemoveSensor\n");
|
||||
// Network specific RemoveSensor stuff goes here
|
||||
|
||||
// parent
|
||||
SCA_EventManager::RemoveSensor(sensor);
|
||||
}
|
||||
|
||||
void KX_NetworkEventManager::NextFrame()
|
||||
{
|
||||
// printf("KX_NetworkEventManager::proceed %.2f - %.2f\n", curtime, deltatime);
|
||||
// each frame, the logicmanager will call the network
|
||||
// eventmanager to look for network events, and process it's
|
||||
// 'network' sensors
|
||||
vector<class SCA_ISensor*>::iterator it;
|
||||
set<class SCA_ISensor*>::iterator it;
|
||||
|
||||
for (it = m_sensors.begin(); !(it==m_sensors.end()); it++) {
|
||||
// printf("KX_NetworkEventManager::proceed sensor %.2f\n", curtime);
|
||||
|
||||
@@ -42,9 +42,6 @@ public:
|
||||
class NG_NetworkDeviceInterface *ndi);
|
||||
virtual ~KX_NetworkEventManager ();
|
||||
|
||||
virtual void RegisterSensor(class SCA_ISensor* sensor);
|
||||
virtual void RemoveSensor(class SCA_ISensor* sensor);
|
||||
|
||||
virtual void NextFrame();
|
||||
virtual void EndFrame();
|
||||
|
||||
|
||||
@@ -275,6 +275,7 @@ void KX_GameObject::ProcessReplica(KX_GameObject* replica)
|
||||
replica->m_pSGNode = NULL;
|
||||
replica->m_pClient_info = new KX_ClientObjectInfo(*m_pClient_info);
|
||||
replica->m_pClient_info->m_gameobject = replica;
|
||||
replica->m_state = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -98,6 +98,14 @@ void KX_NearSensor::RegisterSumo(KX_TouchEventManager *touchman)
|
||||
}
|
||||
}
|
||||
|
||||
void KX_NearSensor::UnregisterSumo(KX_TouchEventManager* touchman)
|
||||
{
|
||||
if (m_physCtrl)
|
||||
{
|
||||
touchman->GetPhysicsEnvironment()->removeSensor(m_physCtrl);
|
||||
}
|
||||
}
|
||||
|
||||
CValue* KX_NearSensor::GetReplica()
|
||||
{
|
||||
KX_NearSensor* replica = new KX_NearSensor(*this);
|
||||
|
||||
@@ -77,6 +77,7 @@ public:
|
||||
const PHY_CollData * coll_data);
|
||||
virtual bool BroadPhaseFilterCollision(void*obj1,void*obj2);
|
||||
virtual void RegisterSumo(KX_TouchEventManager *touchman);
|
||||
virtual void UnregisterSumo(KX_TouchEventManager* touchman);
|
||||
|
||||
virtual PyObject* _getattr(const STR_String& attr);
|
||||
|
||||
|
||||
@@ -44,14 +44,9 @@ using namespace std;
|
||||
|
||||
void KX_RayEventManager::NextFrame()
|
||||
{
|
||||
for (vector<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
for (set<class SCA_ISensor*>::const_iterator i= m_sensors.begin();!(i==m_sensors.end());i++)
|
||||
{
|
||||
SCA_ISensor *sensor = *i;
|
||||
sensor->Activate(m_logicmgr, NULL);
|
||||
(*i)->Activate(m_logicmgr, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void KX_RayEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensors.push_back(sensor);
|
||||
};
|
||||
|
||||
@@ -45,7 +45,6 @@ public:
|
||||
m_logicmgr(logicmgr)
|
||||
{}
|
||||
virtual void NextFrame();
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
};
|
||||
|
||||
#endif //__KX_RAYEVENTMGR
|
||||
|
||||
@@ -100,16 +100,24 @@ bool KX_TouchEventManager::newBroadphaseResponse(void *client_data,
|
||||
void KX_TouchEventManager::RegisterSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor);
|
||||
m_sensors.push_back(touchsensor);
|
||||
m_sensors.insert(touchsensor);
|
||||
|
||||
touchsensor->RegisterSumo(this);
|
||||
}
|
||||
|
||||
void KX_TouchEventManager::RemoveSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor);
|
||||
m_sensors.erase(touchsensor);
|
||||
|
||||
touchsensor->UnregisterSumo(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void KX_TouchEventManager::EndFrame()
|
||||
{
|
||||
vector<SCA_ISensor*>::iterator it;
|
||||
set<SCA_ISensor*>::iterator it;
|
||||
for ( it = m_sensors.begin();
|
||||
!(it==m_sensors.end());it++)
|
||||
{
|
||||
@@ -124,7 +132,7 @@ void KX_TouchEventManager::NextFrame()
|
||||
{
|
||||
if (m_sensors.size() > 0)
|
||||
{
|
||||
vector<SCA_ISensor*>::iterator it;
|
||||
set<SCA_ISensor*>::iterator it;
|
||||
|
||||
for (it = m_sensors.begin();!(it==m_sensors.end());++it)
|
||||
static_cast<KX_TouchSensor*>(*it)->SynchronizeTransform();
|
||||
@@ -157,20 +165,3 @@ void KX_TouchEventManager::NextFrame()
|
||||
(*it)->Activate(m_logicmgr,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void KX_TouchEventManager::RemoveSensor(class SCA_ISensor* sensor)
|
||||
{
|
||||
std::vector<SCA_ISensor*>::iterator i =
|
||||
std::find(m_sensors.begin(), m_sensors.end(), sensor);
|
||||
if (!(i == m_sensors.end()))
|
||||
{
|
||||
std::swap(*i, m_sensors.back());
|
||||
m_sensors.pop_back();
|
||||
}
|
||||
|
||||
// remove the sensor forever :)
|
||||
SCA_EventManager::RemoveSensor(sensor);
|
||||
}
|
||||
|
||||
|
||||
@@ -71,8 +71,8 @@ public:
|
||||
PHY_IPhysicsEnvironment* physEnv);
|
||||
virtual void NextFrame();
|
||||
virtual void EndFrame();
|
||||
virtual void RemoveSensor(class SCA_ISensor* sensor);
|
||||
virtual void RegisterSensor(SCA_ISensor* sensor);
|
||||
virtual void RemoveSensor(SCA_ISensor* sensor);
|
||||
SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
|
||||
PHY_IPhysicsEnvironment *GetPhysicsEnvironment() { return m_physEnv; }
|
||||
|
||||
|
||||
@@ -153,6 +153,14 @@ void KX_TouchSensor::RegisterSumo(KX_TouchEventManager *touchman)
|
||||
}
|
||||
}
|
||||
|
||||
void KX_TouchSensor::UnregisterSumo(KX_TouchEventManager* touchman)
|
||||
{
|
||||
if (m_physCtrl)
|
||||
{
|
||||
touchman->GetPhysicsEnvironment()->removeCollisionCallback(m_physCtrl);
|
||||
}
|
||||
}
|
||||
|
||||
bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_CollData* colldata)
|
||||
{
|
||||
// KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr;
|
||||
|
||||
@@ -76,6 +76,7 @@ public:
|
||||
virtual void ReParent(SCA_IObject* parent);
|
||||
|
||||
virtual void RegisterSumo(KX_TouchEventManager* touchman);
|
||||
virtual void UnregisterSumo(KX_TouchEventManager* touchman);
|
||||
|
||||
// virtual DT_Bool HandleCollision(void* obj1,void* obj2,
|
||||
// const DT_CollData * coll_data);
|
||||
|
||||
@@ -65,6 +65,7 @@ public:
|
||||
{
|
||||
}
|
||||
virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl) {}
|
||||
virtual void removeCollisionCallback(PHY_IPhysicsController* ctrl) {}
|
||||
virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position) {return 0;}
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight) { return 0;}
|
||||
|
||||
|
||||
@@ -368,7 +368,7 @@ void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl)
|
||||
body->setUserPointer(ctrl);
|
||||
|
||||
body->setGravity( m_gravity );
|
||||
m_controllers.push_back(ctrl);
|
||||
m_controllers.insert(ctrl);
|
||||
|
||||
//use explicit group/filter for finer control over collision in bullet => near/radar sensor
|
||||
m_dynamicsWorld->addRigidBody(body, ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
|
||||
@@ -434,36 +434,13 @@ void CcdPhysicsEnvironment::addCcdPhysicsController(CcdPhysicsController* ctrl)
|
||||
|
||||
void CcdPhysicsEnvironment::removeCcdPhysicsController(CcdPhysicsController* ctrl)
|
||||
{
|
||||
|
||||
//also remove constraint
|
||||
|
||||
|
||||
|
||||
m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
|
||||
|
||||
|
||||
{
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_controllers.begin(), m_controllers.end(), ctrl);
|
||||
if (!(i == m_controllers.end()))
|
||||
{
|
||||
std::swap(*i, m_controllers.back());
|
||||
m_controllers.pop_back();
|
||||
}
|
||||
}
|
||||
m_controllers.erase(ctrl);
|
||||
|
||||
//remove it from the triggers
|
||||
{
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl);
|
||||
if (!(i == m_triggerControllers.end()))
|
||||
{
|
||||
std::swap(*i, m_triggerControllers.back());
|
||||
m_triggerControllers.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
m_triggerControllers.erase(ctrl);
|
||||
}
|
||||
|
||||
void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctrl, btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask)
|
||||
@@ -487,11 +464,10 @@ void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctr
|
||||
|
||||
void CcdPhysicsEnvironment::enableCcdPhysicsController(CcdPhysicsController* ctrl)
|
||||
{
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_controllers.begin(), m_controllers.end(), ctrl);
|
||||
if (i == m_controllers.end())
|
||||
if (m_controllers.insert(ctrl).second)
|
||||
{
|
||||
btRigidBody* body = ctrl->GetRigidBody();
|
||||
body->setUserPointer(ctrl);
|
||||
m_dynamicsWorld->addCollisionObject(body,
|
||||
ctrl->GetCollisionFilterGroup(), ctrl->GetCollisionFilterMask());
|
||||
}
|
||||
@@ -507,12 +483,12 @@ void CcdPhysicsEnvironment::beginFrame()
|
||||
|
||||
bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
|
||||
{
|
||||
std::set<CcdPhysicsController*>::iterator it;
|
||||
int i;
|
||||
|
||||
int i,numCtrl = GetNumControllers();
|
||||
for (i=0;i<numCtrl;i++)
|
||||
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
|
||||
{
|
||||
CcdPhysicsController* ctrl = GetPhysicsController(i);
|
||||
ctrl->SynchronizeMotionStates(timeStep);
|
||||
(*it)->SynchronizeMotionStates(timeStep);
|
||||
}
|
||||
|
||||
float subStep = timeStep / float(m_numTimeSubSteps);
|
||||
@@ -521,11 +497,9 @@ bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
|
||||
m_dynamicsWorld->stepSimulation(subStep,0);//perform always a full simulation step
|
||||
}
|
||||
|
||||
numCtrl = GetNumControllers();
|
||||
for (i=0;i<numCtrl;i++)
|
||||
for (it=m_controllers.begin(); it!=m_controllers.end(); it++)
|
||||
{
|
||||
CcdPhysicsController* ctrl = GetPhysicsController(i);
|
||||
ctrl->SynchronizeMotionStates(timeStep);
|
||||
(*it)->SynchronizeMotionStates(timeStep);
|
||||
}
|
||||
|
||||
for (i=0;i<m_wrapperVehicles.size();i++)
|
||||
@@ -852,20 +826,6 @@ CcdPhysicsEnvironment::~CcdPhysicsEnvironment()
|
||||
}
|
||||
|
||||
|
||||
int CcdPhysicsEnvironment::GetNumControllers()
|
||||
{
|
||||
return m_controllers.size();
|
||||
}
|
||||
|
||||
|
||||
CcdPhysicsController* CcdPhysicsEnvironment::GetPhysicsController( int index)
|
||||
{
|
||||
return m_controllers[index];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void CcdPhysicsEnvironment::setConstraintParam(int constraintId,int param,float value0,float value1)
|
||||
{
|
||||
btTypedConstraint* typedConstraint = getConstraintById(constraintId);
|
||||
@@ -905,12 +865,14 @@ void CcdPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
|
||||
CcdPhysicsController* ctrl1 = (CcdPhysicsController* )ctrl;
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_controllers.begin(), m_controllers.end(), ctrl);
|
||||
if ((i == m_controllers.end()))
|
||||
{
|
||||
addCcdPhysicsController(ctrl1);
|
||||
}
|
||||
// addSensor() is a "light" function for bullet because it is used
|
||||
// dynamically when the sensor is activated. Use enableCcdPhysicsController() instead
|
||||
//if (m_controllers.insert(ctrl1).second)
|
||||
//{
|
||||
// addCcdPhysicsController(ctrl1);
|
||||
//}
|
||||
enableCcdPhysicsController(ctrl1);
|
||||
|
||||
//Collision filter/mask is now set at the time of the creation of the controller
|
||||
//force collision detection with everything, including static objects (might hurt performance!)
|
||||
//ctrl1->GetRigidBody()->getBroadphaseHandle()->m_collisionFilterMask = btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::SensorTrigger;
|
||||
@@ -923,21 +885,15 @@ void CcdPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl)
|
||||
|
||||
void CcdPhysicsEnvironment::removeCollisionCallback(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl);
|
||||
if (!(i == m_triggerControllers.end()))
|
||||
{
|
||||
std::swap(*i, m_triggerControllers.back());
|
||||
m_triggerControllers.pop_back();
|
||||
}
|
||||
m_triggerControllers.erase((CcdPhysicsController*)ctrl);
|
||||
}
|
||||
|
||||
|
||||
void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
removeCollisionCallback(ctrl);
|
||||
//printf("removeSensor\n");
|
||||
removeCcdPhysicsController((CcdPhysicsController*)ctrl);
|
||||
}
|
||||
|
||||
void CcdPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user)
|
||||
{
|
||||
/* printf("addTouchCallback\n(response class = %i)\n",response_class);
|
||||
@@ -975,10 +931,9 @@ void CcdPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ctr
|
||||
CcdPhysicsController* ccdCtrl = static_cast<CcdPhysicsController*>(ctrl);
|
||||
|
||||
//printf("requestCollisionCallback\n");
|
||||
m_triggerControllers.push_back(ccdCtrl);
|
||||
m_triggerControllers.insert(ccdCtrl);
|
||||
}
|
||||
|
||||
|
||||
void CcdPhysicsEnvironment::CallbackTriggers()
|
||||
{
|
||||
|
||||
@@ -1011,11 +966,10 @@ void CcdPhysicsEnvironment::CallbackTriggers()
|
||||
CcdPhysicsController* ctrl0 = static_cast<CcdPhysicsController*>(obj0->getUserPointer());
|
||||
CcdPhysicsController* ctrl1 = static_cast<CcdPhysicsController*>(obj1->getUserPointer());
|
||||
|
||||
std::vector<CcdPhysicsController*>::iterator i =
|
||||
std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl0);
|
||||
std::set<CcdPhysicsController*>::const_iterator i = m_triggerControllers.find(ctrl0);
|
||||
if (i == m_triggerControllers.end())
|
||||
{
|
||||
i = std::find(m_triggerControllers.begin(), m_triggerControllers.end(), ctrl1);
|
||||
i = m_triggerControllers.find(ctrl1);
|
||||
}
|
||||
|
||||
if (!(i == m_triggerControllers.end()))
|
||||
@@ -1125,7 +1079,6 @@ PHY_IPhysicsController* CcdPhysicsEnvironment::CreateSphereController(float radi
|
||||
|
||||
CcdPhysicsController* sphereController = new CcdPhysicsController(cinfo);
|
||||
|
||||
|
||||
return sphereController;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ subject to the following restrictions:
|
||||
|
||||
#include "PHY_IPhysicsEnvironment.h"
|
||||
#include <vector>
|
||||
#include <set>
|
||||
class CcdPhysicsController;
|
||||
#include "LinearMath/btVector3.h"
|
||||
#include "LinearMath/btTransform.h"
|
||||
@@ -209,12 +210,6 @@ protected:
|
||||
}
|
||||
|
||||
|
||||
int GetNumControllers();
|
||||
|
||||
CcdPhysicsController* GetPhysicsController( int index);
|
||||
|
||||
|
||||
|
||||
const btPersistentManifold* GetManifold(int index) const;
|
||||
|
||||
|
||||
@@ -229,9 +224,9 @@ protected:
|
||||
|
||||
|
||||
|
||||
std::vector<CcdPhysicsController*> m_controllers;
|
||||
std::set<CcdPhysicsController*> m_controllers;
|
||||
|
||||
std::vector<CcdPhysicsController*> m_triggerControllers;
|
||||
std::set<CcdPhysicsController*> m_triggerControllers;
|
||||
|
||||
PHY_ResponseCallback m_triggerCallbacks[PHY_NUM_RESPONSE];
|
||||
void* m_triggerCallbacksUserPtrs[PHY_NUM_RESPONSE];
|
||||
|
||||
@@ -80,6 +80,7 @@ public:
|
||||
{
|
||||
}
|
||||
virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl) {}
|
||||
virtual void removeCollisionCallback(PHY_IPhysicsController* ctrl) {}
|
||||
virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position) {return 0;}
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight) { return 0;}
|
||||
|
||||
|
||||
@@ -98,12 +98,17 @@ void SM_Scene::addTouchCallback(int response_class, DT_ResponseCallback callback
|
||||
|
||||
void SM_Scene::addSensor(SM_Object& object)
|
||||
{
|
||||
object.calcXform();
|
||||
m_objectList.push_back(&object);
|
||||
DT_AddObject(m_scene, object.getObjectHandle());
|
||||
DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[SENSOR_RESPONSE]);
|
||||
DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass[SENSOR_RESPONSE]);
|
||||
DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[SENSOR_RESPONSE]);
|
||||
T_ObjectList::iterator i =
|
||||
std::find(m_objectList.begin(), m_objectList.end(), &object);
|
||||
if (i == m_objectList.end())
|
||||
{
|
||||
object.calcXform();
|
||||
m_objectList.push_back(&object);
|
||||
DT_AddObject(m_scene, object.getObjectHandle());
|
||||
DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[SENSOR_RESPONSE]);
|
||||
DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass [SENSOR_RESPONSE]);
|
||||
DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[SENSOR_RESPONSE]);
|
||||
}
|
||||
}
|
||||
|
||||
void SM_Scene::add(SM_Object& object) {
|
||||
|
||||
@@ -228,6 +228,12 @@ void SumoPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ct
|
||||
m_sumoScene->requestCollisionCallback(*smObject);
|
||||
}
|
||||
}
|
||||
|
||||
void SumoPhysicsEnvironment::removeCollisionCallback(PHY_IPhysicsController* ctrl)
|
||||
{
|
||||
// intentionally empty
|
||||
}
|
||||
|
||||
PHY_IPhysicsController* SumoPhysicsEnvironment::CreateSphereController(float radius,const PHY__Vector3& position)
|
||||
{
|
||||
DT_ShapeHandle shape = DT_NewSphere(0.0);
|
||||
|
||||
@@ -84,6 +84,7 @@ public:
|
||||
virtual void removeSensor(PHY_IPhysicsController* ctrl);
|
||||
virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user);
|
||||
virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl);
|
||||
virtual void removeCollisionCallback(PHY_IPhysicsController* ctrl);
|
||||
virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position);
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight);
|
||||
|
||||
|
||||
@@ -104,6 +104,7 @@ class PHY_IPhysicsEnvironment
|
||||
virtual void removeSensor(PHY_IPhysicsController* ctrl)=0;
|
||||
virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user)=0;
|
||||
virtual void requestCollisionCallback(PHY_IPhysicsController* ctrl)=0;
|
||||
virtual void removeCollisionCallback(PHY_IPhysicsController* ctrl)=0;
|
||||
//These two methods are *solely* used to create controllers for sensor! Don't use for anything else
|
||||
virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position) =0;
|
||||
virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight)=0;
|
||||
|
||||
Reference in New Issue
Block a user