2015-03-02 13:07:32 +08:00
|
|
|
/****************************************************************************
|
2015-03-02 16:05:26 +08:00
|
|
|
Copyright (C) 2013 Henry van Merode. All rights reserved.
|
|
|
|
Copyright (c) 2015 Chukong Technologies Inc.
|
2015-03-02 13:07:32 +08:00
|
|
|
|
|
|
|
http://www.cocos2d-x.org
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
#include "extensions/Particle3D/PU/CCPUObserver.h"
|
|
|
|
#include "extensions/Particle3D/PU/CCPUEventHandler.h"
|
|
|
|
#include "extensions/Particle3D/PU/CCPUEventHandlerManager.h"
|
2015-03-02 13:07:32 +08:00
|
|
|
#include "base/ccMacros.h"
|
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
|
|
|
|
// Constants
|
2015-03-05 13:24:06 +08:00
|
|
|
const bool PUObserver::DEFAULT_ENABLED = true;
|
|
|
|
const PUParticle3D::ParticleType PUObserver::DEFAULT_PARTICLE_TYPE = PUParticle3D::PT_VISUAL;
|
|
|
|
const float PUObserver::DEFAULT_INTERVAL = 0.05f;
|
|
|
|
const bool PUObserver::DEFAULT_UNTIL_EVENT = false;
|
2015-03-02 13:07:32 +08:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
PUObserver::PUObserver(void) :
|
2015-03-02 13:07:32 +08:00
|
|
|
_particleSystem(nullptr),
|
|
|
|
_enabled(DEFAULT_ENABLED),
|
|
|
|
_originalEnabled(DEFAULT_ENABLED),
|
|
|
|
_originalEnabledSet(false),
|
|
|
|
_observe(true),
|
|
|
|
_particleTypeToObserve(DEFAULT_PARTICLE_TYPE),
|
|
|
|
_particleTypeToObserveSet(false),
|
|
|
|
_observerScale(Vec3::ONE),
|
|
|
|
_observerInterval(DEFAULT_INTERVAL),
|
|
|
|
_observerIntervalRemainder(0.0),
|
|
|
|
_observerIntervalSet(false),
|
|
|
|
_observeUntilEvent(DEFAULT_UNTIL_EVENT),
|
|
|
|
_eventHandlersExecuted(false)
|
|
|
|
{
|
|
|
|
//mAliasType = AT_OBSERVER;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
PUObserver::~PUObserver(void)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
destroyAllEventHandlers();
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::notifyStart (void)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_eventHandlersExecuted = false;
|
|
|
|
_observe = true;
|
|
|
|
setEnabled(_originalEnabled);
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
bool PUObserver::isEnabled(void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _enabled;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
bool PUObserver::_getOriginalEnabled(void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _originalEnabled;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::setEnabled(bool enabled)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_enabled = enabled;
|
|
|
|
if (!_originalEnabledSet)
|
|
|
|
{
|
|
|
|
// Only one time is permitted
|
|
|
|
_originalEnabled = enabled;
|
|
|
|
_originalEnabledSet = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::_resetEnabled(void)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_originalEnabledSet = false;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
float PUObserver::getObserverInterval(void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _observerInterval;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::setObserverInterval(float observerInterval)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_observerInterval = observerInterval;
|
|
|
|
_observerIntervalSet = true;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
bool PUObserver::getObserveUntilEvent(void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _observeUntilEvent;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::setObserveUntilEvent(bool observeUntilEvent)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_observeUntilEvent = observeUntilEvent;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::notifyRescaled(const Vec3& scale)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_observerScale = scale;
|
|
|
|
|
|
|
|
if (_eventHandlers.empty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
ParticleEventHandlerConstIterator it;
|
|
|
|
ParticleEventHandlerConstIterator itEnd = _eventHandlers.end();
|
|
|
|
for (it = _eventHandlers.begin(); it != itEnd; ++it)
|
|
|
|
{
|
|
|
|
(*it)->notifyRescaled(scale);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler* PUObserver::createEventHandler(const std::string& eventHandlerType)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler* eventHandler = PUEventHandlerManager::Instance()->createEventHandler(eventHandlerType);
|
2015-03-02 13:07:32 +08:00
|
|
|
addEventHandler(eventHandler);
|
|
|
|
return eventHandler;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::addEventHandler(PUEventHandler* eventHandler)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
eventHandler->retain();
|
|
|
|
_eventHandlers.push_back(eventHandler);
|
|
|
|
eventHandler->setParentObserver(this);
|
|
|
|
eventHandler->notifyRescaled(_observerScale);
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::removeEventHandler(PUEventHandler* eventHandler)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
ParticleEventHandlerIterator it;
|
|
|
|
for (it = _eventHandlers.begin(); it != _eventHandlers.end(); ++it)
|
|
|
|
{
|
|
|
|
if (*it == eventHandler)
|
|
|
|
{
|
|
|
|
// Remove it
|
|
|
|
(*it)->release();
|
|
|
|
_eventHandlers.erase(it);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
eventHandler->setParentObserver(0);
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler* PUObserver::getEventHandler (size_t index) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
CCASSERT(index < _eventHandlers.size(), "EventHandler index out of bounds!");
|
|
|
|
return _eventHandlers[index];
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler* PUObserver::getEventHandler (const std::string& eventHandlerName) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
if (eventHandlerName.empty())
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
ParticleEventHandlerConstIterator it;
|
|
|
|
ParticleEventHandlerConstIterator itEnd = _eventHandlers.end();
|
|
|
|
for (it = _eventHandlers.begin(); it != itEnd; ++it)
|
|
|
|
{
|
|
|
|
if ((*it)->getName() == eventHandlerName)
|
|
|
|
{
|
|
|
|
return *it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
size_t PUObserver::getNumEventHandlers (void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _eventHandlers.size();
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::destroyEventHandler(PUEventHandler* eventHandler)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
CCASSERT(eventHandler, "EventHandler is null!");
|
|
|
|
ParticleEventHandlerIterator it;
|
|
|
|
for (it = _eventHandlers.begin(); it != _eventHandlers.end(); ++it)
|
|
|
|
{
|
|
|
|
if (*it == eventHandler)
|
|
|
|
{
|
|
|
|
// Detroy it
|
|
|
|
//ParticleSystemManager::getSingletonPtr()->destroyEventHandler(*it);
|
|
|
|
(*it)->release();
|
|
|
|
_eventHandlers.erase(it);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::destroyEventHandler (size_t index)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
destroyEventHandler(getEventHandler(index));
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::destroyAllEventHandlers (void)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
ParticleEventHandlerIterator it;
|
|
|
|
for (it = _eventHandlers.begin(); it != _eventHandlers.end(); ++it)
|
|
|
|
{
|
|
|
|
(*it)->release();
|
|
|
|
//ParticleSystemManager::getSingletonPtr()->destroyEventHandler(*it);
|
|
|
|
}
|
|
|
|
_eventHandlers.clear();
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::setParticleTypeToObserve(const PUParticle3D::ParticleType particleTypeToObserve)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
_particleTypeToObserve = particleTypeToObserve;
|
|
|
|
_particleTypeToObserveSet = true;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::handleObserve (PUParticle3D* particle, float timeElapsed)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
if (_enabled && _observe)
|
|
|
|
{
|
|
|
|
if (_observeUntilEvent && _eventHandlersExecuted)
|
|
|
|
{
|
|
|
|
// Don't continue if mObserveUntilEvent is set and the event handlers are already called once.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (observe(particle, timeElapsed))
|
|
|
|
{
|
|
|
|
// Handle the event
|
|
|
|
handleEvent (particle, timeElapsed);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::handleEvent (PUParticle3D* particle, float timeElapsed)
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
if (_eventHandlers.empty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
ParticleEventHandlerConstIterator it;
|
|
|
|
ParticleEventHandlerConstIterator itEnd = _eventHandlers.end();
|
|
|
|
for (it = _eventHandlers.begin(); it != itEnd; ++it)
|
|
|
|
{
|
|
|
|
(*it)->handle(_particleSystem, particle, timeElapsed);
|
|
|
|
}
|
|
|
|
_eventHandlersExecuted = true;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
2015-03-05 13:24:06 +08:00
|
|
|
bool PUObserver::isParticleTypeToObserveSet(void) const
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
return _particleTypeToObserveSet;
|
|
|
|
}
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::preUpdateObserver( float deltaTime )
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
if (!_enabled)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (_observerIntervalSet)
|
|
|
|
{
|
|
|
|
_observerIntervalRemainder -= deltaTime;
|
|
|
|
if (_observerIntervalRemainder < 0)
|
|
|
|
{
|
|
|
|
_observerIntervalRemainder += _observerInterval;
|
|
|
|
_observe = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_observe = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::updateObserver( PUParticle3D *particle, float deltaTime, bool firstParticle )
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
if (!_enabled)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Call the _firstParticle() function if the first particle in the update loop is encountered.
|
|
|
|
if (firstParticle)
|
|
|
|
{
|
|
|
|
firstParticleUpdate(particle, deltaTime);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_particleTypeToObserveSet && particle->particleType != _particleTypeToObserve)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Observe
|
|
|
|
handleObserve(particle, deltaTime);
|
|
|
|
}
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::postUpdateObserver( float deltaTime )
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::firstParticleUpdate( PUParticle3D *particle, float deltaTime )
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-03-05 13:24:06 +08:00
|
|
|
void PUObserver::copyAttributesTo( PUObserver* observer )
|
2015-03-02 13:07:32 +08:00
|
|
|
{
|
|
|
|
// Copy attributes
|
|
|
|
observer->setName(_name);
|
2015-04-15 12:44:03 +08:00
|
|
|
observer->setObserverType(_observerType);
|
2015-03-02 13:07:32 +08:00
|
|
|
observer->_particleTypeToObserve = _particleTypeToObserve;
|
|
|
|
observer->_particleTypeToObserveSet = _particleTypeToObserveSet;
|
|
|
|
observer->_particleSystem = _particleSystem;
|
|
|
|
observer->_observerScale = _observerScale;
|
|
|
|
observer->_observerInterval = _observerInterval;
|
|
|
|
observer->_observerIntervalRemainder = _observerIntervalRemainder;
|
|
|
|
observer->_observerIntervalSet = _observerIntervalSet;
|
|
|
|
observer->_observeUntilEvent = _observeUntilEvent;
|
|
|
|
observer->_eventHandlersExecuted = _eventHandlersExecuted;
|
|
|
|
observer->_enabled = _enabled;
|
|
|
|
observer->_originalEnabled = _originalEnabled;
|
|
|
|
observer->_originalEnabledSet = _originalEnabledSet;
|
|
|
|
|
|
|
|
// Copy event handlers
|
|
|
|
size_t i = 0;
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler* eventHandler = 0;
|
2015-03-02 13:07:32 +08:00
|
|
|
for(i = 0; i < getNumEventHandlers(); ++i)
|
|
|
|
{
|
|
|
|
eventHandler = getEventHandler(i);
|
2015-03-05 13:24:06 +08:00
|
|
|
PUEventHandler *clonedEventHandler = PUEventHandlerManager::Instance()->createEventHandler(eventHandler->getEventHandlerType());
|
2015-03-02 13:07:32 +08:00
|
|
|
eventHandler->copyAttributesTo(clonedEventHandler);
|
|
|
|
observer->addEventHandler(clonedEventHandler);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_CC_END
|