diff options
author | StormBytePP <stormbyte@gmail.com> | 2015-08-19 19:02:10 +0200 |
---|---|---|
committer | StormBytePP <stormbyte@gmail.com> | 2015-08-21 17:52:42 +0200 |
commit | 1d2aafd39bcb79a67357d198ce9b2345642fdd39 (patch) | |
tree | c32cf1c3717625c60da59c82ba5a4fca2530119a /src/server/collision/DynamicTree.cpp | |
parent | 172293acee1607727ebd8070ab3e1390590d02a8 (diff) |
Core/Build: Merge common library and move database out of shared
Diffstat (limited to 'src/server/collision/DynamicTree.cpp')
-rw-r--r-- | src/server/collision/DynamicTree.cpp | 260 |
1 files changed, 0 insertions, 260 deletions
diff --git a/src/server/collision/DynamicTree.cpp b/src/server/collision/DynamicTree.cpp deleted file mode 100644 index 1de2543543d..00000000000 --- a/src/server/collision/DynamicTree.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program 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 General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "DynamicTree.h" -//#include "QuadTree.h" -//#include "RegularGrid.h" -#include "BoundingIntervalHierarchyWrapper.h" - -#include "Log.h" -#include "RegularGrid.h" -#include "Timer.h" -#include "GameObjectModel.h" -#include "ModelInstance.h" - -#include <G3D/AABox.h> -#include <G3D/Ray.h> -#include <G3D/Vector3.h> - -using VMAP::ModelInstance; - -namespace { - -int CHECK_TREE_PERIOD = 200; - -} // namespace - -template<> struct HashTrait< GameObjectModel>{ - static size_t hashCode(const GameObjectModel& g) { return (size_t)(void*)&g; } -}; - -template<> struct PositionTrait< GameObjectModel> { - static void getPosition(const GameObjectModel& g, G3D::Vector3& p) { p = g.getPosition(); } -}; - -template<> struct BoundsTrait< GameObjectModel> { - static void getBounds(const GameObjectModel& g, G3D::AABox& out) { out = g.getBounds();} - static void getBounds2(const GameObjectModel* g, G3D::AABox& out) { out = g->getBounds();} -}; - -/* -static bool operator == (const GameObjectModel& mdl, const GameObjectModel& mdl2){ - return &mdl == &mdl2; -} -*/ - -typedef RegularGrid2D<GameObjectModel, BIHWrap<GameObjectModel> > ParentTree; - -struct DynTreeImpl : public ParentTree/*, public Intersectable*/ -{ - typedef GameObjectModel Model; - typedef ParentTree base; - - DynTreeImpl() : - rebalance_timer(CHECK_TREE_PERIOD), - unbalanced_times(0) - { - } - - void insert(const Model& mdl) - { - base::insert(mdl); - ++unbalanced_times; - } - - void remove(const Model& mdl) - { - base::remove(mdl); - ++unbalanced_times; - } - - void balance() - { - base::balance(); - unbalanced_times = 0; - } - - void update(uint32 difftime) - { - if (!size()) - return; - - rebalance_timer.Update(difftime); - if (rebalance_timer.Passed()) - { - rebalance_timer.Reset(CHECK_TREE_PERIOD); - if (unbalanced_times > 0) - balance(); - } - } - - TimeTrackerSmall rebalance_timer; - int unbalanced_times; -}; - -DynamicMapTree::DynamicMapTree() : impl(new DynTreeImpl()) { } - -DynamicMapTree::~DynamicMapTree() -{ - delete impl; -} - -void DynamicMapTree::insert(const GameObjectModel& mdl) -{ - impl->insert(mdl); -} - -void DynamicMapTree::remove(const GameObjectModel& mdl) -{ - impl->remove(mdl); -} - -bool DynamicMapTree::contains(const GameObjectModel& mdl) const -{ - return impl->contains(mdl); -} - -void DynamicMapTree::balance() -{ - impl->balance(); -} - -int DynamicMapTree::size() const -{ - return impl->size(); -} - -void DynamicMapTree::update(uint32 t_diff) -{ - impl->update(t_diff); -} - -struct DynamicTreeIntersectionCallback -{ - bool did_hit; - uint32 phase_mask; - DynamicTreeIntersectionCallback(uint32 phasemask) : did_hit(false), phase_mask(phasemask) { } - bool operator()(const G3D::Ray& r, const GameObjectModel& obj, float& distance) - { - did_hit = obj.intersectRay(r, distance, true, phase_mask); - return did_hit; - } - bool didHit() const { return did_hit;} -}; - -struct DynamicTreeIntersectionCallback_WithLogger -{ - bool did_hit; - uint32 phase_mask; - DynamicTreeIntersectionCallback_WithLogger(uint32 phasemask) : did_hit(false), phase_mask(phasemask) - { - TC_LOG_DEBUG("maps", "Dynamic Intersection log"); - } - bool operator()(const G3D::Ray& r, const GameObjectModel& obj, float& distance) - { - TC_LOG_DEBUG("maps", "testing intersection with %s", obj.name.c_str()); - bool hit = obj.intersectRay(r, distance, true, phase_mask); - if (hit) - { - did_hit = true; - TC_LOG_DEBUG("maps", "result: intersects"); - } - return hit; - } - bool didHit() const { return did_hit;} -}; - -bool DynamicMapTree::getIntersectionTime(const uint32 phasemask, const G3D::Ray& ray, - const G3D::Vector3& endPos, float& maxDist) const -{ - float distance = maxDist; - DynamicTreeIntersectionCallback callback(phasemask); - impl->intersectRay(ray, callback, distance, endPos); - if (callback.didHit()) - maxDist = distance; - return callback.didHit(); -} - -bool DynamicMapTree::getObjectHitPos(const uint32 phasemask, const G3D::Vector3& startPos, - const G3D::Vector3& endPos, G3D::Vector3& resultHit, - float modifyDist) const -{ - bool result = false; - float maxDist = (endPos - startPos).magnitude(); - // valid map coords should *never ever* produce float overflow, but this would produce NaNs too - ASSERT(maxDist < std::numeric_limits<float>::max()); - // prevent NaN values which can cause BIH intersection to enter infinite loop - if (maxDist < 1e-10f) - { - resultHit = endPos; - return false; - } - G3D::Vector3 dir = (endPos - startPos)/maxDist; // direction with length of 1 - G3D::Ray ray(startPos, dir); - float dist = maxDist; - if (getIntersectionTime(phasemask, ray, endPos, dist)) - { - resultHit = startPos + dir * dist; - if (modifyDist < 0) - { - if ((resultHit - startPos).magnitude() > -modifyDist) - resultHit = resultHit + dir*modifyDist; - else - resultHit = startPos; - } - else - resultHit = resultHit + dir*modifyDist; - - result = true; - } - else - { - resultHit = endPos; - result = false; - } - return result; -} - -bool DynamicMapTree::isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask) const -{ - G3D::Vector3 v1(x1, y1, z1), v2(x2, y2, z2); - - float maxDist = (v2 - v1).magnitude(); - - if (!G3D::fuzzyGt(maxDist, 0) ) - return true; - - G3D::Ray r(v1, (v2-v1) / maxDist); - DynamicTreeIntersectionCallback callback(phasemask); - impl->intersectRay(r, callback, maxDist, v2); - - return !callback.did_hit; -} - -float DynamicMapTree::getHeight(float x, float y, float z, float maxSearchDist, uint32 phasemask) const -{ - G3D::Vector3 v(x, y, z); - G3D::Ray r(v, G3D::Vector3(0, 0, -1)); - DynamicTreeIntersectionCallback callback(phasemask); - impl->intersectZAllignedRay(r, callback, maxSearchDist); - - if (callback.didHit()) - return v.z - maxSearchDist; - else - return -G3D::finf(); -} |