[11305] more safe code in vmaps and Field class

Signed-off-by: Ambal <pogrebniak@gala.net>
This commit is contained in:
Ambal 2011-04-02 17:30:17 +03:00
parent 1fea8a321f
commit 43db4eaaa2
5 changed files with 10 additions and 13 deletions

View file

@ -127,7 +127,7 @@ void BIH::subdivide(int left, int right, std::vector<uint32> &tempTree, buildDat
if (right == rightOrig) if (right == rightOrig)
{ {
// all left // all left
if (prevAxis == axis && prevSplit == split) { if (prevAxis == axis && G3D::fuzzyEq(prevSplit, split)) {
// we are stuck here - create a leaf // we are stuck here - create a leaf
stats.updateLeaf(depth, right - left + 1); stats.updateLeaf(depth, right - left + 1);
createNode(tempTree, nodeIndex, left, right); createNode(tempTree, nodeIndex, left, right);
@ -146,7 +146,7 @@ void BIH::subdivide(int left, int right, std::vector<uint32> &tempTree, buildDat
else if (left > right) else if (left > right)
{ {
// all right // all right
if (prevAxis == axis && prevSplit == split) { if (prevAxis == axis && G3D::fuzzyEq(prevSplit, split)) {
// we are stuck here - create a leaf // we are stuck here - create a leaf
stats.updateLeaf(depth, right - left + 1); stats.updateLeaf(depth, right - left + 1);
createNode(tempTree, nodeIndex, left, right); createNode(tempTree, nodeIndex, left, right);

View file

@ -126,7 +126,7 @@ class BIH
for (int i=0; i<3; ++i) for (int i=0; i<3; ++i)
{ {
invDir[i] = 1.f / dir[i]; invDir[i] = 1.f / dir[i];
if (dir[i] != 0.f) if (G3D::fuzzyNe(dir[i], 0.0f))
{ {
float t1 = (bounds.low()[i] - org[i]) * invDir[i]; float t1 = (bounds.low()[i] - org[i]) * invDir[i];
float t2 = (bounds.high()[i] - org[i]) * invDir[i]; float t2 = (bounds.high()[i] - org[i]) * invDir[i];

View file

@ -150,10 +150,10 @@ namespace VMAP
{ {
float tx_f = (pos.x - iCorner.x)/LIQUID_TILE_SIZE; float tx_f = (pos.x - iCorner.x)/LIQUID_TILE_SIZE;
uint32 tx = uint32(tx_f); uint32 tx = uint32(tx_f);
if (tx<0 || tx >= iTilesX) return false; if (tx >= iTilesX) return false;
float ty_f = (pos.y - iCorner.y)/LIQUID_TILE_SIZE; float ty_f = (pos.y - iCorner.y)/LIQUID_TILE_SIZE;
uint32 ty = uint32(ty_f); uint32 ty = uint32(ty_f);
if (ty<0 || ty >= iTilesY) return false; if (ty >= iTilesY) return false;
// check if tile shall be used for liquid level // check if tile shall be used for liquid level
// checking for 0x08 *might* be enough, but disabled tiles always are 0x?F: // checking for 0x08 *might* be enough, but disabled tiles always are 0x?F:

View file

@ -56,14 +56,11 @@ class Field
uint32 GetUInt32() const { return mValue ? static_cast<uint32>(atol(mValue)) : uint32(0); } uint32 GetUInt32() const { return mValue ? static_cast<uint32>(atol(mValue)) : uint32(0); }
uint64 GetUInt64() const uint64 GetUInt64() const
{ {
if(mValue) uint64 value = 0;
{ if(!mValue || sscanf(mValue,UI64FMTD,&value) == -1)
uint64 value;
sscanf(mValue,UI64FMTD,&value);
return value;
}
else
return 0; return 0;
return value;
} }
void SetType(enum DataTypes type) { mType = type; } void SetType(enum DataTypes type) { mType = type; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "11304" #define REVISION_NR "11305"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__