Fix incorrect blocked LOS-calculation on certain locations (by Lynx3d)

--HG--
branch : trunk
This commit is contained in:
click
2010-07-10 05:14:05 +02:00
parent 89ea8ccdf9
commit 478946284d
3 changed files with 29 additions and 22 deletions
+23 -19
View File
@@ -41,13 +41,18 @@ namespace VMAP
class MapRayCallback class MapRayCallback
{ {
public: public:
MapRayCallback(ModelInstance *val): prims(val) {} MapRayCallback(ModelInstance *val): prims(val), hit(false) {}
ModelInstance *prims;
bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool pStopAtFirstHit=true) bool operator()(const G3D::Ray& ray, uint32 entry, float& distance, bool pStopAtFirstHit=true)
{ {
return prims[entry].intersectRay(ray, distance, pStopAtFirstHit); bool result = prims[entry].intersectRay(ray, distance, pStopAtFirstHit);
//std::cout << "trying to intersect '" << entity->name << "'\n"; if (result)
hit = true;
return result;
} }
bool didHit() { return hit; }
protected:
ModelInstances *prims;
bool hit;
}; };
class AreaInfoCallback class AreaInfoCallback
@@ -138,21 +143,23 @@ namespace VMAP
//========================================================= //=========================================================
/** /**
return dist to hit or inf() if no hit If intersection is found within pMaxDist, sets pMaxDist to intersection distance and returns true.
Else, pMaxDist is not modified and returns false;
*/ */
float StaticMapTree::getIntersectionTime(const G3D::Ray& pRay, float pMaxDist, bool pStopAtFirstHit) const bool StaticMapTree::getIntersectionTime(const G3D::Ray& pRay, float &pMaxDist, bool pStopAtFirstHit) const
{ {
float distance = pMaxDist; float distance = pMaxDist;
MapRayCallback intersectionCallBack(iTreeValues); MapRayCallback intersectionCallBack(iTreeValues);
iTree.intersectRay(pRay, intersectionCallBack, distance, pStopAtFirstHit); iTree.intersectRay(pRay, intersectionCallBack, distance, pStopAtFirstHit);
return distance; if (intersectionCallBack.didHit())
pMaxDist = distance;
return intersectionCallBack.didHit();
} }
//========================================================= //=========================================================
bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2) const bool StaticMapTree::isInLineOfSight(const Vector3& pos1, const Vector3& pos2) const
{ {
bool result = true;
float maxDist = (pos2 - pos1).magnitude(); float maxDist = (pos2 - pos1).magnitude();
// valid map coords should *never ever* produce float overflow, but this would produce NaNs too // valid map coords should *never ever* produce float overflow, but this would produce NaNs too
ASSERT(maxDist < std::numeric_limits<float>::max()); ASSERT(maxDist < std::numeric_limits<float>::max());
@@ -161,12 +168,10 @@ namespace VMAP
return true; return true;
// direction with length of 1 // direction with length of 1
G3D::Ray ray = G3D::Ray::fromOriginAndDirection(pos1, (pos2 - pos1)/maxDist); G3D::Ray ray = G3D::Ray::fromOriginAndDirection(pos1, (pos2 - pos1)/maxDist);
float resultDist = getIntersectionTime(ray, maxDist, true); if (getIntersectionTime(ray, maxDist, true))
if (resultDist < maxDist) return false;
{
result = false; return true;
}
return result;
} }
//========================================================= //=========================================================
/** /**
@@ -188,8 +193,8 @@ namespace VMAP
} }
Vector3 dir = (pPos2 - pPos1)/maxDist; // direction with length of 1 Vector3 dir = (pPos2 - pPos1)/maxDist; // direction with length of 1
G3D::Ray ray(pPos1, dir); G3D::Ray ray(pPos1, dir);
float dist = getIntersectionTime(ray, maxDist, false); float dist = maxDist;
if (dist < maxDist) if (getIntersectionTime(ray, dist, false))
{ {
pResultHitPos = pPos1 + dir * dist; pResultHitPos = pPos1 + dir * dist;
if (pModifyDist < 0) if (pModifyDist < 0)
@@ -225,10 +230,9 @@ namespace VMAP
Vector3 dir = Vector3(0,0,-1); Vector3 dir = Vector3(0,0,-1);
G3D::Ray ray(pPos, dir); // direction with length of 1 G3D::Ray ray(pPos, dir); // direction with length of 1
float maxDist = VMapDefinitions::getMaxCanFallDistance(); float maxDist = VMapDefinitions::getMaxCanFallDistance();
float dist = getIntersectionTime(ray, maxDist, false); if (getIntersectionTime(ray, maxDist, false))
if (dist < maxDist)
{ {
height = pPos.z - dist; height = pPos.z - maxDist;
} }
return(height); return(height);
} }
+1 -1
View File
@@ -57,7 +57,7 @@ namespace VMAP
std::string iBasePath; std::string iBasePath;
private: private:
float getIntersectionTime(const G3D::Ray& pRay, float pMaxDist, bool pStopAtFirstHit) const; bool getIntersectionTime(const G3D::Ray& pRay, float &pMaxDist, bool pStopAtFirstHit) const;
//bool containsLoadedMapTile(unsigned int pTileIdent) const { return(iLoadedMapTiles.containsKey(pTileIdent)); } //bool containsLoadedMapTile(unsigned int pTileIdent) const { return(iLoadedMapTiles.containsKey(pTileIdent)); }
public: public:
static std::string getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY); static std::string getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY);
@@ -57,8 +57,11 @@ namespace VMAP
Ray modRay(p, iInvRot * pRay.direction()); Ray modRay(p, iInvRot * pRay.direction());
float distance = pMaxDist * iInvScale; float distance = pMaxDist * iInvScale;
bool hit = iModel->IntersectRay(modRay, distance, pStopAtFirstHit); bool hit = iModel->IntersectRay(modRay, distance, pStopAtFirstHit);
distance *= iScale; if(hit)
pMaxDist = distance; {
distance *= iScale;
pMaxDist = distance;
}
return hit; return hit;
} }