From 9b1c0e006f20091f28f3f468cfcab1feb51286bd Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Thu, 2 Oct 2008 16:23:55 -0500 Subject: [svn] * Proper SVN structure --HG-- branch : trunk --- src/shared/vmap/BaseModel.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/shared/vmap/BaseModel.cpp (limited to 'src/shared/vmap/BaseModel.cpp') diff --git a/src/shared/vmap/BaseModel.cpp b/src/shared/vmap/BaseModel.cpp new file mode 100644 index 00000000000..9a1e9fd1002 --- /dev/null +++ b/src/shared/vmap/BaseModel.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2005-2008 MaNGOS + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "BaseModel.h" +#include "VMapTools.h" + +using namespace G3D; + +namespace VMAP +{ + //========================================================== + + void BaseModel::getMember(Array& pMembers) + { + for(unsigned int i=0; i0) iTreeNodes = new TreeNode[iNNodes]; + if(iNTriangles >0) iTriangles = new TriangleBox[iNTriangles]; + } + + //========================================================== + + void BaseModel::free() + { + if(getTriangles() != 0) delete [] getTriangles(); setNTriangles(0); + if(getTreeNodes() != 0) delete [] getTreeNodes(); setNNodes(0); + } + + //========================================================== + + void BaseModel::intersect(const G3D::AABox& pBox, const G3D::Ray& pRay, float& pMaxDist, G3D::Vector3& pOutLocation, G3D::Vector3& /*pOutNormal*/) const + { + bool isInside = false; + + float d = MyCollisionDetection::collisionLocationForMovingPointFixedAABox( + pRay.origin, pRay.direction, + pBox, + pOutLocation, isInside); + if (!isInside && ((d > 0) && (d < pMaxDist))) + { + pMaxDist = d; + } + } + + //========================================================== + + bool BaseModel::intersect(const G3D::AABox& pBox, const G3D::Ray& pRay, float& pMaxDist) const + { + // See if the ray will ever hit this node or its children + Vector3 location; + bool alreadyInsideBounds = false; + bool rayWillHitBounds = + MyCollisionDetection::collisionLocationForMovingPointFixedAABox( + pRay.origin, pRay.direction, pBox, location, alreadyInsideBounds); + + bool canHitThisNode = (alreadyInsideBounds || + (rayWillHitBounds && ((location - pRay.origin).squaredLength() < (pMaxDist * pMaxDist)))); + + return canHitThisNode; + } + +} // VMAP -- cgit v1.2.3