Scaled vertices to always be integers.
This commit is contained in:
parent
5f836e0c31
commit
c1286a7847
@ -26,11 +26,18 @@ namespace Ogre
|
||||
template <typename Type> class IntegralVector3
|
||||
{
|
||||
public:
|
||||
IntegralVector3(Type xToSet, Type yToSet, Type zToSet)
|
||||
IntegralVector3()
|
||||
:x(0)
|
||||
,y(0)
|
||||
,z(0)
|
||||
{
|
||||
}
|
||||
|
||||
IntegralVector3(Type xToSet, Type yToSet, Type zToSet)
|
||||
:x(xToSet)
|
||||
,y(yToSet)
|
||||
,z(zToSet)
|
||||
{
|
||||
x = xToSet;
|
||||
y = yToSet;
|
||||
z = zToSet;
|
||||
}
|
||||
|
||||
bool operator==(const IntegralVector3<Type>& rhs) const throw()
|
||||
@ -55,6 +62,18 @@ namespace Ogre
|
||||
Type z;
|
||||
};
|
||||
|
||||
template <typename Type>
|
||||
IntegralVector3<Type> operator-(const IntegralVector3<Type>& lhs, const IntegralVector3<Type>& rhs)
|
||||
{
|
||||
IntegralVector3<Type> result;
|
||||
|
||||
result.x = lhs.x - rhs.x;
|
||||
result.y = lhs.y - rhs.y;
|
||||
result.z = lhs.z - rhs.z;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef IntegralVector3<char> CharVector3;
|
||||
typedef IntegralVector3<short> ShortVector3;
|
||||
typedef IntegralVector3<int> IntVector3;
|
||||
|
@ -23,6 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#include "OgrePrerequisites.h"
|
||||
|
||||
#include "OgreVector3.h"
|
||||
#include "IntegralVector3.h"
|
||||
|
||||
namespace Ogre
|
||||
{
|
||||
@ -31,7 +32,7 @@ namespace Ogre
|
||||
class SurfaceVertex
|
||||
{
|
||||
public:
|
||||
Vector3 position;
|
||||
UIntVector3 position;
|
||||
Vector3 normal;
|
||||
float alpha;
|
||||
|
||||
@ -39,9 +40,9 @@ namespace Ogre
|
||||
|
||||
SurfaceVertex();
|
||||
|
||||
SurfaceVertex(Vector3 positionToSet);
|
||||
SurfaceVertex(UIntVector3 positionToSet);
|
||||
|
||||
SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet);
|
||||
SurfaceVertex(UIntVector3 positionToSet, Vector3 normalToSet);
|
||||
|
||||
bool operator==(const SurfaceVertex& rhs) const;
|
||||
|
||||
|
@ -593,9 +593,9 @@ namespace Ogre
|
||||
const uint lastZ = (std::min)(firstZ + OGRE_REGION_SIDE_LENGTH-1,static_cast<uint>(OGRE_VOLUME_SIDE_LENGTH-2));
|
||||
|
||||
//Offset from lower block corner
|
||||
const Vector3 offset(firstX,firstY,firstZ);
|
||||
const UIntVector3 offset(firstX*2,firstY*2,firstZ*2);
|
||||
|
||||
Vector3 vertlist[12];
|
||||
UIntVector3 vertlist[12];
|
||||
uchar vertMaterials[12];
|
||||
VolumeIterator volIter(*volumeData);
|
||||
volIter.setValidRegion(firstX,firstY,firstZ,lastX,lastY,lastZ);
|
||||
@ -645,95 +645,95 @@ namespace Ogre
|
||||
/* Find the vertices where the surface intersects the cube */
|
||||
if (edgeTable[iCubeIndex] & 1)
|
||||
{
|
||||
vertlist[0].x = (static_cast<double>(x) + 0.5);
|
||||
vertlist[0].y = (static_cast<double>(y));
|
||||
vertlist[0].z = (static_cast<double>(z));
|
||||
vertlist[0].x = 2*x + 1;
|
||||
vertlist[0].y = 2*y;
|
||||
vertlist[0].z = 2*z;
|
||||
vertMaterials[0] = (std::max)(v000,v100); //FIXME - faster way?
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 2)
|
||||
{
|
||||
vertlist[1].x = (static_cast<double>(x + 1));
|
||||
vertlist[1].y = (static_cast<double>(y) + 0.5);
|
||||
vertlist[1].z = (static_cast<double>(z));
|
||||
vertlist[1].x = 2*x + 2;
|
||||
vertlist[1].y = 2*y + 1;
|
||||
vertlist[1].z = 2*z;
|
||||
vertMaterials[1] = (std::max)(v100,v110);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 4)
|
||||
{
|
||||
vertlist[2].x = (static_cast<double>(x) + 0.5);
|
||||
vertlist[2].y = (static_cast<double>(y + 1));
|
||||
vertlist[2].z = (static_cast<double>(z));
|
||||
vertlist[2].x = 2*x + 1;
|
||||
vertlist[2].y = 2*y + 2;
|
||||
vertlist[2].z = 2*z;
|
||||
vertMaterials[2] = (std::max)(v010,v110);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 8)
|
||||
{
|
||||
vertlist[3].x = (static_cast<double>(x));
|
||||
vertlist[3].y = (static_cast<double>(y) + 0.5);
|
||||
vertlist[3].z = (static_cast<double>(z));
|
||||
vertlist[3].x = 2*x;
|
||||
vertlist[3].y = 2*y + 1;
|
||||
vertlist[3].z = 2*z;
|
||||
vertMaterials[3] = (std::max)(v000,v010);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 16)
|
||||
{
|
||||
vertlist[4].x = (static_cast<double>(x) + 0.5);
|
||||
vertlist[4].y = (static_cast<double>(y));
|
||||
vertlist[4].z = (static_cast<double>(z + 1));
|
||||
vertlist[4].x = 2*x + 1;
|
||||
vertlist[4].y = 2*y;
|
||||
vertlist[4].z = 2*z + 2;
|
||||
vertMaterials[4] = (std::max)(v001,v101);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 32)
|
||||
{
|
||||
vertlist[5].x = (static_cast<double>(x + 1));
|
||||
vertlist[5].y = (static_cast<double>(y) + 0.5);
|
||||
vertlist[5].z = (static_cast<double>(z + 1));
|
||||
vertlist[5].x = 2*x + 2;
|
||||
vertlist[5].y = 2*y + 1;
|
||||
vertlist[5].z = 2*z + 2;
|
||||
vertMaterials[5] = (std::max)(v101,v111);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 64)
|
||||
{
|
||||
vertlist[6].x = (static_cast<double>(x) + 0.5);
|
||||
vertlist[6].y = (static_cast<double>(y + 1));
|
||||
vertlist[6].z = (static_cast<double>(z + 1));
|
||||
vertlist[6].x = 2*x + 1;
|
||||
vertlist[6].y = 2*y + 2;
|
||||
vertlist[6].z = 2*z + 2;
|
||||
vertMaterials[6] = (std::max)(v011,v111);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 128)
|
||||
{
|
||||
vertlist[7].x = (static_cast<double>(x));
|
||||
vertlist[7].y = (static_cast<double>(y) + 0.5);
|
||||
vertlist[7].z = (static_cast<double>(z + 1));
|
||||
vertlist[7].x = 2*x;
|
||||
vertlist[7].y = 2*y + 1;
|
||||
vertlist[7].z = 2*z + 2;
|
||||
vertMaterials[7] = (std::max)(v001,v011);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 256)
|
||||
{
|
||||
vertlist[8].x = (static_cast<double>(x));
|
||||
vertlist[8].y = (static_cast<double>(y));
|
||||
vertlist[8].z = (static_cast<double>(z) + 0.5);
|
||||
vertlist[8].x = 2*x;
|
||||
vertlist[8].y = 2*y;
|
||||
vertlist[8].z = 2*z + 1;
|
||||
vertMaterials[8] = (std::max)(v000,v001);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 512)
|
||||
{
|
||||
vertlist[9].x = (static_cast<double>(x + 1));
|
||||
vertlist[9].y = (static_cast<double>(y));
|
||||
vertlist[9].z = (static_cast<double>(z) + 0.5);
|
||||
vertlist[9].x = 2*x + 2;
|
||||
vertlist[9].y = 2*y;
|
||||
vertlist[9].z = 2*z + 1;
|
||||
vertMaterials[9] = (std::max)(v100,v101);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 1024)
|
||||
{
|
||||
vertlist[10].x = (static_cast<double>(x + 1));
|
||||
vertlist[10].y = (static_cast<double>(y + 1));
|
||||
vertlist[10].z = (static_cast<double>(z) + 0.5);
|
||||
vertlist[10].x = 2*x + 2;
|
||||
vertlist[10].y = 2*y + 2;
|
||||
vertlist[10].z = 2*z + 1;
|
||||
vertMaterials[10] = (std::max)(v110,v111);
|
||||
}
|
||||
if (edgeTable[iCubeIndex] & 2048)
|
||||
{
|
||||
vertlist[11].x = (static_cast<double>(x));
|
||||
vertlist[11].y = (static_cast<double>(y + 1));
|
||||
vertlist[11].z = (static_cast<double>(z) + 0.5);
|
||||
vertlist[11].x = 2*x;
|
||||
vertlist[11].y = 2*y + 2;
|
||||
vertlist[11].z = 2*z + 1;
|
||||
vertMaterials[11] = (std::max)(v010,v011);
|
||||
}
|
||||
|
||||
for (int i=0;triTable[iCubeIndex][i]!=-1;i+=3)
|
||||
{
|
||||
//The three vertices forming a triangle
|
||||
const Vector3 vertex0 = vertlist[triTable[iCubeIndex][i ]] - offset;
|
||||
const Vector3 vertex1 = vertlist[triTable[iCubeIndex][i+1]] - offset;
|
||||
const Vector3 vertex2 = vertlist[triTable[iCubeIndex][i+2]] - offset;
|
||||
const UIntVector3 vertex0 = vertlist[triTable[iCubeIndex][i ]] - offset;
|
||||
const UIntVector3 vertex1 = vertlist[triTable[iCubeIndex][i+1]] - offset;
|
||||
const UIntVector3 vertex2 = vertlist[triTable[iCubeIndex][i+2]] - offset;
|
||||
|
||||
const uchar material0 = vertMaterials[triTable[iCubeIndex][i ]];
|
||||
const uchar material1 = vertMaterials[triTable[iCubeIndex][i+1]];
|
||||
|
@ -64,8 +64,14 @@ namespace Ogre
|
||||
|
||||
// Drawing stuff
|
||||
int size = verticesToSet.size();
|
||||
Vector3 vaabMin = verticesToSet[0].position;
|
||||
Vector3 vaabMax = verticesToSet[0].position;
|
||||
Vector3 vaabMin;
|
||||
Vector3 vaabMax;
|
||||
vaabMin.x = verticesToSet[0].position.x/2.0f;
|
||||
vaabMin.y = verticesToSet[0].position.y/2.0f;
|
||||
vaabMin.z = verticesToSet[0].position.z/2.0f;
|
||||
vaabMax.x = verticesToSet[0].position.x/2.0f;
|
||||
vaabMax.y = verticesToSet[0].position.y/2.0f;
|
||||
vaabMax.z = verticesToSet[0].position.z/2.0f;
|
||||
|
||||
//LogManager::getSingleton().logMessage("Setting Vertex Data of size " + StringConverter::toString(size));
|
||||
|
||||
@ -73,9 +79,9 @@ namespace Ogre
|
||||
|
||||
for(int i = 0; i < size; i++)
|
||||
{
|
||||
*prPos++ = verticesToSet[i].position.x;
|
||||
*prPos++ = verticesToSet[i].position.y;
|
||||
*prPos++ = verticesToSet[i].position.z;
|
||||
*prPos++ = verticesToSet[i].position.x/2.0f;
|
||||
*prPos++ = verticesToSet[i].position.y/2.0f;
|
||||
*prPos++ = verticesToSet[i].position.z/2.0f;
|
||||
|
||||
*prPos++ = verticesToSet[i].normal.x;
|
||||
*prPos++ = verticesToSet[i].normal.y;
|
||||
@ -100,6 +106,9 @@ namespace Ogre
|
||||
|
||||
vbuf->unlock();
|
||||
|
||||
vaabMin /= 2.0f;
|
||||
vaabMax /= 2.0f;
|
||||
|
||||
mBox.setExtents(vaabMin, vaabMax);
|
||||
|
||||
unsigned short* pIdx = static_cast<unsigned short*>(ibuf->lock(HardwareBuffer::HBL_DISCARD));
|
||||
|
@ -6,12 +6,12 @@ namespace Ogre
|
||||
{
|
||||
}
|
||||
|
||||
SurfaceVertex::SurfaceVertex(Vector3 positionToSet)
|
||||
SurfaceVertex::SurfaceVertex(UIntVector3 positionToSet)
|
||||
:position(positionToSet)
|
||||
{
|
||||
}
|
||||
|
||||
SurfaceVertex::SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet)
|
||||
SurfaceVertex::SurfaceVertex(UIntVector3 positionToSet, Vector3 normalToSet)
|
||||
:position(positionToSet)
|
||||
,normal(normalToSet)
|
||||
{
|
||||
@ -20,21 +20,21 @@ namespace Ogre
|
||||
bool SurfaceVertex::operator==(const SurfaceVertex& rhs) const
|
||||
{
|
||||
//We dont't check the normal here as it may not have been set. But if two vertices have the same position they should have the same normal too.
|
||||
return
|
||||
/*return
|
||||
(
|
||||
(abs(position.x - rhs.position.x) <= 0.01) &&
|
||||
(abs(position.y - rhs.position.y) <= 0.01) &&
|
||||
(abs(position.z - rhs.position.z) <= 0.01) &&
|
||||
(abs(alpha - rhs.alpha) <= 0.01)
|
||||
);
|
||||
);*/
|
||||
|
||||
/*return
|
||||
return
|
||||
(
|
||||
(position.x == rhs.position.x) &&
|
||||
(position.x == rhs.position.y) &&
|
||||
(position.x == rhs.position.z) &&
|
||||
(alpha == rhs.alpha)
|
||||
);*/
|
||||
(abs(alpha - rhs.alpha) <= 0.01)
|
||||
);
|
||||
}
|
||||
|
||||
bool SurfaceVertex::operator < (const SurfaceVertex& rhs) const
|
||||
|
Loading…
x
Reference in New Issue
Block a user