Fixed some type issues with sqrt. Fixed rect.isValid to work with all types and avoid useless tests. Cleaned up some variable uses and scopes.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1004 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
31afde9563
commit
738951ff4b
|
@ -22,7 +22,6 @@ namespace irr
|
||||||
|
|
||||||
namespace io
|
namespace io
|
||||||
{
|
{
|
||||||
class IFileSystem;
|
|
||||||
class IReadFile;
|
class IReadFile;
|
||||||
class IAttributes;
|
class IAttributes;
|
||||||
class IWriteFile;
|
class IWriteFile;
|
||||||
|
@ -31,7 +30,6 @@ namespace io
|
||||||
namespace gui
|
namespace gui
|
||||||
{
|
{
|
||||||
class IGUIFont;
|
class IGUIFont;
|
||||||
class IGUIFontBitmap;
|
|
||||||
class IGUIEnvironment;
|
class IGUIEnvironment;
|
||||||
} // end namespace gui
|
} // end namespace gui
|
||||||
|
|
||||||
|
|
|
@ -10,14 +10,14 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#if defined(_IRR_SOLARIS_PLATFORM_) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
|
#if defined(_IRR_SOLARIS_PLATFORM_) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__)
|
||||||
#define sqrtf(X) (f32)sqrt(X)
|
#define sqrtf(X) (f32)sqrt((f64)(X))
|
||||||
#define sinf(X) (f32)sin(X)
|
#define sinf(X) (f32)sin((f64)(X))
|
||||||
#define cosf(X) (f32)cos(X)
|
#define cosf(X) (f32)cos((f64)(X))
|
||||||
#define ceilf(X) (f32)ceil(X)
|
#define ceilf(X) (f32)ceil((f64)(X))
|
||||||
#define floorf(X) (f32)floor(X)
|
#define floorf(X) (f32)floor((f64)(X))
|
||||||
#define powf(X,Y) (f32)pow(X,Y)
|
#define powf(X,Y) (f32)pow((f64)(X),(f64)(Y))
|
||||||
#define fmodf(X,Y) (f32)fmod(X,Y)
|
#define fmodf(X,Y) (f32)fmod((f64)(X),(f64)(Y))
|
||||||
#define fabsf(X) (f32)fabs(X)
|
#define fabsf(X) (f32)fabs((f64)(X))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
|
@ -83,7 +83,7 @@ namespace core
|
||||||
return a < b ? b : a;
|
return a < b ? b : a;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! returns minimum of three values. Own implementation to get rid of the STL (VS6 problems)
|
//! returns maximum of three values. Own implementation to get rid of the STL (VS6 problems)
|
||||||
template<class T>
|
template<class T>
|
||||||
inline const T& max_(const T& a, const T& b, const T& c)
|
inline const T& max_(const T& a, const T& b, const T& c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -104,7 +104,7 @@ class line3d
|
||||||
if (d < 0.0)
|
if (d < 0.0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
outdistance = v - sqrt(d);
|
outdistance = v - sqrt((f64)d);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -472,7 +472,7 @@ inline void quaternion::fromAngleAxis(f32 angle, const vector3df& axis)
|
||||||
|
|
||||||
inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const
|
inline void quaternion::toAngleAxis(f32 &angle, core::vector3df &axis) const
|
||||||
{
|
{
|
||||||
f32 scale = sqrt (X*X + Y*Y + Z*Z);
|
f32 scale = sqrtf(X*X + Y*Y + Z*Z);
|
||||||
|
|
||||||
if (core::iszero(scale) || W > 1.0f || W < -1.0f)
|
if (core::iszero(scale) || W > 1.0f || W < -1.0f)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,10 +14,10 @@ namespace irr
|
||||||
namespace core
|
namespace core
|
||||||
{
|
{
|
||||||
|
|
||||||
//! Rectangle template.
|
//! Rectangle template.
|
||||||
/** Mostly used by 2D GUI elements and for 2D drawing methods.
|
/** Mostly used by 2D GUI elements and for 2D drawing methods.
|
||||||
It has 2 positions instead of position and dimension
|
It has 2 positions instead of position and dimension and a fast
|
||||||
and a fast method for collision detection with other rectangles and points.
|
method for collision detection with other rectangles and points.
|
||||||
*/
|
*/
|
||||||
template <class T>
|
template <class T>
|
||||||
class rect
|
class rect
|
||||||
|
@ -32,9 +32,6 @@ namespace core
|
||||||
rect(const position2d<T>& upperLeft, const position2d<T>& lowerRight)
|
rect(const position2d<T>& upperLeft, const position2d<T>& lowerRight)
|
||||||
: UpperLeftCorner(upperLeft), LowerRightCorner(lowerRight) {}
|
: UpperLeftCorner(upperLeft), LowerRightCorner(lowerRight) {}
|
||||||
|
|
||||||
rect(const rect<T>& other)
|
|
||||||
: UpperLeftCorner(other.UpperLeftCorner), LowerRightCorner(other.LowerRightCorner) {}
|
|
||||||
|
|
||||||
rect(const position2d<T>& pos, const dimension2d<T>& size)
|
rect(const position2d<T>& pos, const dimension2d<T>& size)
|
||||||
: UpperLeftCorner(pos), LowerRightCorner(pos.X + size.Width, pos.Y + size.Height) {}
|
: UpperLeftCorner(pos), LowerRightCorner(pos.X + size.Width, pos.Y + size.Height) {}
|
||||||
|
|
||||||
|
@ -42,12 +39,10 @@ namespace core
|
||||||
rect<T> operator+(const position2d<T>& pos) const
|
rect<T> operator+(const position2d<T>& pos) const
|
||||||
{
|
{
|
||||||
rect<T> ret(*this);
|
rect<T> ret(*this);
|
||||||
ret.UpperLeftCorner += pos;
|
return ret+=pos;
|
||||||
ret.LowerRightCorner += pos;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const rect<T>& operator+=(const position2d<T>& pos)
|
rect<T>& operator+=(const position2d<T>& pos)
|
||||||
{
|
{
|
||||||
UpperLeftCorner += pos;
|
UpperLeftCorner += pos;
|
||||||
LowerRightCorner += pos;
|
LowerRightCorner += pos;
|
||||||
|
@ -57,40 +52,31 @@ namespace core
|
||||||
rect<T> operator-(const position2d<T>& pos) const
|
rect<T> operator-(const position2d<T>& pos) const
|
||||||
{
|
{
|
||||||
rect<T> ret(*this);
|
rect<T> ret(*this);
|
||||||
ret.UpperLeftCorner -= pos;
|
return ret-=pos;
|
||||||
ret.LowerRightCorner -= pos;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const rect<T>& operator-=(const position2d<T>& pos)
|
rect<T>& operator-=(const position2d<T>& pos)
|
||||||
{
|
{
|
||||||
UpperLeftCorner -= pos;
|
UpperLeftCorner -= pos;
|
||||||
LowerRightCorner -= pos;
|
LowerRightCorner -= pos;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator == (const rect<T>& other) const
|
bool operator==(const rect<T>& other) const
|
||||||
{
|
{
|
||||||
return (UpperLeftCorner == other.UpperLeftCorner &&
|
return (UpperLeftCorner == other.UpperLeftCorner &&
|
||||||
LowerRightCorner == other.LowerRightCorner);
|
LowerRightCorner == other.LowerRightCorner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool operator != (const rect<T>& other) const
|
bool operator!=(const rect<T>& other) const
|
||||||
{
|
{
|
||||||
return (UpperLeftCorner != other.UpperLeftCorner ||
|
return (UpperLeftCorner != other.UpperLeftCorner ||
|
||||||
LowerRightCorner != other.LowerRightCorner);
|
LowerRightCorner != other.LowerRightCorner);
|
||||||
}
|
}
|
||||||
|
|
||||||
const rect<T>& operator = (const rect<T>& other)
|
|
||||||
{
|
|
||||||
UpperLeftCorner = other.UpperLeftCorner;
|
|
||||||
LowerRightCorner = other.LowerRightCorner;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compares size of rectangles
|
// compares size of rectangles
|
||||||
bool operator < (const rect<T>& other) const
|
bool operator<(const rect<T>& other) const
|
||||||
{
|
{
|
||||||
return getArea() < other.getArea();
|
return getArea() < other.getArea();
|
||||||
}
|
}
|
||||||
|
@ -212,15 +198,11 @@ namespace core
|
||||||
|
|
||||||
//! Returns if the rect is valid to draw. It could be invalid
|
//! Returns if the rect is valid to draw. It could be invalid
|
||||||
//! if the UpperLeftCorner is lower or more right than the
|
//! if the UpperLeftCorner is lower or more right than the
|
||||||
//! LowerRightCorner, or if the area described by the rect is 0.
|
//! LowerRightCorner, or if any dimension is 0.
|
||||||
bool isValid() const
|
bool isValid() const
|
||||||
{
|
{
|
||||||
// thx to jox for a correction to this method
|
return ((LowerRightCorner.X >= UpperLeftCorner.X) &&
|
||||||
|
(LowerRightCorner.Y >= UpperLeftCorner.Y));
|
||||||
T xd = LowerRightCorner.X - UpperLeftCorner.X;
|
|
||||||
T yd = LowerRightCorner.Y - UpperLeftCorner.Y;
|
|
||||||
|
|
||||||
return !(xd <= 0 || yd <= 0 || (xd == 0 && yd == 0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns the center of the rectangle
|
//! Returns the center of the rectangle
|
||||||
|
@ -251,11 +233,15 @@ namespace core
|
||||||
//! \param y: Y Coordinate of the point to add to this box.
|
//! \param y: Y Coordinate of the point to add to this box.
|
||||||
void addInternalPoint(T x, T y)
|
void addInternalPoint(T x, T y)
|
||||||
{
|
{
|
||||||
if (x>LowerRightCorner.X) LowerRightCorner.X = x;
|
if (x>LowerRightCorner.X)
|
||||||
if (y>LowerRightCorner.Y) LowerRightCorner.Y = y;
|
LowerRightCorner.X = x;
|
||||||
|
if (y>LowerRightCorner.Y)
|
||||||
|
LowerRightCorner.Y = y;
|
||||||
|
|
||||||
if (x<UpperLeftCorner.X) UpperLeftCorner.X = x;
|
if (x<UpperLeftCorner.X)
|
||||||
if (y<UpperLeftCorner.Y) UpperLeftCorner.Y = y;
|
UpperLeftCorner.X = x;
|
||||||
|
if (y<UpperLeftCorner.Y)
|
||||||
|
UpperLeftCorner.Y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ public:
|
||||||
if (tmp == 0.0)
|
if (tmp == 0.0)
|
||||||
return 90.0;
|
return 90.0;
|
||||||
|
|
||||||
tmp = tmp / sqrt((X*X + Y*Y) * (b.X*b.X + b.Y*b.Y));
|
tmp = tmp / sqrt((f64)((X*X + Y*Y) * (b.X*b.X + b.Y*b.Y)));
|
||||||
if (tmp < 0.0)
|
if (tmp < 0.0)
|
||||||
tmp = -tmp;
|
tmp = -tmp;
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ namespace core
|
||||||
void set(const vector3d<T>& p) { X=p.X; Y=p.Y; Z=p.Z;}
|
void set(const vector3d<T>& p) { X=p.X; Y=p.Y; Z=p.Z;}
|
||||||
|
|
||||||
//! Returns length of the vector.
|
//! Returns length of the vector.
|
||||||
T getLength() const { return (T) sqrt(X*X + Y*Y + Z*Z); }
|
T getLength() const { return (T) sqrt((f64)(X*X + Y*Y + Z*Z)); }
|
||||||
|
|
||||||
//! Returns squared length of the vector.
|
//! Returns squared length of the vector.
|
||||||
/** This is useful because it is much faster than
|
/** This is useful because it is much faster than
|
||||||
|
@ -242,7 +242,7 @@ namespace core
|
||||||
if (angle.Y < 0.0f) angle.Y += 360.0f;
|
if (angle.Y < 0.0f) angle.Y += 360.0f;
|
||||||
if (angle.Y >= 360.0f) angle.Y -= 360.0f;
|
if (angle.Y >= 360.0f) angle.Y -= 360.0f;
|
||||||
|
|
||||||
f32 z1 = (f32)sqrt(X*X + Z*Z);
|
f32 z1 = sqrtf(X*X + Z*Z);
|
||||||
|
|
||||||
angle.X = (T)atan2(z1, Y);
|
angle.X = (T)atan2(z1, Y);
|
||||||
angle.X *= (f32)RADTODEG64;
|
angle.X *= (f32)RADTODEG64;
|
||||||
|
|
|
@ -296,9 +296,6 @@ void CAnimatedMeshSceneNode::render()
|
||||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||||
|
|
||||||
|
|
||||||
u32 i,g;
|
|
||||||
|
|
||||||
|
|
||||||
if (Shadow && PassCount==1)
|
if (Shadow && PassCount==1)
|
||||||
Shadow->setMeshToRenderFrom(m);
|
Shadow->setMeshToRenderFrom(m);
|
||||||
|
|
||||||
|
@ -311,12 +308,12 @@ void CAnimatedMeshSceneNode::render()
|
||||||
// overwrite half transparency
|
// overwrite half transparency
|
||||||
if ( DebugDataVisible & scene::EDS_HALF_TRANSPARENCY )
|
if ( DebugDataVisible & scene::EDS_HALF_TRANSPARENCY )
|
||||||
{
|
{
|
||||||
for ( g=0; g<m->getMeshBufferCount(); ++g)
|
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||||
{
|
{
|
||||||
mat = Materials[g];
|
mat = Materials[g];
|
||||||
mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
||||||
driver->setMaterial(mat);
|
driver->setMaterial(mat);
|
||||||
driver->drawMeshBuffer ( m->getMeshBuffer ( g ) );
|
driver->drawMeshBuffer ( m->getMeshBuffer(g) );
|
||||||
}
|
}
|
||||||
renderMeshes = 0;
|
renderMeshes = 0;
|
||||||
}
|
}
|
||||||
|
@ -325,7 +322,7 @@ void CAnimatedMeshSceneNode::render()
|
||||||
// render original meshes
|
// render original meshes
|
||||||
if ( renderMeshes )
|
if ( renderMeshes )
|
||||||
{
|
{
|
||||||
for ( i=0; i<m->getMeshBufferCount(); ++i)
|
for (u32 i=0; i<m->getMeshBufferCount(); ++i)
|
||||||
{
|
{
|
||||||
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType);
|
video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType);
|
||||||
bool transparent = (rnd && rnd->isTransparent());
|
bool transparent = (rnd && rnd->isTransparent());
|
||||||
|
@ -357,11 +354,10 @@ void CAnimatedMeshSceneNode::render()
|
||||||
// show bounding box
|
// show bounding box
|
||||||
if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS )
|
if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS )
|
||||||
{
|
{
|
||||||
for ( g=0; g< m->getMeshBufferCount(); ++g)
|
for (u32 g=0; g< m->getMeshBufferCount(); ++g)
|
||||||
{
|
{
|
||||||
driver->draw3DBox( m->getMeshBuffer(g)->getBoundingBox(),
|
driver->draw3DBox( m->getMeshBuffer(g)->getBoundingBox(),
|
||||||
video::SColor(0,190,128,128)
|
video::SColor(0,190,128,128) );
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +373,7 @@ void CAnimatedMeshSceneNode::render()
|
||||||
// draw skeleton
|
// draw skeleton
|
||||||
|
|
||||||
|
|
||||||
for ( g=0; g < ((ISkinnedMesh*)Mesh)->getAllJoints().size(); g +=1 )
|
for (u32 g=0; g < ((ISkinnedMesh*)Mesh)->getAllJoints().size(); ++g)
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SJoint *joint=((ISkinnedMesh*)Mesh)->getAllJoints()[g];
|
ISkinnedMesh::SJoint *joint=((ISkinnedMesh*)Mesh)->getAllJoints()[g];
|
||||||
|
|
||||||
|
@ -447,12 +443,12 @@ void CAnimatedMeshSceneNode::render()
|
||||||
core::matrix4 m2;
|
core::matrix4 m2;
|
||||||
|
|
||||||
// draw normals
|
// draw normals
|
||||||
for ( g=0; g<m->getMeshBufferCount(); ++g)
|
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||||
{
|
{
|
||||||
scene::IMeshBuffer* mb = m->getMeshBuffer(g);
|
const scene::IMeshBuffer* mb = m->getMeshBuffer(g);
|
||||||
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
|
const u32 vSize = video::getVertexPitchFromType(mb->getVertexType());
|
||||||
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
|
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
|
||||||
for ( i = 0; i != mb->getVertexCount(); ++i )
|
for ( u32 i=0; i != mb->getVertexCount(); ++i )
|
||||||
{
|
{
|
||||||
AlignToUpVector ( m2, v->Normal );
|
AlignToUpVector ( m2, v->Normal );
|
||||||
|
|
||||||
|
@ -476,14 +472,12 @@ void CAnimatedMeshSceneNode::render()
|
||||||
mat.Wireframe = true;
|
mat.Wireframe = true;
|
||||||
driver->setMaterial(mat);
|
driver->setMaterial(mat);
|
||||||
|
|
||||||
for ( g=0; g<m->getMeshBufferCount(); ++g)
|
for (u32 g=0; g<m->getMeshBufferCount(); ++g)
|
||||||
{
|
{
|
||||||
driver->drawMeshBuffer ( m->getMeshBuffer ( g ) );
|
driver->drawMeshBuffer( m->getMeshBuffer(g) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -848,7 +842,7 @@ void CAnimatedMeshSceneNode::updateAbsolutePosition()
|
||||||
if ( taglist )
|
if ( taglist )
|
||||||
{
|
{
|
||||||
MD3Special.AbsoluteTagList.Container.set_used ( taglist->size () );
|
MD3Special.AbsoluteTagList.Container.set_used ( taglist->size () );
|
||||||
for ( u32 i = 0; i!= taglist->size (); ++i )
|
for ( u32 i=0; i!= taglist->size (); ++i )
|
||||||
{
|
{
|
||||||
MD3Special.AbsoluteTagList[i].position = parent.position + (*taglist)[i].position + relative.position;
|
MD3Special.AbsoluteTagList[i].position = parent.position + (*taglist)[i].position + relative.position;
|
||||||
MD3Special.AbsoluteTagList[i].rotation = parent.rotation * (*taglist)[i].rotation * relative.rotation;
|
MD3Special.AbsoluteTagList[i].rotation = parent.rotation * (*taglist)[i].rotation * relative.rotation;
|
||||||
|
|
|
@ -944,8 +944,6 @@ void CD3D9Driver::draw2DImage(const video::ITexture* texture,
|
||||||
core::position2d<s32> sourcePos = sourceRect.UpperLeftCorner;
|
core::position2d<s32> sourcePos = sourceRect.UpperLeftCorner;
|
||||||
core::dimension2d<s32> sourceSize(sourceRect.getSize());
|
core::dimension2d<s32> sourceSize(sourceRect.getSize());
|
||||||
|
|
||||||
core::dimension2d<s32> renderTargetSize = getCurrentRenderTargetSize();
|
|
||||||
|
|
||||||
if (clipRect)
|
if (clipRect)
|
||||||
{
|
{
|
||||||
if (targetPos.X < clipRect->UpperLeftCorner.X)
|
if (targetPos.X < clipRect->UpperLeftCorner.X)
|
||||||
|
@ -995,6 +993,8 @@ void CD3D9Driver::draw2DImage(const video::ITexture* texture,
|
||||||
targetPos.X = 0;
|
targetPos.X = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
|
|
||||||
if (targetPos.X + sourceSize.Width > renderTargetSize.Width)
|
if (targetPos.X + sourceSize.Width > renderTargetSize.Width)
|
||||||
{
|
{
|
||||||
sourceSize.Width -= (targetPos.X + sourceSize.Width) - renderTargetSize.Width;
|
sourceSize.Width -= (targetPos.X + sourceSize.Width) - renderTargetSize.Width;
|
||||||
|
@ -1022,11 +1022,11 @@ void CD3D9Driver::draw2DImage(const video::ITexture* texture,
|
||||||
// ok, we've clipped everything.
|
// ok, we've clipped everything.
|
||||||
// now draw it.
|
// now draw it.
|
||||||
|
|
||||||
f32 xPlus = - renderTargetSize.Width / 2.f;
|
s32 xPlus = -renderTargetSize.Width / 2;
|
||||||
f32 xFact = 1.0f / (renderTargetSize.Width / 2.f);
|
f32 xFact = 2.0f / renderTargetSize.Width;
|
||||||
|
|
||||||
f32 yPlus = renderTargetSize.Height-(renderTargetSize.Height / 2.f);
|
s32 yPlus = renderTargetSize.Height / 2;
|
||||||
f32 yFact = 1.0f / (renderTargetSize.Height / 2.f);
|
f32 yFact = 2.0f / renderTargetSize.Height;
|
||||||
|
|
||||||
core::rect<f32> tcoords;
|
core::rect<f32> tcoords;
|
||||||
tcoords.UpperLeftCorner.X = (((f32)sourcePos.X)+0.5f) / texture->getOriginalSize().Width ;
|
tcoords.UpperLeftCorner.X = (((f32)sourcePos.X)+0.5f) / texture->getOriginalSize().Width ;
|
||||||
|
@ -1069,11 +1069,11 @@ void CD3D9Driver::draw2DRectangle(const core::rect<s32>& position,
|
||||||
|
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
|
|
||||||
s32 xPlus = -(renderTargetSize.Width>>1);
|
s32 xPlus = -renderTargetSize.Width / 2;
|
||||||
f32 xFact = 1.0f / (renderTargetSize.Width>>1);
|
f32 xFact = 2.0f / renderTargetSize.Width;
|
||||||
|
|
||||||
s32 yPlus = renderTargetSize.Height-(renderTargetSize.Height>>1);
|
s32 yPlus = renderTargetSize.Height / 2;
|
||||||
f32 yFact = 1.0f / (renderTargetSize.Height>>1);
|
f32 yFact = 2.0f / renderTargetSize.Height;
|
||||||
|
|
||||||
S3DVertex vtx[4];
|
S3DVertex vtx[4];
|
||||||
vtx[0] = S3DVertex((f32)(pos.UpperLeftCorner.X+xPlus) * xFact, (f32)(yPlus-pos.UpperLeftCorner.Y) * yFact , 0.0f, 0.0f, 0.0f, 0.0f, colorLeftUp, 0.0f, 0.0f);
|
vtx[0] = S3DVertex((f32)(pos.UpperLeftCorner.X+xPlus) * xFact, (f32)(yPlus-pos.UpperLeftCorner.Y) * yFact , 0.0f, 0.0f, 0.0f, 0.0f, colorLeftUp, 0.0f, 0.0f);
|
||||||
|
@ -1108,11 +1108,11 @@ void CD3D9Driver::draw2DLine(const core::position2d<s32>& start,
|
||||||
// thanks to Vash TheStampede who sent in his implementation
|
// thanks to Vash TheStampede who sent in his implementation
|
||||||
|
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
const s32 xPlus = -(renderTargetSize.Width>>1);
|
const s32 xPlus = -renderTargetSize.Width / 2;
|
||||||
const f32 xFact = 1.0f / (renderTargetSize.Width>>1);
|
const f32 xFact = 2.0f / renderTargetSize.Width;
|
||||||
|
|
||||||
const s32 yPlus = renderTargetSize.Height-(renderTargetSize.Height>>1);
|
const s32 yPlus = renderTargetSize.Height / 2;
|
||||||
const f32 yFact = 1.0f / (renderTargetSize.Height>>1);
|
const f32 yFact = 2.0f / renderTargetSize.Height;
|
||||||
|
|
||||||
S3DVertex vtx[2];
|
S3DVertex vtx[2];
|
||||||
vtx[0] = S3DVertex((f32)(start.X + xPlus) * xFact,
|
vtx[0] = S3DVertex((f32)(start.X + xPlus) * xFact,
|
||||||
|
|
|
@ -708,7 +708,6 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
||||||
core::position2d<s32> targetPos(pos);
|
core::position2d<s32> targetPos(pos);
|
||||||
core::position2d<s32> sourcePos(sourceRect.UpperLeftCorner);
|
core::position2d<s32> sourcePos(sourceRect.UpperLeftCorner);
|
||||||
core::dimension2d<s32> sourceSize(sourceRect.getSize());
|
core::dimension2d<s32> sourceSize(sourceRect.getSize());
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
|
||||||
if (clipRect)
|
if (clipRect)
|
||||||
{
|
{
|
||||||
if (targetPos.X < clipRect->UpperLeftCorner.X)
|
if (targetPos.X < clipRect->UpperLeftCorner.X)
|
||||||
|
@ -758,6 +757,8 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
||||||
targetPos.X = 0;
|
targetPos.X = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
|
|
||||||
if (targetPos.X + sourceSize.Width > renderTargetSize.Width)
|
if (targetPos.X + sourceSize.Width > renderTargetSize.Width)
|
||||||
{
|
{
|
||||||
sourceSize.Width -= (targetPos.X + sourceSize.Width) - renderTargetSize.Width;
|
sourceSize.Width -= (targetPos.X + sourceSize.Width) - renderTargetSize.Width;
|
||||||
|
@ -793,7 +794,7 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
||||||
tcoords.LowerRightCorner.X = (sourcePos.X + sourceSize.Width) / static_cast<f32>(ss.Width);
|
tcoords.LowerRightCorner.X = (sourcePos.X + sourceSize.Width) / static_cast<f32>(ss.Width);
|
||||||
tcoords.LowerRightCorner.Y = (sourcePos.Y + sourceSize.Height) / static_cast<f32>(ss.Height);
|
tcoords.LowerRightCorner.Y = (sourcePos.Y + sourceSize.Height) / static_cast<f32>(ss.Height);
|
||||||
|
|
||||||
core::rect<s32> poss(targetPos, sourceSize);
|
const core::rect<s32> poss(targetPos, sourceSize);
|
||||||
|
|
||||||
setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture);
|
setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture);
|
||||||
disableTextures(1);
|
disableTextures(1);
|
||||||
|
@ -820,83 +821,7 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! draws a set of 2d images, using a color and the alpha channel of the
|
//! The same, but with a four element array of colors, one for each vertex
|
||||||
//! texture if desired. The images are drawn beginning at pos and concatenated
|
|
||||||
//! in one line. All drawings are clipped against clipRect (if != 0).
|
|
||||||
//! The subtextures are defined by the array of sourceRects and are chosen
|
|
||||||
//! by the indices given.
|
|
||||||
void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
|
||||||
const core::position2d<s32>& pos,
|
|
||||||
const core::array<core::rect<s32> >& sourceRects,
|
|
||||||
const core::array<s32>& indices,
|
|
||||||
const core::rect<s32>* clipRect, SColor color,
|
|
||||||
bool useAlphaChannelOfTexture)
|
|
||||||
{
|
|
||||||
if (!texture)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
|
||||||
|
|
||||||
setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture);
|
|
||||||
disableTextures(1);
|
|
||||||
if (!setTexture(0, texture))
|
|
||||||
return;
|
|
||||||
|
|
||||||
glColor4ub(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
|
|
||||||
if (clipRect)
|
|
||||||
{
|
|
||||||
if (!clipRect->isValid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
|
||||||
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height-clipRect->LowerRightCorner.Y,
|
|
||||||
clipRect->getWidth(),clipRect->getHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
const core::dimension2d<s32>& ss = texture->getOriginalSize();
|
|
||||||
core::position2d<s32> targetPos(pos);
|
|
||||||
core::position2d<s32> sourcePos;
|
|
||||||
core::dimension2d<s32> sourceSize;
|
|
||||||
core::rect<f32> tcoords;
|
|
||||||
|
|
||||||
for (u32 i=0; i<indices.size(); ++i)
|
|
||||||
{
|
|
||||||
s32 currentIndex(indices[i]);
|
|
||||||
if (!sourceRects[currentIndex].isValid())
|
|
||||||
break;
|
|
||||||
sourcePos=sourceRects[currentIndex].UpperLeftCorner;
|
|
||||||
sourceSize=sourceRects[currentIndex].getSize();
|
|
||||||
|
|
||||||
tcoords.UpperLeftCorner.X = sourceRects[currentIndex].UpperLeftCorner.X / static_cast<f32>(ss.Width);
|
|
||||||
tcoords.UpperLeftCorner.Y = sourceRects[currentIndex].UpperLeftCorner.Y / static_cast<f32>(ss.Height);
|
|
||||||
tcoords.LowerRightCorner.X = sourceRects[currentIndex].LowerRightCorner.X / static_cast<f32>(ss.Width);
|
|
||||||
tcoords.LowerRightCorner.Y = sourceRects[currentIndex].LowerRightCorner.Y / static_cast<f32>(ss.Height);
|
|
||||||
|
|
||||||
core::rect<s32> poss(targetPos, sourceSize);
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
|
|
||||||
glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y);
|
|
||||||
glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.UpperLeftCorner.Y));
|
|
||||||
|
|
||||||
glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y);
|
|
||||||
glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.UpperLeftCorner.Y));
|
|
||||||
|
|
||||||
glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y);
|
|
||||||
glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.LowerRightCorner.Y));
|
|
||||||
|
|
||||||
glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y);
|
|
||||||
glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.LowerRightCorner.Y));
|
|
||||||
|
|
||||||
glEnd();
|
|
||||||
targetPos.X += sourceRects[currentIndex].getWidth();
|
|
||||||
}
|
|
||||||
if (clipRect)
|
|
||||||
glDisable(GL_SCISSOR_TEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void COpenGLDriver::draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect,
|
void COpenGLDriver::draw2DImage(const video::ITexture* texture, const core::rect<s32>& destRect,
|
||||||
const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect,
|
const core::rect<s32>& sourceRect, const core::rect<s32>* clipRect,
|
||||||
video::SColor* colors, bool useAlphaChannelOfTexture)
|
video::SColor* colors, bool useAlphaChannelOfTexture)
|
||||||
|
@ -904,7 +829,6 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture, const core::rect
|
||||||
if (!texture)
|
if (!texture)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
|
||||||
const core::dimension2d<s32>& ss = texture->getOriginalSize();
|
const core::dimension2d<s32>& ss = texture->getOriginalSize();
|
||||||
core::rect<f32> tcoords;
|
core::rect<f32> tcoords;
|
||||||
tcoords.UpperLeftCorner.X = sourceRect.UpperLeftCorner.X / static_cast<f32>(ss.Width);
|
tcoords.UpperLeftCorner.X = sourceRect.UpperLeftCorner.X / static_cast<f32>(ss.Width);
|
||||||
|
@ -933,6 +857,7 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture, const core::rect
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height-clipRect->LowerRightCorner.Y,
|
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height-clipRect->LowerRightCorner.Y,
|
||||||
clipRect->getWidth(), clipRect->getHeight());
|
clipRect->getWidth(), clipRect->getHeight());
|
||||||
}
|
}
|
||||||
|
@ -963,6 +888,82 @@ void COpenGLDriver::draw2DImage(const video::ITexture* texture, const core::rect
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//! draws a set of 2d images, using a color and the alpha channel of the
|
||||||
|
//! texture if desired. The images are drawn beginning at pos and concatenated
|
||||||
|
//! in one line. All drawings are clipped against clipRect (if != 0).
|
||||||
|
//! The subtextures are defined by the array of sourceRects and are chosen
|
||||||
|
//! by the indices given.
|
||||||
|
void COpenGLDriver::draw2DImage(const video::ITexture* texture,
|
||||||
|
const core::position2d<s32>& pos,
|
||||||
|
const core::array<core::rect<s32> >& sourceRects,
|
||||||
|
const core::array<s32>& indices,
|
||||||
|
const core::rect<s32>* clipRect, SColor color,
|
||||||
|
bool useAlphaChannelOfTexture)
|
||||||
|
{
|
||||||
|
if (!texture)
|
||||||
|
return;
|
||||||
|
|
||||||
|
setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture);
|
||||||
|
disableTextures(1);
|
||||||
|
if (!setTexture(0, texture))
|
||||||
|
return;
|
||||||
|
|
||||||
|
glColor4ub(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
|
||||||
|
if (clipRect)
|
||||||
|
{
|
||||||
|
if (!clipRect->isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
|
glScissor(clipRect->UpperLeftCorner.X, renderTargetSize.Height-clipRect->LowerRightCorner.Y,
|
||||||
|
clipRect->getWidth(),clipRect->getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
const core::dimension2d<s32>& ss = texture->getOriginalSize();
|
||||||
|
core::position2d<s32> targetPos(pos);
|
||||||
|
core::position2d<s32> sourcePos;
|
||||||
|
core::dimension2d<s32> sourceSize;
|
||||||
|
core::rect<f32> tcoords;
|
||||||
|
|
||||||
|
for (u32 i=0; i<indices.size(); ++i)
|
||||||
|
{
|
||||||
|
s32 currentIndex(indices[i]);
|
||||||
|
if (!sourceRects[currentIndex].isValid())
|
||||||
|
break;
|
||||||
|
sourcePos=sourceRects[currentIndex].UpperLeftCorner;
|
||||||
|
sourceSize=sourceRects[currentIndex].getSize();
|
||||||
|
|
||||||
|
tcoords.UpperLeftCorner.X = sourceRects[currentIndex].UpperLeftCorner.X / static_cast<f32>(ss.Width);
|
||||||
|
tcoords.UpperLeftCorner.Y = sourceRects[currentIndex].UpperLeftCorner.Y / static_cast<f32>(ss.Height);
|
||||||
|
tcoords.LowerRightCorner.X = sourceRects[currentIndex].LowerRightCorner.X / static_cast<f32>(ss.Width);
|
||||||
|
tcoords.LowerRightCorner.Y = sourceRects[currentIndex].LowerRightCorner.Y / static_cast<f32>(ss.Height);
|
||||||
|
|
||||||
|
const core::rect<s32> poss(targetPos, sourceSize);
|
||||||
|
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
|
glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y);
|
||||||
|
glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.UpperLeftCorner.Y));
|
||||||
|
|
||||||
|
glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y);
|
||||||
|
glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.UpperLeftCorner.Y));
|
||||||
|
|
||||||
|
glTexCoord2f(tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y);
|
||||||
|
glVertex2f(GLfloat(poss.LowerRightCorner.X), GLfloat(poss.LowerRightCorner.Y));
|
||||||
|
|
||||||
|
glTexCoord2f(tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y);
|
||||||
|
glVertex2f(GLfloat(poss.UpperLeftCorner.X), GLfloat(poss.LowerRightCorner.Y));
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
targetPos.X += sourceRects[currentIndex].getWidth();
|
||||||
|
}
|
||||||
|
if (clipRect)
|
||||||
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! draw a 2d rectangle
|
//! draw a 2d rectangle
|
||||||
void COpenGLDriver::draw2DRectangle(SColor color, const core::rect<s32>& position,
|
void COpenGLDriver::draw2DRectangle(SColor color, const core::rect<s32>& position,
|
||||||
const core::rect<s32>* clip)
|
const core::rect<s32>* clip)
|
||||||
|
@ -1499,10 +1500,8 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
|
||||||
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
const core::dimension2d<s32>& renderTargetSize = getCurrentRenderTargetSize();
|
||||||
const core::vector3df translation(-1,1,0);
|
|
||||||
|
|
||||||
m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-renderTargetSize.Height), -1.0, 1.0);
|
m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-renderTargetSize.Height), -1.0, 1.0);
|
||||||
m.setTranslation(translation);
|
m.setTranslation(core::vector3df(-1,1,0));
|
||||||
|
|
||||||
createGLMatrix(glmat, m);
|
createGLMatrix(glmat, m);
|
||||||
glLoadMatrixf(glmat);
|
glLoadMatrixf(glmat);
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace irr
|
||||||
namespace io
|
namespace io
|
||||||
{
|
{
|
||||||
class IXMLWriter;
|
class IXMLWriter;
|
||||||
|
class IFileSystem;
|
||||||
}
|
}
|
||||||
namespace scene
|
namespace scene
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,9 +84,9 @@ void CShadowVolumeSceneNode::createShadowVolume(const core::vector3df& light)
|
||||||
++ShadowVolumesUsed;
|
++ShadowVolumesUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 faceCount = (int)(IndexCount / 3);
|
const s32 faceCount = (s32)(IndexCount / 3);
|
||||||
|
|
||||||
if (faceCount * 6 > EdgeCount || !Edges)
|
if (!Edges || faceCount * 6 > EdgeCount)
|
||||||
{
|
{
|
||||||
delete [] Edges;
|
delete [] Edges;
|
||||||
EdgeCount = faceCount * 6;
|
EdgeCount = faceCount * 6;
|
||||||
|
@ -94,7 +94,7 @@ void CShadowVolumeSceneNode::createShadowVolume(const core::vector3df& light)
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 numEdges = 0;
|
s32 numEdges = 0;
|
||||||
core::vector3df ls = light * Infinity; // light scaled
|
const core::vector3df ls = light * Infinity; // light scaled
|
||||||
|
|
||||||
//if (UseZFailMethod)
|
//if (UseZFailMethod)
|
||||||
// createZFailVolume(faceCount, numEdges, light, svp);
|
// createZFailVolume(faceCount, numEdges, light, svp);
|
||||||
|
@ -132,16 +132,15 @@ void CShadowVolumeSceneNode::createZFailVolume(s32 faceCount, s32& numEdges,
|
||||||
const core::vector3df& light,
|
const core::vector3df& light,
|
||||||
SShadowVolume* svp)
|
SShadowVolume* svp)
|
||||||
{
|
{
|
||||||
u16 wFace0, wFace1, wFace2;
|
|
||||||
s32 i;
|
s32 i;
|
||||||
core::vector3df ls = light * Infinity;
|
const core::vector3df ls = light * Infinity;
|
||||||
|
|
||||||
// Check every face if it is front or back facing the light.
|
// Check every face if it is front or back facing the light.
|
||||||
for (i=0; i<faceCount; ++i)
|
for (i=0; i<faceCount; ++i)
|
||||||
{
|
{
|
||||||
wFace0 = Indices[3*i+0];
|
const u16 wFace0 = Indices[3*i+0];
|
||||||
wFace1 = Indices[3*i+1];
|
const u16 wFace1 = Indices[3*i+1];
|
||||||
wFace2 = Indices[3*i+2];
|
const u16 wFace2 = Indices[3*i+2];
|
||||||
|
|
||||||
const core::vector3df v0 = Vertices[wFace0];
|
const core::vector3df v0 = Vertices[wFace0];
|
||||||
const core::vector3df v1 = Vertices[wFace1];
|
const core::vector3df v1 = Vertices[wFace1];
|
||||||
|
@ -168,18 +167,17 @@ void CShadowVolumeSceneNode::createZFailVolume(s32 faceCount, s32& numEdges,
|
||||||
FaceData[i] = true; // it's a front facing face
|
FaceData[i] = true; // it's a front facing face
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for(i=0; i<faceCount; ++i)
|
for(i=0; i<faceCount; ++i)
|
||||||
{
|
{
|
||||||
if (FaceData[i] == true)
|
if (FaceData[i] == true)
|
||||||
{
|
{
|
||||||
wFace0 = Indices[3*i+0];
|
const u16 wFace0 = Indices[3*i+0];
|
||||||
wFace1 = Indices[3*i+1];
|
const u16 wFace1 = Indices[3*i+1];
|
||||||
wFace2 = Indices[3*i+2];
|
const u16 wFace2 = Indices[3*i+2];
|
||||||
|
|
||||||
u16 adj0 = Adjacency[3*i+0];
|
const u16 adj0 = Adjacency[3*i+0];
|
||||||
u16 adj1 = Adjacency[3*i+1];
|
const u16 adj1 = Adjacency[3*i+1];
|
||||||
u16 adj2 = Adjacency[3*i+2];
|
const u16 adj2 = Adjacency[3*i+2];
|
||||||
|
|
||||||
if (adj0 != (u16)-1 && FaceData[adj0] == false)
|
if (adj0 != (u16)-1 && FaceData[adj0] == false)
|
||||||
{
|
{
|
||||||
|
@ -217,13 +215,11 @@ void CShadowVolumeSceneNode::createZPassVolume(s32 faceCount,
|
||||||
if (light == core::vector3df(0,0,0))
|
if (light == core::vector3df(0,0,0))
|
||||||
light = core::vector3df(0.0001f,0.0001f,0.0001f);
|
light = core::vector3df(0.0001f,0.0001f,0.0001f);
|
||||||
|
|
||||||
u16 wFace0, wFace1, wFace2;
|
|
||||||
|
|
||||||
for (s32 i=0; i<faceCount; ++i)
|
for (s32 i=0; i<faceCount; ++i)
|
||||||
{
|
{
|
||||||
wFace0 = Indices[3*i+0];
|
const u16 wFace0 = Indices[3*i+0];
|
||||||
wFace1 = Indices[3*i+1];
|
const u16 wFace1 = Indices[3*i+1];
|
||||||
wFace2 = Indices[3*i+2];
|
const u16 wFace2 = Indices[3*i+2];
|
||||||
|
|
||||||
if (core::triangle3df(Vertices[wFace0],Vertices[wFace1],Vertices[wFace2]).isFrontFacing(light))
|
if (core::triangle3df(Vertices[wFace0],Vertices[wFace1],Vertices[wFace2]).isFrontFacing(light))
|
||||||
{
|
{
|
||||||
|
@ -353,7 +349,7 @@ void CShadowVolumeSceneNode::setMeshToRenderFrom(const IMesh* mesh)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// recalculate adjacency if neccessarry
|
// recalculate adjacency if necessary
|
||||||
if (oldVertexCount != VertexCount &&
|
if (oldVertexCount != VertexCount &&
|
||||||
oldIndexCount != IndexCount && UseZFailMethod)
|
oldIndexCount != IndexCount && UseZFailMethod)
|
||||||
calculateAdjacency();
|
calculateAdjacency();
|
||||||
|
@ -451,11 +447,11 @@ void CShadowVolumeSceneNode::calculateAdjacency(f32 epsilon)
|
||||||
for (s32 e=0; e<3; ++e)
|
for (s32 e=0; e<3; ++e)
|
||||||
{
|
{
|
||||||
t = v1.getDistanceFromSQ(Vertices[Indices[of+e]]);
|
t = v1.getDistanceFromSQ(Vertices[Indices[of+e]]);
|
||||||
if (t <= epsilon && t >= -epsilon)
|
if (core::iszero(t))
|
||||||
++cnt1;
|
++cnt1;
|
||||||
|
|
||||||
t = v2.getDistanceFromSQ(Vertices[Indices[of+e]]);
|
t = v2.getDistanceFromSQ(Vertices[Indices[of+e]]);
|
||||||
if (t <= epsilon && t >= -epsilon)
|
if (core::iszero(t))
|
||||||
++cnt2;
|
++cnt2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,3 +470,4 @@ void CShadowVolumeSceneNode::calculateAdjacency(f32 epsilon)
|
||||||
|
|
||||||
} // end namespace scene
|
} // end namespace scene
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue