2.50:
svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19820:HEAD Notes: * Game and sequencer RNA, and sequencer header are now out of date a bit after changes in trunk. * I didn't know how to port these bugfixes, most likely they are not needed anymore. * Fix "duplicate strip" always increase the user count for ipo. * IPO pinning on sequencer strips was lost during Undo.
This commit is contained in:
@@ -49,37 +49,14 @@ SCA_LogicManager::SCA_LogicManager()
|
||||
|
||||
SCA_LogicManager::~SCA_LogicManager()
|
||||
{
|
||||
/* AddRef() is not used when the objects are added to m_mapStringToGameObjects
|
||||
so Release() should not be used either. The memory leak big is fixed
|
||||
in BL_ConvertBlenderObjects()
|
||||
|
||||
int numgameobj = m_mapStringToGameObjects.size();
|
||||
for (int i = 0; i < numgameobj; i++)
|
||||
{
|
||||
CValue** gameobjptr = m_mapStringToGameObjects.at(i);
|
||||
assert(gameobjptr);
|
||||
if (gameobjptr)
|
||||
(*gameobjptr)->Release();
|
||||
|
||||
}
|
||||
*/
|
||||
/*for (int i=0;i<m_sensorcontrollermap.size();i++)
|
||||
{
|
||||
vector<SCA_IController*>* controllerarray = *(m_sensorcontrollermap[i]);
|
||||
delete controllerarray;
|
||||
}
|
||||
*/
|
||||
for (vector<SCA_EventManager*>::iterator it = m_eventmanagers.begin();!(it==m_eventmanagers.end());it++)
|
||||
for (vector<SCA_EventManager*>::iterator it = m_eventmanagers.begin();!(it==m_eventmanagers.end());++it)
|
||||
{
|
||||
delete (*it);
|
||||
}
|
||||
m_eventmanagers.clear();
|
||||
m_sensorcontrollermapje.clear();
|
||||
m_removedActuators.clear();
|
||||
m_activeActuators.clear();
|
||||
assert(m_activeActuators.Empty());
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
// this kind of fixes bug 398 but breakes games, so better leave it out for now.
|
||||
// a removed object's gameobject (and logicbricks and stuff) didn't get released
|
||||
@@ -171,12 +148,7 @@ void* SCA_LogicManager::FindBlendObjByGameMeshName(const STR_String& gamemeshnam
|
||||
|
||||
void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
controllerlist contlist = m_sensorcontrollermapje[sensor];
|
||||
for (controllerlist::const_iterator c= contlist.begin();!(c==contlist.end());c++)
|
||||
{
|
||||
(*c)->UnlinkSensor(sensor);
|
||||
}
|
||||
m_sensorcontrollermapje.erase(sensor);
|
||||
sensor->UnlinkAllControllers();
|
||||
sensor->UnregisterToManager();
|
||||
}
|
||||
|
||||
@@ -184,35 +156,22 @@ void SCA_LogicManager::RemoveController(SCA_IController* controller)
|
||||
{
|
||||
controller->UnlinkAllSensors();
|
||||
controller->UnlinkAllActuators();
|
||||
std::map<SCA_ISensor*,controllerlist>::iterator sit;
|
||||
for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit)
|
||||
{
|
||||
(*sit).second.remove(controller);
|
||||
}
|
||||
controller->Deactivate();
|
||||
}
|
||||
|
||||
|
||||
void SCA_LogicManager::RemoveDestroyedActuator(SCA_IActuator* actuator)
|
||||
void SCA_LogicManager::RemoveActuator(SCA_IActuator* actuator)
|
||||
{
|
||||
m_removedActuators.push_back(SmartActuatorPtr(actuator,0));
|
||||
// take care that no controller can use this actuator again !
|
||||
|
||||
std::map<SCA_ISensor*,controllerlist>::const_iterator sit;
|
||||
for (sit = m_sensorcontrollermapje.begin();!(sit==m_sensorcontrollermapje.end());++sit)
|
||||
{
|
||||
controllerlist contlist = (*sit).second;
|
||||
for (list<SCA_IController*>::const_iterator c= contlist.begin();!(c==contlist.end());c++)
|
||||
{
|
||||
(*c)->UnlinkActuator(actuator);
|
||||
}
|
||||
}
|
||||
actuator->UnlinkAllControllers();
|
||||
actuator->Deactivate();
|
||||
actuator->SetActive(false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_LogicManager::RegisterToSensor(SCA_IController* controller,SCA_ISensor* sensor)
|
||||
{
|
||||
m_sensorcontrollermapje[sensor].push_back(controller);
|
||||
sensor->LinkToController(controller);
|
||||
controller->LinkToSensor(sensor);
|
||||
}
|
||||
|
||||
@@ -220,6 +179,7 @@ void SCA_LogicManager::RegisterToSensor(SCA_IController* controller,SCA_ISensor*
|
||||
|
||||
void SCA_LogicManager::RegisterToActuator(SCA_IController* controller,SCA_IActuator* actua)
|
||||
{
|
||||
actua->LinkToController(controller);
|
||||
controller->LinkToActuator(actua);
|
||||
}
|
||||
|
||||
@@ -230,88 +190,62 @@ void SCA_LogicManager::BeginFrame(double curtime, double fixedtime)
|
||||
for (vector<SCA_EventManager*>::const_iterator ie=m_eventmanagers.begin(); !(ie==m_eventmanagers.end()); ie++)
|
||||
(*ie)->NextFrame(curtime, fixedtime);
|
||||
|
||||
// for this frame, look up for activated sensors, and build the collection of triggered controllers
|
||||
// int numsensors = this->m_activatedsensors.size(); /*unused*/
|
||||
|
||||
for (vector<SCA_ISensor*>::const_iterator is=m_activatedsensors.begin();
|
||||
!(is==m_activatedsensors.end());is++)
|
||||
for(SG_QList* obj = (SG_QList*)m_triggeredControllerSet.Remove();
|
||||
obj != NULL;
|
||||
obj = (SG_QList*)m_triggeredControllerSet.Remove())
|
||||
{
|
||||
SCA_ISensor* sensor = *is;
|
||||
controllerlist contlist = m_sensorcontrollermapje[sensor];
|
||||
for (list<SCA_IController*>::const_iterator c= contlist.begin();
|
||||
!(c==contlist.end());c++)
|
||||
for(SCA_IController* contr = (SCA_IController*)obj->QRemove();
|
||||
contr != NULL;
|
||||
contr = (SCA_IController*)obj->QRemove())
|
||||
{
|
||||
SCA_IController* contr = *c;//controllerarray->at(c);
|
||||
if (contr->IsActive())
|
||||
{
|
||||
m_triggeredControllerSet.insert(SmartControllerPtr(contr,0));
|
||||
// So that the controller knows which sensor has activited it.
|
||||
// Only needed for the python controller though.
|
||||
if (contr->GetType() == &SCA_PythonController::Type)
|
||||
{
|
||||
SCA_PythonController* pythonController = (SCA_PythonController*)contr;
|
||||
pythonController->AddTriggeredSensor(sensor);
|
||||
}
|
||||
}
|
||||
contr->Trigger(this);
|
||||
contr->ClrJustActivated();
|
||||
}
|
||||
//sensor->SetActive(false);
|
||||
}
|
||||
|
||||
|
||||
// int numtriggered = triggeredControllerSet.size(); /*unused*/
|
||||
for (set<SmartControllerPtr>::iterator tit=m_triggeredControllerSet.begin();
|
||||
!(tit==m_triggeredControllerSet.end());tit++)
|
||||
{
|
||||
(*tit)->Trigger(this);
|
||||
}
|
||||
m_triggeredControllerSet.clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_LogicManager::UpdateFrame(double curtime, bool frame)
|
||||
{
|
||||
vector<SmartActuatorPtr>::iterator ra;
|
||||
for (ra = m_removedActuators.begin(); !(ra == m_removedActuators.end()); ra++)
|
||||
{
|
||||
m_activeActuators.erase(*ra);
|
||||
(*ra)->SetActive(false);
|
||||
}
|
||||
m_removedActuators.clear();
|
||||
|
||||
// About to run actuators, but before update the sensors for those which depends on actuators
|
||||
for (vector<SCA_EventManager*>::const_iterator ie=m_eventmanagers.begin(); !(ie==m_eventmanagers.end()); ie++)
|
||||
(*ie)->UpdateFrame();
|
||||
|
||||
for (set<SmartActuatorPtr>::iterator ia = m_activeActuators.begin();!(ia==m_activeActuators.end());ia++)
|
||||
SG_DList::iterator<SG_QList> io(m_activeActuators);
|
||||
for (io.begin(); !io.end(); )
|
||||
{
|
||||
//SCA_IActuator* actua = *ia;
|
||||
if (!(*ia)->Update(curtime, frame))
|
||||
SG_QList* ahead = *io;
|
||||
// increment now so that we can remove the current element
|
||||
++io;
|
||||
SG_QList::iterator<SCA_IActuator> ia(*ahead);
|
||||
for (ia.begin(); !ia.end(); )
|
||||
{
|
||||
//*ia = m_activeactuators.back();
|
||||
m_removedActuators.push_back(*ia);
|
||||
|
||||
(*ia)->SetActive(false);
|
||||
//m_activeactuators.pop_back();
|
||||
} else if ((*ia)->IsNoLink())
|
||||
SCA_IActuator* actua = *ia;
|
||||
// increment first to allow removal of inactive actuators.
|
||||
++ia;
|
||||
if (!actua->Update(curtime, frame))
|
||||
{
|
||||
// this actuator is not active anymore, remove
|
||||
actua->QDelink();
|
||||
actua->SetActive(false);
|
||||
} else if (actua->IsNoLink())
|
||||
{
|
||||
// This actuator has no more links but it still active
|
||||
// make sure it will get a negative event on next frame to stop it
|
||||
// Do this check after Update() rather than before to make sure
|
||||
// that all the actuators that are activated at same time than a state
|
||||
// actuator have a chance to execute.
|
||||
bool event = false;
|
||||
actua->RemoveAllEvents();
|
||||
actua->AddEvent(event);
|
||||
}
|
||||
}
|
||||
if (ahead->QEmpty())
|
||||
{
|
||||
// This actuator has no more links but it still active
|
||||
// make sure it will get a negative event on next frame to stop it
|
||||
// Do this check after Update() rather than before to make sure
|
||||
// that all the actuators that are activated at same time than a state
|
||||
// actuator have a chance to execute.
|
||||
CValue* event = new CBoolValue(false);
|
||||
(*ia)->RemoveAllEvents();
|
||||
(*ia)->AddEvent(event);
|
||||
// no more active controller, remove from main list
|
||||
ahead->Delink();
|
||||
}
|
||||
}
|
||||
|
||||
for ( ra = m_removedActuators.begin(); !(ra == m_removedActuators.end()); ra++)
|
||||
{
|
||||
m_activeActuators.erase(*ra);
|
||||
(*ra)->SetActive(false);
|
||||
}
|
||||
m_removedActuators.clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -360,39 +294,17 @@ void SCA_LogicManager::RegisterActionName(const STR_String& actname,void* action
|
||||
|
||||
void SCA_LogicManager::EndFrame()
|
||||
{
|
||||
for (vector<SCA_ISensor*>::const_iterator is=m_activatedsensors.begin();
|
||||
!(is==m_activatedsensors.end());is++)
|
||||
{
|
||||
SCA_ISensor* sensor = *is;
|
||||
sensor->SetActive(false);
|
||||
}
|
||||
m_activatedsensors.clear();
|
||||
|
||||
for (vector<SCA_EventManager*>::const_iterator ie=m_eventmanagers.begin();
|
||||
!(ie==m_eventmanagers.end());ie++)
|
||||
{
|
||||
(*ie)->EndFrame();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SCA_LogicManager::AddActivatedSensor(SCA_ISensor* sensor)
|
||||
{
|
||||
// each frame, only add sensor once, and to avoid a seek, or bloated container
|
||||
// hold a flag in each sensor, with the 'framenr'
|
||||
if (!sensor->IsActive())
|
||||
{
|
||||
sensor->SetActive(true);
|
||||
m_activatedsensors.push_back(sensor);
|
||||
}
|
||||
}
|
||||
|
||||
void SCA_LogicManager::AddTriggeredController(SCA_IController* controller, SCA_ISensor* sensor)
|
||||
{
|
||||
m_triggeredControllerSet.insert(SmartControllerPtr(controller,0));
|
||||
controller->Activate(m_triggeredControllerSet);
|
||||
// so that the controller knows which sensor has activited it
|
||||
// only needed for python controller
|
||||
if (controller->GetType() == &SCA_PythonController::Type)
|
||||
@@ -402,19 +314,6 @@ void SCA_LogicManager::AddTriggeredController(SCA_IController* controller, SCA_I
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SCA_LogicManager::AddActiveActuator(SCA_IActuator* actua,CValue* event)
|
||||
{
|
||||
if (!actua->IsActive())
|
||||
{
|
||||
actua->SetActive(true);
|
||||
m_activeActuators.insert(SmartActuatorPtr(actua,0));
|
||||
}
|
||||
actua->AddEvent(event->AddRef());
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCA_EventManager* SCA_LogicManager::FindEventManager(int eventmgrtype)
|
||||
{
|
||||
// find an eventmanager of a certain type
|
||||
@@ -432,109 +331,3 @@ SCA_EventManager* SCA_LogicManager::FindEventManager(int eventmgrtype)
|
||||
}
|
||||
return eventmgr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartActuatorPtr::SmartActuatorPtr(const SmartActuatorPtr& other)
|
||||
{
|
||||
this->m_actuator = other.m_actuator;
|
||||
this->m_actuator->AddRef();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartActuatorPtr::SmartActuatorPtr(SCA_IActuator* actua,int dummy)
|
||||
: m_actuator(actua)
|
||||
{
|
||||
actua->AddRef();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartActuatorPtr::~SmartActuatorPtr()
|
||||
{
|
||||
m_actuator->Release();
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SmartActuatorPtr::operator <(const SmartActuatorPtr& other) const
|
||||
{
|
||||
|
||||
return m_actuator->LessComparedTo(*other);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SmartActuatorPtr::operator ==(const SmartActuatorPtr& other) const
|
||||
{
|
||||
bool result2 = other->LessComparedTo(m_actuator);
|
||||
return (m_actuator->LessComparedTo(*other) && result2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCA_IActuator* SmartActuatorPtr::operator->() const
|
||||
{
|
||||
return m_actuator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCA_IActuator* SmartActuatorPtr::operator*() const
|
||||
{
|
||||
return m_actuator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartControllerPtr::SmartControllerPtr(const SmartControllerPtr& copy)
|
||||
{
|
||||
this->m_controller = copy.m_controller;
|
||||
this->m_controller->AddRef();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartControllerPtr::SmartControllerPtr(SCA_IController* contr,int dummy)
|
||||
: m_controller(contr)
|
||||
{
|
||||
m_controller->AddRef();
|
||||
}
|
||||
|
||||
|
||||
|
||||
SmartControllerPtr::~SmartControllerPtr()
|
||||
{
|
||||
m_controller->Release();
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SmartControllerPtr::operator <(const SmartControllerPtr& other) const
|
||||
{
|
||||
return m_controller->LessComparedTo(*other);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool SmartControllerPtr::operator ==(const SmartControllerPtr& other) const
|
||||
{
|
||||
return (m_controller->LessComparedTo(*other) && other->LessComparedTo(m_controller));
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCA_IController* SmartControllerPtr::operator->() const
|
||||
{
|
||||
return m_controller;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SCA_IController* SmartControllerPtr::operator*() const
|
||||
{
|
||||
return m_controller;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user