1 Star 0 Fork 121

blog/kbengine

forked from likecg/kbengine 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
range_trigger.cpp 6.35 KB
一键复制 编辑 原始数据 按行查看 历史
kbengine-srv 提交于 2014-03-29 17:54 +08:00 . teleport 当前进程操控功能完成。
/*
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);
}
}
}
//-------------------------------------------------------------------------------------
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/blog/kbengine.git
git@gitee.com:blog/kbengine.git
blog
kbengine
kbengine
a1b691f57f98fa0bff1bcfb0210ebd07e318c0cd

搜索帮助