![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2009 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 00006 00007 #pragma once 00008 00009 #include "bhaveSim/kynapseCollisionTests.h" 00010 #include "kypathdata/navmesh/navmeshtypes.h" 00011 #include "kypathdata/generic/memory.h" 00012 #include "kypathdata/math/vec3f.h" 00013 #include "kypathdata/navmesh/closestpoint.h" 00014 00015 #include "bhaveSim/pieCollisionQuery.h" 00016 00017 namespace BHAVE 00018 { 00019 00020 /* 00021 class PieIntersector 00022 */ 00023 class DtPieIntersector 00024 { 00025 KY_DEFINE_NEW_DELETE_OPERATORS 00026 00027 public: 00028 DtPieIntersector(const DtPieCollisionQuery& query, const Kaim::ActiveNavCellGrid& activeNavCellGrid, KyFloat32 startingRadian, KyFloat32 endingRadian) : 00029 m_integerPrecision(activeNavCellGrid.m_integerPrecision), 00030 myStartingRadian(startingRadian), myEndingRadian(endingRadian), 00031 m_center3f(query.m_centerPos3f), m_radius(query.m_radius) {} 00032 00033 KY_FORCE_INLINE bool DoesIntersectEdge(const Kaim::CoordPos64& startEdgeCoordPos, const Kaim::CoordPos64& endEdgeCoordPos) 00034 { 00035 const Kaim::Vec3f startEdgePos(startEdgeCoordPos.x * m_integerPrecision, startEdgeCoordPos.y * m_integerPrecision, 0.f); 00036 const Kaim::Vec3f endEdgePos(endEdgeCoordPos.x * m_integerPrecision, endEdgeCoordPos.y * m_integerPrecision, 0.f); 00037 00038 return SegmentVsPie2d(startEdgePos, endEdgePos, m_center3f, m_radius, myStartingRadian, myEndingRadian); 00039 } 00040 00041 KY_FORCE_INLINE void ComputeCollisionPosOnEdge(const Kaim::CoordPos64& startEdgeCoordPos, const Kaim::CoordPos64& endEdgeCoordPos, Kaim::Vec3f& collisionPos, KyFloat32& squareDistToCollisionPos) 00042 { 00043 const Kaim::Vec3f startEdgePos(startEdgeCoordPos.x * m_integerPrecision, startEdgeCoordPos.y * m_integerPrecision, 0.f); 00044 const Kaim::Vec3f endEdgePos(endEdgeCoordPos.x * m_integerPrecision, endEdgeCoordPos.y * m_integerPrecision, 0.f); 00045 00046 Kaim::ClosestPoint::OnSegmentVsPoint2d(startEdgePos, endEdgePos, m_center3f, collisionPos, squareDistToCollisionPos); 00047 } 00048 00049 KY_FORCE_INLINE void ComputeTriangleCost(const Kaim::CoordPos64& v0CoordPos, const Kaim::CoordPos64& v1CoordPos, const Kaim::CoordPos64& v2CoordPos, KyFloat32& cost) 00050 { 00051 const Kaim::Vec3f v0(v0CoordPos.x * m_integerPrecision, v0CoordPos.y * m_integerPrecision, 0.f); 00052 const Kaim::Vec3f v1(v1CoordPos.x * m_integerPrecision, v1CoordPos.y * m_integerPrecision, 0.f); 00053 const Kaim::Vec3f v2(v2CoordPos.x * m_integerPrecision, v2CoordPos.y * m_integerPrecision, 0.f); 00054 00055 Kaim::Vec3f unused; 00056 Kaim::ClosestPoint::OnTriangleVsPoint2d(v0, v1, v2, m_center3f, unused, cost); 00057 } 00058 00059 private: 00060 KyFloat32 m_integerPrecision; 00061 00062 Kaim::Vec3f m_center3f; 00063 KyFloat32 myStartingRadian; 00064 KyFloat32 myEndingRadian; 00065 00066 KyFloat32 m_radius; 00067 }; 00068 00069 } 00070