代码拉取完成,页面将自动刷新
同步操作将从 likecg/kbengine 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/*
This source file is part of KBEngine
For the latest info, see http://www.kbengine.org/
Copyright (c) 2008-2012 KBEngine.
KBEngine is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KBEngine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with KBEngine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "range_trigger.hpp"
#include "range_list.hpp"
#include "entity_range_node.hpp"
#include "range_trigger_node.hpp"
#ifndef CODE_INLINE
#include "range_trigger.ipp"
#endif
namespace KBEngine{
//-------------------------------------------------------------------------------------
RangeTrigger::RangeTrigger(RangeNode* origin, float xz, float y):
range_xz_(fabs(xz)),
range_y_(fabs(y)),
origin_(origin),
positiveBoundary_(NULL),
negativeBoundary_(NULL)
{
}
//-------------------------------------------------------------------------------------
RangeTrigger::~RangeTrigger()
{
uninstall();
}
//-------------------------------------------------------------------------------------
bool RangeTrigger::reinstall(RangeNode* pRangeNode)
{
uninstall();
origin_ = pRangeNode;
return install();
}
//-------------------------------------------------------------------------------------
bool RangeTrigger::install()
{
if(positiveBoundary_ == NULL)
positiveBoundary_ = new RangeTriggerNode(this, 0, 0);
else
positiveBoundary_->range(0.0f, 0.0f);
if(negativeBoundary_ == NULL)
negativeBoundary_ = new RangeTriggerNode(this, 0, 0);
else
negativeBoundary_->range(0.0f, 0.0f);
origin_->pRangeList()->insert(positiveBoundary_);
origin_->pRangeList()->insert(negativeBoundary_);
positiveBoundary_->old_xx(FLT_MAX);
positiveBoundary_->old_yy(FLT_MAX);
positiveBoundary_->old_zz(FLT_MAX);
positiveBoundary_->range(range_xz_, range_y_);
positiveBoundary_->old_range(range_xz_, range_y_);
positiveBoundary_->update();
negativeBoundary_->old_xx(-FLT_MAX);
negativeBoundary_->old_yy(-FLT_MAX);
negativeBoundary_->old_zz(-FLT_MAX);
negativeBoundary_->range(-range_xz_, -range_y_);
negativeBoundary_->old_range(-range_xz_, -range_y_);
negativeBoundary_->update();
return true;
}
//-------------------------------------------------------------------------------------
bool RangeTrigger::uninstall()
{
if(positiveBoundary_ && positiveBoundary_->pRangeList())
{
positiveBoundary_->pRangeTrigger(NULL);
positiveBoundary_->pRangeList()->remove(positiveBoundary_);
}
if(negativeBoundary_ && negativeBoundary_->pRangeList())
{
negativeBoundary_->pRangeTrigger(NULL);
negativeBoundary_->pRangeList()->remove(negativeBoundary_);
}
// 此处不必release node, 节点的释放统一交给rangelist
positiveBoundary_ = NULL;
negativeBoundary_ = NULL;
return true;
}
//-------------------------------------------------------------------------------------
void RangeTrigger::onNodePassX(RangeTriggerNode* pRangeTriggerNode, RangeNode* pNode, bool isfront)
{
if(pNode == origin())
return;
bool wasInZ = pRangeTriggerNode->wasInZRange(pNode);
bool isInZ = pRangeTriggerNode->isInZRange(pNode);
if(wasInZ != isInZ)
return;
bool wasIn = false;
bool isIn = false;
if(RangeList::hasY)
{
bool wasInY = pRangeTriggerNode->wasInYRange(pNode);
bool isInY = pRangeTriggerNode->isInYRange(pNode);
if(wasInY != isInY)
return;
wasIn = pRangeTriggerNode->wasInXRange(pNode) && wasInY && wasInZ;
isIn = pRangeTriggerNode->isInXRange(pNode) && isInY && isInZ;
}
else
{
wasIn = pRangeTriggerNode->wasInXRange(pNode) && wasInZ;
isIn = pRangeTriggerNode->isInXRange(pNode) && isInZ;
}
if(wasIn == isIn)
return;
if(isIn)
{
this->onEnter(pNode);
}
else
{
this->onLeave(pNode);
}
}
//-------------------------------------------------------------------------------------
bool RangeTriggerNode::wasInYRange(RangeNode * pNode)
{
if(!RangeList::hasY)
return true;
float originY = old_yy() - old_range_y_;
volatile float lowerBound = originY - fabs(old_range_y_);
volatile float upperBound = originY + fabs(old_range_y_);
return (lowerBound < pNode->old_yy()) && (pNode->old_yy() <= upperBound);
}
//-------------------------------------------------------------------------------------
void RangeTrigger::onNodePassY(RangeTriggerNode* pRangeTriggerNode, RangeNode* pNode, bool isfront)
{
if(pNode == origin() || !RangeList::hasY)
return;
bool wasInZ = pRangeTriggerNode->wasInZRange(pNode);
bool isInZ = pRangeTriggerNode->isInZRange(pNode);
if(wasInZ != isInZ)
return;
bool wasInY = pRangeTriggerNode->wasInYRange(pNode);
bool isInY = pRangeTriggerNode->isInYRange(pNode);
if(wasInY == isInY)
return;
bool wasIn = pRangeTriggerNode->wasInXRange(pNode) && wasInY && wasInZ;
bool isIn = pRangeTriggerNode->isInXRange(pNode) && isInY && isInZ;
if(wasIn == isIn)
return;
if(isIn)
{
this->onEnter(pNode);
}
else
{
this->onLeave(pNode);
}
}
//-------------------------------------------------------------------------------------
void RangeTrigger::onNodePassZ(RangeTriggerNode* pRangeTriggerNode, RangeNode* pNode, bool isfront)
{
if(pNode == origin())
return;
if(RangeList::hasY)
{
bool wasInZ = pRangeTriggerNode->wasInZRange(pNode);
bool isInZ = pRangeTriggerNode->isInZRange(pNode);
if(wasInZ == isInZ)
return;
bool wasIn = pRangeTriggerNode->wasInXRange(pNode) &&
pRangeTriggerNode->wasInYRange(pNode) &&
wasInZ;
bool isIn = pRangeTriggerNode->isInXRange(pNode) &&
pRangeTriggerNode->isInYRange(pNode) &&
isInZ;
if(wasIn == isIn)
return;
if(isIn)
{
this->onEnter(pNode);
}
else
{
this->onLeave(pNode);
}
}
else
{
bool wasInZ = pRangeTriggerNode->wasInZRange(pNode);
bool isInZ = pRangeTriggerNode->isInZRange(pNode);
if(wasInZ == isInZ)
return;
bool wasIn = pRangeTriggerNode->wasInXRange(pNode) && wasInZ;
bool isIn = pRangeTriggerNode->isInXRange(pNode) && isInZ;
if(wasIn == isIn)
return;
if(isIn)
{
this->onEnter(pNode);
}
else
{
this->onLeave(pNode);
}
}
}
//-------------------------------------------------------------------------------------
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。