Merged from 1.6 branch, revisions 2665:2683. External creation of CSkinnedMesh. Texture matrix bug fixed. obj loader fixed. Divide by zero checks. Some API methods renamed. Strict aliasing fixes. Collada loader fixed.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2684 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
34d47c1cff
commit
64ad07a38e
|
@ -1,9 +1,9 @@
|
||||||
Changes in 1.6 (??.??.2009)
|
Changes in 1.6 (??.??.2009)
|
||||||
|
|
||||||
- Fix cursor problems found by buffer and by rvl2 as described in http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=34823&highlight=
|
- Renamed some methods in ISkinnedMesh to match the official Irrlicht naming scheme according to createXXX()
|
||||||
|
|
||||||
- Change debug data to draw using lines instead of arrows, which is much faster. Patch by pc0de
|
- Change debug data to draw using lines instead of arrows, which is much faster. Patch by pc0de
|
||||||
|
|
||||||
- Fix a bug with FPS camera animator causing stutters. Patch by FuzzYspo0N
|
- Fix a bug with FPS camera animator causing stutters. Patch by FuzzYspo0N
|
||||||
|
|
||||||
- Fix scrolling controls in CGUITabControl
|
- Fix scrolling controls in CGUITabControl
|
||||||
|
@ -647,6 +647,8 @@ Changes in 1.6 (??.??.2009)
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
Changes in version 1.5.1 (??.?? 2009)
|
Changes in version 1.5.1 (??.?? 2009)
|
||||||
|
|
||||||
|
- Fix cursor problems found by buffer and by rvl2 as described in http://irrlicht.sourceforge.net/phpBB2/viewtopic.php?t=34823&highlight=
|
||||||
|
|
||||||
- Make sure a missing font does not corrupt the skin.
|
- Make sure a missing font does not corrupt the skin.
|
||||||
|
|
||||||
- Fix getAngle in vector2d as suggested by xray. This has only a minor impact on s32 vectors.
|
- Fix getAngle in vector2d as suggested by xray. This has only a minor impact on s32 vectors.
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "EMeshWriterEnums.h"
|
#include "EMeshWriterEnums.h"
|
||||||
#include "SceneParameters.h"
|
#include "SceneParameters.h"
|
||||||
#include "IGeometryCreator.h"
|
#include "IGeometryCreator.h"
|
||||||
|
#include "ISkinnedMesh.h"
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
|
@ -1440,6 +1441,11 @@ namespace scene
|
||||||
for details. */
|
for details. */
|
||||||
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
|
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type) = 0;
|
||||||
|
|
||||||
|
//! Get a skinned mesh, which is not available as header-only code
|
||||||
|
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
|
||||||
|
for details. */
|
||||||
|
virtual ISkinnedMesh* createSkinnedMesh() = 0;
|
||||||
|
|
||||||
//! Sets ambient color of the scene
|
//! Sets ambient color of the scene
|
||||||
virtual void setAmbientLight(const video::SColorf &ambientColor) = 0;
|
virtual void setAmbientLight(const video::SColorf &ambientColor) = 0;
|
||||||
|
|
||||||
|
|
|
@ -34,33 +34,35 @@ namespace scene
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Gets joint count.
|
//! Gets joint count.
|
||||||
//! \return Returns amount of joints in the skeletal animated mesh.
|
/** \return Amount of joints in the skeletal animated mesh. */
|
||||||
virtual u32 getJointCount() const = 0;
|
virtual u32 getJointCount() const = 0;
|
||||||
|
|
||||||
//! Gets the name of a joint.
|
//! Gets the name of a joint.
|
||||||
//! \param number: Zero based index of joint. The last joint
|
/** \param number: Zero based index of joint. The last joint
|
||||||
//! has the number getJointCount()-1;
|
has the number getJointCount()-1;
|
||||||
//! \return Returns name of joint and null if an error happened.
|
\return Name of joint and null if an error happened. */
|
||||||
virtual const c8* getJointName(u32 number) const = 0;
|
virtual const c8* getJointName(u32 number) const = 0;
|
||||||
|
|
||||||
//! Gets a joint number from its name
|
//! Gets a joint number from its name
|
||||||
//! \param name: Name of the joint.
|
/** \param name: Name of the joint.
|
||||||
//! \return Returns the number of the joint or -1 if not found.
|
\return Number of the joint or -1 if not found. */
|
||||||
virtual s32 getJointNumber(const c8* name) const = 0;
|
virtual s32 getJointNumber(const c8* name) const = 0;
|
||||||
|
|
||||||
//! uses animation from another mesh
|
//! Use animation from another mesh
|
||||||
//! the animation is linked (not copied) based on joint names (so make sure they are unique)
|
/** The animation is linked (not copied) based on joint names
|
||||||
//! \return Returns true if all joints in this mesh were
|
so make sure they are unique.
|
||||||
//! matched up (empty names will not be matched, and it's case
|
\return True if all joints in this mesh were
|
||||||
//! sensitive). Unmatched joints will not be animated.
|
matched up (empty names will not be matched, and it's case
|
||||||
|
sensitive). Unmatched joints will not be animated. */
|
||||||
virtual bool useAnimationFrom(const ISkinnedMesh *mesh) = 0;
|
virtual bool useAnimationFrom(const ISkinnedMesh *mesh) = 0;
|
||||||
|
|
||||||
//!Update Normals when Animating
|
//! Update Normals when Animating
|
||||||
//!False= Don't animate, faster
|
/** \param on If false don't animate, which is faster.
|
||||||
//!True= Update normals
|
Else update normals, which allows for proper lighting of
|
||||||
|
animated meshes. */
|
||||||
virtual void updateNormalsWhenAnimating(bool on) = 0;
|
virtual void updateNormalsWhenAnimating(bool on) = 0;
|
||||||
|
|
||||||
//!Sets Interpolation Mode
|
//! Sets Interpolation Mode
|
||||||
virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0;
|
virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0;
|
||||||
|
|
||||||
//! Animates this mesh's joints based on frame input
|
//! Animates this mesh's joints based on frame input
|
||||||
|
@ -69,10 +71,12 @@ namespace scene
|
||||||
//! Preforms a software skin on this mesh based of joint positions
|
//! Preforms a software skin on this mesh based of joint positions
|
||||||
virtual void skinMesh() = 0;
|
virtual void skinMesh() = 0;
|
||||||
|
|
||||||
//! converts the vertex type of all meshbuffers to tangents. eg for bumpmapping
|
//! converts the vertex type of all meshbuffers to tangents.
|
||||||
|
/** E.g. used for bump mapping. */
|
||||||
virtual void convertMeshToTangents() = 0;
|
virtual void convertMeshToTangents() = 0;
|
||||||
|
|
||||||
//! (This feature is not implementated in irrlicht yet)
|
//! Allows to enable hardware skinning.
|
||||||
|
/* This feature is not implementated in Irrlicht yet */
|
||||||
virtual bool setHardwareSkinning(bool on) = 0;
|
virtual bool setHardwareSkinning(bool on) = 0;
|
||||||
|
|
||||||
//! A vertex weight
|
//! A vertex weight
|
||||||
|
@ -179,26 +183,34 @@ namespace scene
|
||||||
//these functions will use the needed arrays, set values, etc to help the loaders
|
//these functions will use the needed arrays, set values, etc to help the loaders
|
||||||
|
|
||||||
//! exposed for loaders: to add mesh buffers
|
//! exposed for loaders: to add mesh buffers
|
||||||
virtual core::array<SSkinMeshBuffer*> &getMeshBuffers() = 0;
|
virtual core::array<SSkinMeshBuffer*>& getMeshBuffers() = 0;
|
||||||
|
|
||||||
//! exposed for loaders: joints list
|
//! exposed for loaders: joints list
|
||||||
virtual core::array<SJoint*> &getAllJoints() = 0;
|
virtual core::array<SJoint*>& getAllJoints() = 0;
|
||||||
|
|
||||||
//! exposed for loaders: joints list
|
//! exposed for loaders: joints list
|
||||||
virtual const core::array<SJoint*> &getAllJoints() const = 0;
|
virtual const core::array<SJoint*>& getAllJoints() const = 0;
|
||||||
|
|
||||||
//! loaders should call this after populating the mesh
|
//! loaders should call this after populating the mesh
|
||||||
virtual void finalize() = 0;
|
virtual void finalize() = 0;
|
||||||
|
|
||||||
virtual SSkinMeshBuffer *createBuffer() = 0;
|
//! Adds a new meshbuffer to the mesh, access it as last one
|
||||||
|
virtual SSkinMeshBuffer* addMeshBuffer() = 0;
|
||||||
|
|
||||||
virtual SJoint *createJoint(SJoint *parent=0) = 0;
|
//! Adds a new joint to the mesh, access it as last one
|
||||||
virtual SWeight *createWeight(SJoint *joint) = 0;
|
virtual SJoint* addJoint(SJoint *parent=0) = 0;
|
||||||
|
|
||||||
virtual SPositionKey *createPositionKey(SJoint *joint) = 0;
|
//! Adds a new weight to the mesh, access it as last one
|
||||||
virtual SScaleKey *createScaleKey(SJoint *joint) = 0;
|
virtual SWeight* addWeight(SJoint *joint) = 0;
|
||||||
virtual SRotationKey *createRotationKey(SJoint *joint) = 0;
|
|
||||||
|
|
||||||
|
//! Adds a new position key to the mesh, access it as last one
|
||||||
|
virtual SPositionKey* addPositionKey(SJoint *joint) = 0;
|
||||||
|
//! Adds a new scale key to the mesh, access it as last one
|
||||||
|
virtual SScaleKey* addScaleKey(SJoint *joint) = 0;
|
||||||
|
//! Adds a new rotation key to the mesh, access it as last one
|
||||||
|
virtual SRotationKey* addRotationKey(SJoint *joint) = 0;
|
||||||
|
|
||||||
|
//! Check if the mesh is non-animated
|
||||||
virtual bool isStatic()=0;
|
virtual bool isStatic()=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -979,7 +979,7 @@ namespace video
|
||||||
\param flag Texture creation flag.
|
\param flag Texture creation flag.
|
||||||
\param enabled Specifies if the given flag should be enabled or
|
\param enabled Specifies if the given flag should be enabled or
|
||||||
disabled. */
|
disabled. */
|
||||||
virtual void setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, bool enabled) =0;
|
virtual void setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, bool enabled=true) =0;
|
||||||
|
|
||||||
//! Returns if a texture creation flag is enabled or disabled.
|
//! Returns if a texture creation flag is enabled or disabled.
|
||||||
/** You can change this value using setTextureCreationMode().
|
/** You can change this value using setTextureCreationMode().
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "SColor.h"
|
#include "SColor.h"
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "irrArray.h"
|
#include "irrArray.h"
|
||||||
|
#include "irrMath.h"
|
||||||
#include "EMaterialTypes.h"
|
#include "EMaterialTypes.h"
|
||||||
#include "EMaterialFlags.h"
|
#include "EMaterialFlags.h"
|
||||||
#include "SMaterialLayer.h"
|
#include "SMaterialLayer.h"
|
||||||
|
@ -100,7 +101,7 @@ namespace video
|
||||||
inline f32 pack_texureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE )
|
inline f32 pack_texureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE )
|
||||||
{
|
{
|
||||||
const u32 tmp = (alphaSource << 24) | (modulate << 16) | (srcFact << 8) | dstFact;
|
const u32 tmp = (alphaSource << 24) | (modulate << 16) | (srcFact << 8) | dstFact;
|
||||||
return *((f32*)&tmp);
|
return FR(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! EMT_ONETEXTURE_BLEND: unpack srcFact & dstFact and Modulo to MaterialTypeParam
|
//! EMT_ONETEXTURE_BLEND: unpack srcFact & dstFact and Modulo to MaterialTypeParam
|
||||||
|
@ -108,7 +109,7 @@ namespace video
|
||||||
inline void unpack_texureBlendFunc ( E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact,
|
inline void unpack_texureBlendFunc ( E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact,
|
||||||
E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param )
|
E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param )
|
||||||
{
|
{
|
||||||
const u32 state = *((u32*)¶m);
|
const u32 state = IR(param);
|
||||||
alphaSource = (state & 0xFF000000) >> 24;
|
alphaSource = (state & 0xFF000000) >> 24;
|
||||||
modulo = E_MODULATE_FUNC( ( state & 0x00FF0000 ) >> 16 );
|
modulo = E_MODULATE_FUNC( ( state & 0x00FF0000 ) >> 16 );
|
||||||
srcFact = E_BLEND_FACTOR ( ( state & 0x0000FF00 ) >> 8 );
|
srcFact = E_BLEND_FACTOR ( ( state & 0x0000FF00 ) >> 8 );
|
||||||
|
|
|
@ -450,6 +450,7 @@ namespace core
|
||||||
// calculate: 1 / x
|
// calculate: 1 / x
|
||||||
REALINLINE f32 reciprocal( const f32 f )
|
REALINLINE f32 reciprocal( const f32 f )
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(f==0.f); //divide by zero
|
||||||
#if defined (IRRLICHT_FAST_MATH)
|
#if defined (IRRLICHT_FAST_MATH)
|
||||||
|
|
||||||
// SSE Newton-Raphson reciprocal estimate, accurate to 23 significant
|
// SSE Newton-Raphson reciprocal estimate, accurate to 23 significant
|
||||||
|
@ -483,6 +484,7 @@ namespace core
|
||||||
// calculate: 1 / x
|
// calculate: 1 / x
|
||||||
REALINLINE f64 reciprocal ( const f64 f )
|
REALINLINE f64 reciprocal ( const f64 f )
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(f==0.); //divide by zero
|
||||||
return 1.0 / f;
|
return 1.0 / f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,6 +492,7 @@ namespace core
|
||||||
// calculate: 1 / x, low precision allowed
|
// calculate: 1 / x, low precision allowed
|
||||||
REALINLINE f32 reciprocal_approxim ( const f32 f )
|
REALINLINE f32 reciprocal_approxim ( const f32 f )
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(f==0.f); //divide by zero
|
||||||
#if defined( IRRLICHT_FAST_MATH)
|
#if defined( IRRLICHT_FAST_MATH)
|
||||||
|
|
||||||
// SSE Newton-Raphson reciprocal estimate, accurate to 23 significant
|
// SSE Newton-Raphson reciprocal estimate, accurate to 23 significant
|
||||||
|
@ -639,5 +642,10 @@ namespace core
|
||||||
} // end namespace core
|
} // end namespace core
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
|
||||||
|
#ifndef IRRLICHT_FAST_MATH
|
||||||
|
using irr::core::IR;
|
||||||
|
using irr::core::FR;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
#include "IEventReceiver.h"
|
#include "IEventReceiver.h"
|
||||||
#include "IFileList.h"
|
#include "IFileList.h"
|
||||||
#include "IFileSystem.h"
|
#include "IFileSystem.h"
|
||||||
|
#include "IGeometryCreator.h"
|
||||||
#include "IGPUProgrammingServices.h"
|
#include "IGPUProgrammingServices.h"
|
||||||
#include "IGUIButton.h"
|
#include "IGUIButton.h"
|
||||||
#include "IGUICheckBox.h"
|
#include "IGUICheckBox.h"
|
||||||
|
|
|
@ -1407,9 +1407,11 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveFovRH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveFovRH(
|
||||||
f32 fieldOfViewRadians, f32 aspectRatio, f32 zNear, f32 zFar)
|
f32 fieldOfViewRadians, f32 aspectRatio, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
const f64 h = 1.0/tan(fieldOfViewRadians/2.0);
|
const f64 h = reciprocal(tan(fieldOfViewRadians*0.5));
|
||||||
|
_IRR_DEBUG_BREAK_IF(aspectRatio==0.f); //divide by zero
|
||||||
const T w = h / aspectRatio;
|
const T w = h / aspectRatio;
|
||||||
|
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = w;
|
M[0] = w;
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1444,9 +1446,11 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveFovLH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveFovLH(
|
||||||
f32 fieldOfViewRadians, f32 aspectRatio, f32 zNear, f32 zFar)
|
f32 fieldOfViewRadians, f32 aspectRatio, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
const f64 h = 1.0/tan(fieldOfViewRadians/2.0);
|
const f64 h = reciprocal(tan(fieldOfViewRadians*0.5));
|
||||||
|
_IRR_DEBUG_BREAK_IF(aspectRatio==0.f); //divide by zero
|
||||||
const T w = (T)(h / aspectRatio);
|
const T w = (T)(h / aspectRatio);
|
||||||
|
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = w;
|
M[0] = w;
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1479,6 +1483,9 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixOrthoLH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixOrthoLH(
|
||||||
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(widthOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(heightOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = (T)(2/widthOfViewVolume);
|
M[0] = (T)(2/widthOfViewVolume);
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1511,6 +1518,9 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixOrthoRH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixOrthoRH(
|
||||||
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(widthOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(heightOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = (T)(2/widthOfViewVolume);
|
M[0] = (T)(2/widthOfViewVolume);
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1543,6 +1553,9 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveRH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveRH(
|
||||||
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(widthOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(heightOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = (T)(2*zNear/widthOfViewVolume);
|
M[0] = (T)(2*zNear/widthOfViewVolume);
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1575,6 +1588,9 @@ namespace core
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveLH(
|
inline CMatrix4<T>& CMatrix4<T>::buildProjectionMatrixPerspectiveLH(
|
||||||
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
f32 widthOfViewVolume, f32 heightOfViewVolume, f32 zNear, f32 zFar)
|
||||||
{
|
{
|
||||||
|
_IRR_DEBUG_BREAK_IF(widthOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(heightOfViewVolume==0.f); //divide by zero
|
||||||
|
_IRR_DEBUG_BREAK_IF(zNear==zFar); //divide by zero
|
||||||
M[0] = (T)(2*zNear/widthOfViewVolume);
|
M[0] = (T)(2*zNear/widthOfViewVolume);
|
||||||
M[1] = 0;
|
M[1] = 0;
|
||||||
M[2] = 0;
|
M[2] = 0;
|
||||||
|
@ -1775,11 +1791,11 @@ namespace core
|
||||||
template <class T>
|
template <class T>
|
||||||
inline CMatrix4<T>& CMatrix4<T>::buildNDCToDCMatrix( const core::rect<s32>& viewport, f32 zScale)
|
inline CMatrix4<T>& CMatrix4<T>::buildNDCToDCMatrix( const core::rect<s32>& viewport, f32 zScale)
|
||||||
{
|
{
|
||||||
const f32 scaleX = (viewport.getWidth() - 0.75f ) / 2.0f;
|
const f32 scaleX = (viewport.getWidth() - 0.75f ) * 0.5f;
|
||||||
const f32 scaleY = -(viewport.getHeight() - 0.75f ) / 2.0f;
|
const f32 scaleY = -(viewport.getHeight() - 0.75f ) * 0.5f;
|
||||||
|
|
||||||
const f32 dx = -0.5f + ( (viewport.UpperLeftCorner.X + viewport.LowerRightCorner.X ) / 2.0f );
|
const f32 dx = -0.5f + ( (viewport.UpperLeftCorner.X + viewport.LowerRightCorner.X ) * 0.5f );
|
||||||
const f32 dy = -0.5f + ( (viewport.UpperLeftCorner.Y + viewport.LowerRightCorner.Y ) / 2.0f );
|
const f32 dy = -0.5f + ( (viewport.UpperLeftCorner.Y + viewport.LowerRightCorner.Y ) * 0.5f );
|
||||||
|
|
||||||
makeIdentity();
|
makeIdentity();
|
||||||
M[12] = (T)dx;
|
M[12] = (T)dx;
|
||||||
|
|
|
@ -23,9 +23,10 @@ namespace scene
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
enum e3DSChunk
|
enum e3DSChunk
|
||||||
{
|
{
|
||||||
|
|
||||||
// Primary chunk
|
// Primary chunk
|
||||||
C3DS_MAIN3DS = 0x4D4D,
|
C3DS_MAIN3DS = 0x4D4D,
|
||||||
|
|
||||||
|
@ -120,6 +121,7 @@ enum e3DSChunk
|
||||||
|
|
||||||
C3DS_CHUNK_MAX = 0xFFFF
|
C3DS_CHUNK_MAX = 0xFFFF
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Constructor
|
//! Constructor
|
||||||
|
|
|
@ -152,13 +152,13 @@ bool CB3DMeshFileLoader::load()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CB3DMeshFileLoader::readChunkNODE(CSkinnedMesh::SJoint *InJoint)
|
bool CB3DMeshFileLoader::readChunkNODE(CSkinnedMesh::SJoint *inJoint)
|
||||||
{
|
{
|
||||||
CSkinnedMesh::SJoint *Joint = AnimatedMesh->createJoint(InJoint);
|
CSkinnedMesh::SJoint *joint = AnimatedMesh->addJoint(inJoint);
|
||||||
readString(Joint->Name);
|
readString(joint->Name);
|
||||||
|
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
os::Printer::log("read ChunkNODE", Joint->Name.c_str());
|
os::Printer::log("read ChunkNODE", joint->Name.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
f32 position[3], scale[3], rotation[4];
|
f32 position[3], scale[3], rotation[4];
|
||||||
|
@ -167,24 +167,24 @@ bool CB3DMeshFileLoader::readChunkNODE(CSkinnedMesh::SJoint *InJoint)
|
||||||
readFloats(scale, 3);
|
readFloats(scale, 3);
|
||||||
readFloats(rotation, 4);
|
readFloats(rotation, 4);
|
||||||
|
|
||||||
Joint->Animatedposition = core::vector3df(position[0],position[1],position[2]) ;
|
joint->Animatedposition = core::vector3df(position[0],position[1],position[2]) ;
|
||||||
Joint->Animatedscale = core::vector3df(scale[0],scale[1],scale[2]);
|
joint->Animatedscale = core::vector3df(scale[0],scale[1],scale[2]);
|
||||||
Joint->Animatedrotation = core::quaternion(rotation[1], rotation[2], rotation[3], rotation[0]);
|
joint->Animatedrotation = core::quaternion(rotation[1], rotation[2], rotation[3], rotation[0]);
|
||||||
|
|
||||||
//Build LocalMatrix:
|
//Build LocalMatrix:
|
||||||
|
|
||||||
core::matrix4 positionMatrix;
|
core::matrix4 positionMatrix;
|
||||||
positionMatrix.setTranslation( Joint->Animatedposition );
|
positionMatrix.setTranslation( joint->Animatedposition );
|
||||||
core::matrix4 scaleMatrix;
|
core::matrix4 scaleMatrix;
|
||||||
scaleMatrix.setScale( Joint->Animatedscale );
|
scaleMatrix.setScale( joint->Animatedscale );
|
||||||
core::matrix4 rotationMatrix = Joint->Animatedrotation.getMatrix();
|
core::matrix4 rotationMatrix = joint->Animatedrotation.getMatrix();
|
||||||
|
|
||||||
Joint->LocalMatrix = positionMatrix * rotationMatrix * scaleMatrix;
|
joint->LocalMatrix = positionMatrix * rotationMatrix * scaleMatrix;
|
||||||
|
|
||||||
if (InJoint)
|
if (inJoint)
|
||||||
Joint->GlobalMatrix = InJoint->GlobalMatrix * Joint->LocalMatrix;
|
joint->GlobalMatrix = inJoint->GlobalMatrix * joint->LocalMatrix;
|
||||||
else
|
else
|
||||||
Joint->GlobalMatrix = Joint->LocalMatrix;
|
joint->GlobalMatrix = joint->LocalMatrix;
|
||||||
|
|
||||||
while(B3dStack.getLast().startposition + B3dStack.getLast().length > B3DFile->getPos()) // this chunk repeats
|
while(B3dStack.getLast().startposition + B3dStack.getLast().length > B3DFile->getPos()) // this chunk repeats
|
||||||
{
|
{
|
||||||
|
@ -198,22 +198,22 @@ bool CB3DMeshFileLoader::readChunkNODE(CSkinnedMesh::SJoint *InJoint)
|
||||||
|
|
||||||
if ( strncmp( B3dStack.getLast().name, "NODE", 4 ) == 0 )
|
if ( strncmp( B3dStack.getLast().name, "NODE", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
if (!readChunkNODE(Joint))
|
if (!readChunkNODE(joint))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ( strncmp( B3dStack.getLast().name, "MESH", 4 ) == 0 )
|
else if ( strncmp( B3dStack.getLast().name, "MESH", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
if (!readChunkMESH(Joint))
|
if (!readChunkMESH(joint))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ( strncmp( B3dStack.getLast().name, "BONE", 4 ) == 0 )
|
else if ( strncmp( B3dStack.getLast().name, "BONE", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
if (!readChunkBONE(Joint))
|
if (!readChunkBONE(joint))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ( strncmp( B3dStack.getLast().name, "KEYS", 4 ) == 0 )
|
else if ( strncmp( B3dStack.getLast().name, "KEYS", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
if(!readChunkKEYS(Joint))
|
if(!readChunkKEYS(joint))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ( strncmp( B3dStack.getLast().name, "ANIM", 4 ) == 0 )
|
else if ( strncmp( B3dStack.getLast().name, "ANIM", 4 ) == 0 )
|
||||||
|
@ -235,7 +235,7 @@ bool CB3DMeshFileLoader::readChunkNODE(CSkinnedMesh::SJoint *InJoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CB3DMeshFileLoader::readChunkMESH(CSkinnedMesh::SJoint *InJoint)
|
bool CB3DMeshFileLoader::readChunkMESH(CSkinnedMesh::SJoint *inJoint)
|
||||||
{
|
{
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
os::Printer::log("read ChunkMESH");
|
os::Printer::log("read ChunkMESH");
|
||||||
|
@ -263,41 +263,41 @@ bool CB3DMeshFileLoader::readChunkMESH(CSkinnedMesh::SJoint *InJoint)
|
||||||
|
|
||||||
if ( strncmp( B3dStack.getLast().name, "VRTS", 4 ) == 0 )
|
if ( strncmp( B3dStack.getLast().name, "VRTS", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
if (!readChunkVRTS(InJoint))
|
if (!readChunkVRTS(inJoint))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ( strncmp( B3dStack.getLast().name, "TRIS", 4 ) == 0 )
|
else if ( strncmp( B3dStack.getLast().name, "TRIS", 4 ) == 0 )
|
||||||
{
|
{
|
||||||
scene::SSkinMeshBuffer *MeshBuffer = AnimatedMesh->createBuffer();
|
scene::SSkinMeshBuffer *meshBuffer = AnimatedMesh->addMeshBuffer();
|
||||||
|
|
||||||
if (brush_id!=-1)
|
if (brush_id!=-1)
|
||||||
{
|
{
|
||||||
loadTextures(Materials[brush_id]);
|
loadTextures(Materials[brush_id]);
|
||||||
MeshBuffer->Material=Materials[brush_id].Material;
|
meshBuffer->Material=Materials[brush_id].Material;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(readChunkTRIS(MeshBuffer,AnimatedMesh->getMeshBuffers().size()-1, vertices_Start)==false)
|
if(readChunkTRIS(meshBuffer,AnimatedMesh->getMeshBuffers().size()-1, vertices_Start)==false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!NormalsInFile)
|
if (!NormalsInFile)
|
||||||
{
|
{
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
for ( i=0; i<(s32)MeshBuffer->Indices.size(); i+=3)
|
for ( i=0; i<(s32)meshBuffer->Indices.size(); i+=3)
|
||||||
{
|
{
|
||||||
core::plane3df p(MeshBuffer->getVertex(MeshBuffer->Indices[i+0])->Pos,
|
core::plane3df p(meshBuffer->getVertex(meshBuffer->Indices[i+0])->Pos,
|
||||||
MeshBuffer->getVertex(MeshBuffer->Indices[i+1])->Pos,
|
meshBuffer->getVertex(meshBuffer->Indices[i+1])->Pos,
|
||||||
MeshBuffer->getVertex(MeshBuffer->Indices[i+2])->Pos);
|
meshBuffer->getVertex(meshBuffer->Indices[i+2])->Pos);
|
||||||
|
|
||||||
MeshBuffer->getVertex(MeshBuffer->Indices[i+0])->Normal += p.Normal;
|
meshBuffer->getVertex(meshBuffer->Indices[i+0])->Normal += p.Normal;
|
||||||
MeshBuffer->getVertex(MeshBuffer->Indices[i+1])->Normal += p.Normal;
|
meshBuffer->getVertex(meshBuffer->Indices[i+1])->Normal += p.Normal;
|
||||||
MeshBuffer->getVertex(MeshBuffer->Indices[i+2])->Normal += p.Normal;
|
meshBuffer->getVertex(meshBuffer->Indices[i+2])->Normal += p.Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0; i<(s32)MeshBuffer->getVertexCount(); ++i )
|
for ( i = 0; i<(s32)meshBuffer->getVertexCount(); ++i )
|
||||||
{
|
{
|
||||||
MeshBuffer->getVertex(i)->Normal.normalize();
|
meshBuffer->getVertex(i)->Normal.normalize();
|
||||||
BaseVertices[vertices_Start+i].Normal=MeshBuffer->getVertex(i)->Normal;
|
BaseVertices[vertices_Start+i].Normal=meshBuffer->getVertex(i)->Normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,7 +328,7 @@ VRTS:
|
||||||
float tex_coords[tex_coord_sets][tex_coord_set_size] ;tex coords
|
float tex_coords[tex_coord_sets][tex_coord_set_size] ;tex coords
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
bool CB3DMeshFileLoader::readChunkVRTS(CSkinnedMesh::SJoint *InJoint)
|
bool CB3DMeshFileLoader::readChunkVRTS(CSkinnedMesh::SJoint *inJoint)
|
||||||
{
|
{
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
os::Printer::log("read ChunkVRTS");
|
os::Printer::log("read ChunkVRTS");
|
||||||
|
@ -412,8 +412,8 @@ bool CB3DMeshFileLoader::readChunkVRTS(CSkinnedMesh::SJoint *InJoint)
|
||||||
tu, tv, tu2, tv2);
|
tu, tv, tu2, tv2);
|
||||||
|
|
||||||
// Transform the Vertex position by nested node...
|
// Transform the Vertex position by nested node...
|
||||||
InJoint->GlobalMatrix.transformVect(Vertex.Pos);
|
inJoint->GlobalMatrix.transformVect(Vertex.Pos);
|
||||||
InJoint->GlobalMatrix.rotateVect(Vertex.Normal);
|
inJoint->GlobalMatrix.rotateVect(Vertex.Normal);
|
||||||
|
|
||||||
//Add it...
|
//Add it...
|
||||||
BaseVertices.push_back(Vertex);
|
BaseVertices.push_back(Vertex);
|
||||||
|
@ -428,7 +428,7 @@ bool CB3DMeshFileLoader::readChunkVRTS(CSkinnedMesh::SJoint *InJoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 MeshBufferID, s32 vertices_Start)
|
bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *meshBuffer, u32 meshBufferID, s32 vertices_Start)
|
||||||
{
|
{
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
os::Printer::log("read ChunkTRIS");
|
os::Printer::log("read ChunkTRIS");
|
||||||
|
@ -448,13 +448,13 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 M
|
||||||
{
|
{
|
||||||
loadTextures(Materials[triangle_brush_id]);
|
loadTextures(Materials[triangle_brush_id]);
|
||||||
B3dMaterial = &Materials[triangle_brush_id];
|
B3dMaterial = &Materials[triangle_brush_id];
|
||||||
MeshBuffer->Material = B3dMaterial->Material;
|
meshBuffer->Material = B3dMaterial->Material;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
B3dMaterial = 0;
|
B3dMaterial = 0;
|
||||||
|
|
||||||
const s32 memoryNeeded = B3dStack.getLast().length / sizeof(s32);
|
const s32 memoryNeeded = B3dStack.getLast().length / sizeof(s32);
|
||||||
MeshBuffer->Indices.reallocate(memoryNeeded + MeshBuffer->Indices.size() + 1);
|
meshBuffer->Indices.reallocate(memoryNeeded + meshBuffer->Indices.size() + 1);
|
||||||
|
|
||||||
while((B3dStack.getLast().startposition + B3dStack.getLast().length) > B3DFile->getPos()) // this chunk repeats
|
while((B3dStack.getLast().startposition + B3dStack.getLast().length) > B3DFile->getPos()) // this chunk repeats
|
||||||
{
|
{
|
||||||
|
@ -482,7 +482,7 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 M
|
||||||
|
|
||||||
if (AnimatedVertices_VertexID[ vertex_id[i] ] != -1)
|
if (AnimatedVertices_VertexID[ vertex_id[i] ] != -1)
|
||||||
{
|
{
|
||||||
if ( AnimatedVertices_BufferID[ vertex_id[i] ] != (s32)MeshBufferID ) //If this vertex is linked in a different meshbuffer
|
if ( AnimatedVertices_BufferID[ vertex_id[i] ] != (s32)meshBufferID ) //If this vertex is linked in a different meshbuffer
|
||||||
{
|
{
|
||||||
AnimatedVertices_VertexID[ vertex_id[i] ] = -1;
|
AnimatedVertices_VertexID[ vertex_id[i] ] = -1;
|
||||||
AnimatedVertices_BufferID[ vertex_id[i] ] = -1;
|
AnimatedVertices_BufferID[ vertex_id[i] ] = -1;
|
||||||
|
@ -493,22 +493,22 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 M
|
||||||
{
|
{
|
||||||
//Check for lightmapping:
|
//Check for lightmapping:
|
||||||
if (BaseVertices[ vertex_id[i] ].TCoords2 != core::vector2df(0.f,0.f))
|
if (BaseVertices[ vertex_id[i] ].TCoords2 != core::vector2df(0.f,0.f))
|
||||||
MeshBuffer->MoveTo_2TCoords(); //Will only affect the meshbuffer the first time this is called
|
meshBuffer->MoveTo_2TCoords(); //Will only affect the meshbuffer the first time this is called
|
||||||
|
|
||||||
//Add the vertex to the meshbuffer:
|
//Add the vertex to the meshbuffer:
|
||||||
if (MeshBuffer->VertexType == video::EVT_STANDARD)
|
if (meshBuffer->VertexType == video::EVT_STANDARD)
|
||||||
MeshBuffer->Vertices_Standard.push_back( BaseVertices[ vertex_id[i] ] );
|
meshBuffer->Vertices_Standard.push_back( BaseVertices[ vertex_id[i] ] );
|
||||||
else
|
else
|
||||||
MeshBuffer->Vertices_2TCoords.push_back(BaseVertices[ vertex_id[i] ] );
|
meshBuffer->Vertices_2TCoords.push_back(BaseVertices[ vertex_id[i] ] );
|
||||||
|
|
||||||
//create vertex id to meshbuffer index link:
|
//create vertex id to meshbuffer index link:
|
||||||
AnimatedVertices_VertexID[ vertex_id[i] ] = MeshBuffer->getVertexCount()-1;
|
AnimatedVertices_VertexID[ vertex_id[i] ] = meshBuffer->getVertexCount()-1;
|
||||||
AnimatedVertices_BufferID[ vertex_id[i] ] = MeshBufferID;
|
AnimatedVertices_BufferID[ vertex_id[i] ] = meshBufferID;
|
||||||
|
|
||||||
if (B3dMaterial)
|
if (B3dMaterial)
|
||||||
{
|
{
|
||||||
// Apply Material/Color/etc...
|
// Apply Material/Color/etc...
|
||||||
video::S3DVertex *Vertex=MeshBuffer->getVertex(MeshBuffer->getVertexCount()-1);
|
video::S3DVertex *Vertex=meshBuffer->getVertex(meshBuffer->getVertexCount()-1);
|
||||||
|
|
||||||
if (Vertex->Color.getAlpha() == 255)
|
if (Vertex->Color.getAlpha() == 255)
|
||||||
Vertex->Color.setAlpha( (s32)(B3dMaterial->alpha * 255.0f) );
|
Vertex->Color.setAlpha( (s32)(B3dMaterial->alpha * 255.0f) );
|
||||||
|
@ -530,9 +530,9 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 M
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MeshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[0] ] );
|
meshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[0] ] );
|
||||||
MeshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[1] ] );
|
meshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[1] ] );
|
||||||
MeshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[2] ] );
|
meshBuffer->Indices.push_back( AnimatedVertices_VertexID[ vertex_id[2] ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
B3dStack.erase(B3dStack.size()-1);
|
B3dStack.erase(B3dStack.size()-1);
|
||||||
|
@ -544,7 +544,7 @@ bool CB3DMeshFileLoader::readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 M
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *InJoint)
|
bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *inJoint)
|
||||||
{
|
{
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
os::Printer::log("read ChunkBONE");
|
os::Printer::log("read ChunkBONE");
|
||||||
|
@ -554,7 +554,7 @@ bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *InJoint)
|
||||||
{
|
{
|
||||||
while((B3dStack.getLast().startposition + B3dStack.getLast().length) > B3DFile->getPos()) // this chunk repeats
|
while((B3dStack.getLast().startposition + B3dStack.getLast().length) > B3DFile->getPos()) // this chunk repeats
|
||||||
{
|
{
|
||||||
CSkinnedMesh::SWeight *weight=AnimatedMesh->createWeight(InJoint);
|
CSkinnedMesh::SWeight *weight=AnimatedMesh->addWeight(inJoint);
|
||||||
|
|
||||||
u32 globalVertexID;
|
u32 globalVertexID;
|
||||||
|
|
||||||
|
@ -572,7 +572,7 @@ bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *InJoint)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Find the MeshBuffer and Vertex index from the Global Vertex ID:
|
//Find the meshbuffer and Vertex index from the Global Vertex ID:
|
||||||
weight->vertex_id = AnimatedVertices_VertexID[globalVertexID];
|
weight->vertex_id = AnimatedVertices_VertexID[globalVertexID];
|
||||||
weight->buffer_id = AnimatedVertices_BufferID[globalVertexID];
|
weight->buffer_id = AnimatedVertices_BufferID[globalVertexID];
|
||||||
}
|
}
|
||||||
|
@ -584,7 +584,7 @@ bool CB3DMeshFileLoader::readChunkBONE(CSkinnedMesh::SJoint *InJoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CB3DMeshFileLoader::readChunkKEYS(CSkinnedMesh::SJoint *InJoint)
|
bool CB3DMeshFileLoader::readChunkKEYS(CSkinnedMesh::SJoint *inJoint)
|
||||||
{
|
{
|
||||||
#ifdef _B3D_READER_DEBUG
|
#ifdef _B3D_READER_DEBUG
|
||||||
// os::Printer::log("read ChunkKEYS");
|
// os::Printer::log("read ChunkKEYS");
|
||||||
|
@ -610,21 +610,21 @@ bool CB3DMeshFileLoader::readChunkKEYS(CSkinnedMesh::SJoint *InJoint)
|
||||||
if (flags & 1)
|
if (flags & 1)
|
||||||
{
|
{
|
||||||
readFloats(data, 3);
|
readFloats(data, 3);
|
||||||
CSkinnedMesh::SPositionKey *Key=AnimatedMesh->createPositionKey(InJoint);
|
CSkinnedMesh::SPositionKey *Key=AnimatedMesh->addPositionKey(inJoint);
|
||||||
Key->frame = (f32)frame-1;
|
Key->frame = (f32)frame-1;
|
||||||
Key->position.set(data[0], data[1], data[2]);
|
Key->position.set(data[0], data[1], data[2]);
|
||||||
}
|
}
|
||||||
if (flags & 2)
|
if (flags & 2)
|
||||||
{
|
{
|
||||||
readFloats(data, 3);
|
readFloats(data, 3);
|
||||||
CSkinnedMesh::SScaleKey *Key=AnimatedMesh->createScaleKey(InJoint);
|
CSkinnedMesh::SScaleKey *Key=AnimatedMesh->addScaleKey(inJoint);
|
||||||
Key->frame = (f32)frame-1;
|
Key->frame = (f32)frame-1;
|
||||||
Key->scale.set(data[0], data[1], data[2]);
|
Key->scale.set(data[0], data[1], data[2]);
|
||||||
}
|
}
|
||||||
if (flags & 4)
|
if (flags & 4)
|
||||||
{
|
{
|
||||||
readFloats(data, 4);
|
readFloats(data, 4);
|
||||||
CSkinnedMesh::SRotationKey *Key=AnimatedMesh->createRotationKey(InJoint);
|
CSkinnedMesh::SRotationKey *Key=AnimatedMesh->addRotationKey(inJoint);
|
||||||
Key->frame = (f32)frame-1;
|
Key->frame = (f32)frame-1;
|
||||||
// meant to be in this order since b3d stores W first
|
// meant to be in this order since b3d stores W first
|
||||||
Key->rotation.set(data[1], data[2], data[3], data[0]);
|
Key->rotation.set(data[1], data[2], data[3], data[0]);
|
||||||
|
|
|
@ -28,9 +28,10 @@
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
namespace scene
|
namespace scene
|
||||||
|
{
|
||||||
|
namespace
|
||||||
{
|
{
|
||||||
// currently supported COLLADA tag names
|
// currently supported COLLADA tag names
|
||||||
|
|
||||||
const core::stringc colladaSectionName = "COLLADA";
|
const core::stringc colladaSectionName = "COLLADA";
|
||||||
const core::stringc librarySectionName = "library";
|
const core::stringc librarySectionName = "library";
|
||||||
const core::stringc libraryNodesSectionName = "library_nodes";
|
const core::stringc libraryNodesSectionName = "library_nodes";
|
||||||
|
@ -122,6 +123,7 @@ namespace scene
|
||||||
|
|
||||||
const char* const inputSemanticNames[] = {"POSITION", "VERTEX", "NORMAL", "TEXCOORD",
|
const char* const inputSemanticNames[] = {"POSITION", "VERTEX", "NORMAL", "TEXCOORD",
|
||||||
"UV", "TANGENT", "IMAGE", "TEXTURE", 0};
|
"UV", "TANGENT", "IMAGE", "TEXTURE", 0};
|
||||||
|
}
|
||||||
|
|
||||||
//! following class is for holding and creating instances of library
|
//! following class is for holding and creating instances of library
|
||||||
//! objects, named prefabs in this loader.
|
//! objects, named prefabs in this loader.
|
||||||
|
@ -1859,6 +1861,8 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
|
||||||
core::stringc polygonType = reader->getNodeName();
|
core::stringc polygonType = reader->getNodeName();
|
||||||
const int polygonCount = reader->getAttributeValueAsInt("count"); // Not useful because it only determines the number of primitives, which have arbitrary vertices in case of polygon
|
const int polygonCount = reader->getAttributeValueAsInt("count"); // Not useful because it only determines the number of primitives, which have arbitrary vertices in case of polygon
|
||||||
core::array<SPolygon> polygons;
|
core::array<SPolygon> polygons;
|
||||||
|
if (polygonType == polygonsSectionName)
|
||||||
|
polygons.reallocate(polygonCount);
|
||||||
core::array<int> vCounts;
|
core::array<int> vCounts;
|
||||||
bool parsePolygonOK = false;
|
bool parsePolygonOK = false;
|
||||||
bool parseVcountOK = false;
|
bool parseVcountOK = false;
|
||||||
|
@ -1976,7 +1980,10 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
|
||||||
data.trim();
|
data.trim();
|
||||||
const c8* p = &data[0];
|
const c8* p = &data[0];
|
||||||
SPolygon& poly = polygons.getLast();
|
SPolygon& poly = polygons.getLast();
|
||||||
poly.Indices.reallocate(polygonCount*(maxOffset+1)*3);
|
if (polygonType == polygonsSectionName)
|
||||||
|
poly.Indices.reallocate((maxOffset+1)*3);
|
||||||
|
else
|
||||||
|
poly.Indices.reallocate(polygonCount*(maxOffset+1)*3);
|
||||||
|
|
||||||
if (vCounts.empty())
|
if (vCounts.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -615,15 +615,15 @@ void CD3D8Driver::setTransform(E_TRANSFORMATION_STATE state,
|
||||||
pID3DDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer()));
|
pID3DDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer()));
|
||||||
Transformation3DChanged = true;
|
Transformation3DChanged = true;
|
||||||
break;
|
break;
|
||||||
case ETS_TEXTURE_0:
|
|
||||||
case ETS_TEXTURE_1:
|
|
||||||
case ETS_TEXTURE_2:
|
|
||||||
case ETS_TEXTURE_3:
|
|
||||||
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
|
|
||||||
pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )),
|
|
||||||
(D3DMATRIX*)((void*)mat.pointer()));
|
|
||||||
break;
|
|
||||||
case ETS_COUNT:
|
case ETS_COUNT:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
if (state-ETS_TEXTURE_0 < MATERIAL_MAX_TEXTURES)
|
||||||
|
{
|
||||||
|
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
|
||||||
|
pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )),
|
||||||
|
(D3DMATRIX*)((void*)mat.pointer()));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -650,20 +650,20 @@ void CD3D9Driver::setTransform(E_TRANSFORMATION_STATE state,
|
||||||
case ETS_PROJECTION:
|
case ETS_PROJECTION:
|
||||||
pID3DDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer()));
|
pID3DDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer()));
|
||||||
break;
|
break;
|
||||||
case ETS_TEXTURE_0:
|
|
||||||
case ETS_TEXTURE_1:
|
|
||||||
case ETS_TEXTURE_2:
|
|
||||||
case ETS_TEXTURE_3:
|
|
||||||
if (mat.isIdentity())
|
|
||||||
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
|
|
||||||
pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )),
|
|
||||||
(D3DMATRIX*)((void*)mat.pointer()));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case ETS_COUNT:
|
case ETS_COUNT:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
if (state-ETS_TEXTURE_0 < MATERIAL_MAX_TEXTURES)
|
||||||
|
{
|
||||||
|
if (mat.isIdentity())
|
||||||
|
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
|
||||||
|
pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )),
|
||||||
|
(D3DMATRIX*)((void*)mat.pointer()));
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3085,7 +3085,7 @@ void CD3D9Driver::checkDepthBuffer(ITexture* tex)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
sprintf(buffer,"Could not create DepthBuffer of %ix%i",destSize.Width,destSize.Height);
|
sprintf(buffer,"Could not create DepthBuffer of %ix%i",optSize.Width,optSize.Height);
|
||||||
os::Printer::log(buffer,ELL_ERROR);
|
os::Printer::log(buffer,ELL_ERROR);
|
||||||
}
|
}
|
||||||
DepthBuffers.erase(DepthBuffers.size()-1);
|
DepthBuffers.erase(DepthBuffers.size()-1);
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include <Windowsx.h>
|
#include <Windowsx.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
class CIrrDeviceWin32 : public CIrrDeviceStub, video::IImagePresenter
|
class CIrrDeviceWin32 : public CIrrDeviceStub, video::IImagePresenter
|
||||||
|
@ -244,7 +243,7 @@ namespace irr
|
||||||
else
|
else
|
||||||
UseReferenceRect = false;
|
UseReferenceRect = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Used to notify the cursor that the window was resized. */
|
/** Used to notify the cursor that the window was resized. */
|
||||||
virtual void OnResize(const core::dimension2d<u32>& size)
|
virtual void OnResize(const core::dimension2d<u32>& size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -229,8 +229,6 @@ namespace irr
|
||||||
p.y = GET_Y_LPARAM(xy);
|
p.y = GET_Y_LPARAM(xy);
|
||||||
}
|
}
|
||||||
|
|
||||||
RECT rect;
|
|
||||||
|
|
||||||
if (UseReferenceRect)
|
if (UseReferenceRect)
|
||||||
{
|
{
|
||||||
CursorPos.X = p.x - ReferenceRect.UpperLeftCorner.X;
|
CursorPos.X = p.x - ReferenceRect.UpperLeftCorner.X;
|
||||||
|
@ -238,6 +236,7 @@ namespace irr
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
RECT rect;
|
||||||
if (GetWindowRect(HWnd, &rect))
|
if (GetWindowRect(HWnd, &rect))
|
||||||
{
|
{
|
||||||
CursorPos.X = p.x-rect.left-BorderX;
|
CursorPos.X = p.x-rect.left-BorderX;
|
||||||
|
|
|
@ -340,7 +340,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
if(numMaterials == 0)
|
if(numMaterials == 0)
|
||||||
{
|
{
|
||||||
// if there are no materials, add at least one buffer
|
// if there are no materials, add at least one buffer
|
||||||
AnimatedMesh->createBuffer();
|
AnimatedMesh->addMeshBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<numMaterials; ++i)
|
for (i=0; i<numMaterials; ++i)
|
||||||
|
@ -366,7 +366,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
scene::SSkinMeshBuffer *tmpBuffer = AnimatedMesh->createBuffer();
|
scene::SSkinMeshBuffer *tmpBuffer = AnimatedMesh->addMeshBuffer();
|
||||||
|
|
||||||
tmpBuffer->Material.MaterialType = video::EMT_SOLID;
|
tmpBuffer->Material.MaterialType = video::EMT_SOLID;
|
||||||
|
|
||||||
|
@ -451,7 +451,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ISkinnedMesh::SJoint *jnt = AnimatedMesh->createJoint();
|
ISkinnedMesh::SJoint *jnt = AnimatedMesh->addJoint();
|
||||||
|
|
||||||
jnt->Name = pJoint->Name;
|
jnt->Name = pJoint->Name;
|
||||||
#ifdef _IRR_DEBUG_MS3D_LOADER_
|
#ifdef _IRR_DEBUG_MS3D_LOADER_
|
||||||
|
@ -496,7 +496,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ISkinnedMesh::SRotationKey *k=AnimatedMesh->createRotationKey(jnt);
|
ISkinnedMesh::SRotationKey *k=AnimatedMesh->addRotationKey(jnt);
|
||||||
k->frame = kf->Time * framesPerSecond-1;
|
k->frame = kf->Time * framesPerSecond-1;
|
||||||
|
|
||||||
core::matrix4 tmpMatrix;
|
core::matrix4 tmpMatrix;
|
||||||
|
@ -532,7 +532,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ISkinnedMesh::SPositionKey *k=AnimatedMesh->createPositionKey(jnt);
|
ISkinnedMesh::SPositionKey *k=AnimatedMesh->addPositionKey(jnt);
|
||||||
k->frame = kf->Time * framesPerSecond-1;
|
k->frame = kf->Time * framesPerSecond-1;
|
||||||
|
|
||||||
k->position = core::vector3df
|
k->position = core::vector3df
|
||||||
|
@ -713,7 +713,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
const s32 boneid = vertices[vertidx].BoneID;
|
const s32 boneid = vertices[vertidx].BoneID;
|
||||||
if ((u32)boneid < AnimatedMesh->getAllJoints().size())
|
if ((u32)boneid < AnimatedMesh->getAllJoints().size())
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
w->strength = 1.0f;
|
w->strength = 1.0f;
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
@ -725,7 +725,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
s32 boneid = vertices[vertidx].BoneID;
|
s32 boneid = vertices[vertidx].BoneID;
|
||||||
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[0] != 0))
|
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[0] != 0))
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
sum -= (w->strength = vertexWeights[vertidx].weights[0]/100.f);
|
sum -= (w->strength = vertexWeights[vertidx].weights[0]/100.f);
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
@ -733,7 +733,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
boneid = vertexWeights[vertidx].boneIds[0];
|
boneid = vertexWeights[vertidx].boneIds[0];
|
||||||
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[1] != 0))
|
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[1] != 0))
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
sum -= (w->strength = vertexWeights[vertidx].weights[1]/100.f);
|
sum -= (w->strength = vertexWeights[vertidx].weights[1]/100.f);
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
@ -741,7 +741,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
boneid = vertexWeights[vertidx].boneIds[1];
|
boneid = vertexWeights[vertidx].boneIds[1];
|
||||||
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[2] != 0))
|
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (vertexWeights[vertidx].weights[2] != 0))
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
sum -= (w->strength = vertexWeights[vertidx].weights[2]/100.f);
|
sum -= (w->strength = vertexWeights[vertidx].weights[2]/100.f);
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
@ -749,7 +749,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
boneid = vertexWeights[vertidx].boneIds[2];
|
boneid = vertexWeights[vertidx].boneIds[2];
|
||||||
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (sum > 0.f))
|
if (((u32)boneid < AnimatedMesh->getAllJoints().size()) && (sum > 0.f))
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
w->strength = sum;
|
w->strength = sum;
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
@ -758,7 +758,7 @@ bool CMS3DMeshFileLoader::load(io::IReadFile* file)
|
||||||
boneid = vertices[vertidx].BoneID;
|
boneid = vertices[vertidx].BoneID;
|
||||||
if ((sum == 1.f) && ((u32)boneid < AnimatedMesh->getAllJoints().size()))
|
if ((sum == 1.f) && ((u32)boneid < AnimatedMesh->getAllJoints().size()))
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight *w=AnimatedMesh->createWeight(AnimatedMesh->getAllJoints()[boneid]);
|
ISkinnedMesh::SWeight *w=AnimatedMesh->addWeight(AnimatedMesh->getAllJoints()[boneid]);
|
||||||
w->buffer_id = matidx;
|
w->buffer_id = matidx;
|
||||||
w->strength = 1.f;
|
w->strength = 1.f;
|
||||||
w->vertex_id = index;
|
w->vertex_id = index;
|
||||||
|
|
|
@ -324,10 +324,11 @@ const c8* COBJMeshFileLoader::readTextures(const c8* bufPtr, const c8* const buf
|
||||||
u8 type=0; // map_Kd - diffuse color texture map
|
u8 type=0; // map_Kd - diffuse color texture map
|
||||||
// map_Ks - specular color texture map
|
// map_Ks - specular color texture map
|
||||||
// map_Ka - ambient color texture map
|
// map_Ka - ambient color texture map
|
||||||
|
// map_Ns - shininess texture map
|
||||||
if ((!strncmp(bufPtr,"map_bump",8)) || (!strncmp(bufPtr,"bump",4)))
|
if ((!strncmp(bufPtr,"map_bump",8)) || (!strncmp(bufPtr,"bump",4)))
|
||||||
type=1; // normal map
|
type=1; // normal map
|
||||||
else if (!strncmp(bufPtr,"map_d",5))
|
else if ((!strncmp(bufPtr,"map_d",5)) || (!strncmp(bufPtr,"map_opacity",11)))
|
||||||
type=2; // opactity map
|
type=2; // opacity map
|
||||||
else if (!strncmp(bufPtr,"map_refl",8))
|
else if (!strncmp(bufPtr,"map_refl",8))
|
||||||
type=3; // reflection map
|
type=3; // reflection map
|
||||||
// extract new material's name
|
// extract new material's name
|
||||||
|
@ -422,11 +423,14 @@ const c8* COBJMeshFileLoader::readTextures(const c8* bufPtr, const c8* const buf
|
||||||
texname.replace('\\', '/');
|
texname.replace('\\', '/');
|
||||||
|
|
||||||
video::ITexture * texture = 0;
|
video::ITexture * texture = 0;
|
||||||
if (FileSystem->existFile(texname))
|
if (texname.size())
|
||||||
texture = SceneManager->getVideoDriver()->getTexture(texname);
|
{
|
||||||
else
|
if (FileSystem->existFile(texname))
|
||||||
// try to read in the relative path, the .obj is loaded from
|
texture = SceneManager->getVideoDriver()->getTexture(texname);
|
||||||
texture = SceneManager->getVideoDriver()->getTexture( relPath + texname );
|
else
|
||||||
|
// try to read in the relative path, the .obj is loaded from
|
||||||
|
texture = SceneManager->getVideoDriver()->getTexture( relPath + texname );
|
||||||
|
}
|
||||||
if ( texture )
|
if ( texture )
|
||||||
{
|
{
|
||||||
if (type==0)
|
if (type==0)
|
||||||
|
|
|
@ -781,12 +781,14 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
|
||||||
glLoadMatrixf(glmat);
|
glLoadMatrixf(glmat);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ETS_TEXTURE_0:
|
case ETS_COUNT:
|
||||||
case ETS_TEXTURE_1:
|
return;
|
||||||
case ETS_TEXTURE_2:
|
default:
|
||||||
case ETS_TEXTURE_3:
|
|
||||||
{
|
{
|
||||||
const u32 i = state - ETS_TEXTURE_0;
|
const u32 i = state - ETS_TEXTURE_0;
|
||||||
|
if (i >= MATERIAL_MAX_TEXTURES)
|
||||||
|
break;
|
||||||
|
|
||||||
const bool isRTT = Material.getTexture(i) && Material.getTexture(i)->isRenderTarget();
|
const bool isRTT = Material.getTexture(i) && Material.getTexture(i)->isRenderTarget();
|
||||||
|
|
||||||
if (MultiTextureExtension)
|
if (MultiTextureExtension)
|
||||||
|
@ -807,8 +809,6 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2523,6 +2523,12 @@ const video::SColorf& CSceneManager::getAmbientLight() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Get a skinned mesh, which is not available as header-only code
|
||||||
|
ISkinnedMesh* CSceneManager::createSkinnedMesh()
|
||||||
|
{
|
||||||
|
return new CSkinnedMesh();
|
||||||
|
}
|
||||||
|
|
||||||
//! Returns a mesh writer implementation if available
|
//! Returns a mesh writer implementation if available
|
||||||
IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type)
|
IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type)
|
||||||
{
|
{
|
||||||
|
|
|
@ -473,6 +473,9 @@ namespace scene
|
||||||
//! Returns a mesh writer implementation if available
|
//! Returns a mesh writer implementation if available
|
||||||
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type);
|
virtual IMeshWriter* createMeshWriter(EMESH_WRITER_TYPE type);
|
||||||
|
|
||||||
|
//! Get a skinned mesh, which is not available as header-only code
|
||||||
|
virtual ISkinnedMesh* createSkinnedMesh();
|
||||||
|
|
||||||
//! Sets ambient color of the scene
|
//! Sets ambient color of the scene
|
||||||
virtual void setAmbientLight(const video::SColorf &ambientColor);
|
virtual void setAmbientLight(const video::SColorf &ambientColor);
|
||||||
|
|
||||||
|
|
|
@ -1124,7 +1124,7 @@ void CSkinnedMesh::updateBoundingBox(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
scene::SSkinMeshBuffer *CSkinnedMesh::createBuffer()
|
scene::SSkinMeshBuffer *CSkinnedMesh::addMeshBuffer()
|
||||||
{
|
{
|
||||||
scene::SSkinMeshBuffer *buffer=new scene::SSkinMeshBuffer();
|
scene::SSkinMeshBuffer *buffer=new scene::SSkinMeshBuffer();
|
||||||
LocalBuffers.push_back(buffer);
|
LocalBuffers.push_back(buffer);
|
||||||
|
@ -1132,7 +1132,7 @@ scene::SSkinMeshBuffer *CSkinnedMesh::createBuffer()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSkinnedMesh::SJoint *CSkinnedMesh::createJoint(SJoint *parent)
|
CSkinnedMesh::SJoint *CSkinnedMesh::addJoint(SJoint *parent)
|
||||||
{
|
{
|
||||||
SJoint *joint=new SJoint;
|
SJoint *joint=new SJoint;
|
||||||
|
|
||||||
|
@ -1151,7 +1151,7 @@ CSkinnedMesh::SJoint *CSkinnedMesh::createJoint(SJoint *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSkinnedMesh::SPositionKey *CSkinnedMesh::createPositionKey(SJoint *joint)
|
CSkinnedMesh::SPositionKey *CSkinnedMesh::addPositionKey(SJoint *joint)
|
||||||
{
|
{
|
||||||
if (!joint)
|
if (!joint)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1161,7 +1161,7 @@ CSkinnedMesh::SPositionKey *CSkinnedMesh::createPositionKey(SJoint *joint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSkinnedMesh::SScaleKey *CSkinnedMesh::createScaleKey(SJoint *joint)
|
CSkinnedMesh::SScaleKey *CSkinnedMesh::addScaleKey(SJoint *joint)
|
||||||
{
|
{
|
||||||
if (!joint)
|
if (!joint)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1171,7 +1171,7 @@ CSkinnedMesh::SScaleKey *CSkinnedMesh::createScaleKey(SJoint *joint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSkinnedMesh::SRotationKey *CSkinnedMesh::createRotationKey(SJoint *joint)
|
CSkinnedMesh::SRotationKey *CSkinnedMesh::addRotationKey(SJoint *joint)
|
||||||
{
|
{
|
||||||
if (!joint)
|
if (!joint)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1181,7 +1181,7 @@ CSkinnedMesh::SRotationKey *CSkinnedMesh::createRotationKey(SJoint *joint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSkinnedMesh::SWeight *CSkinnedMesh::createWeight(SJoint *joint)
|
CSkinnedMesh::SWeight *CSkinnedMesh::addWeight(SJoint *joint)
|
||||||
{
|
{
|
||||||
if (!joint)
|
if (!joint)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -134,15 +134,15 @@ namespace scene
|
||||||
//! loaders should call this after populating the mesh
|
//! loaders should call this after populating the mesh
|
||||||
virtual void finalize();
|
virtual void finalize();
|
||||||
|
|
||||||
virtual SSkinMeshBuffer *createBuffer();
|
virtual SSkinMeshBuffer *addMeshBuffer();
|
||||||
|
|
||||||
virtual SJoint *createJoint(SJoint *parent=0);
|
virtual SJoint *addJoint(SJoint *parent=0);
|
||||||
|
|
||||||
virtual SPositionKey *createPositionKey(SJoint *joint);
|
virtual SPositionKey *addPositionKey(SJoint *joint);
|
||||||
virtual SRotationKey *createRotationKey(SJoint *joint);
|
virtual SRotationKey *addRotationKey(SJoint *joint);
|
||||||
virtual SScaleKey *createScaleKey(SJoint *joint);
|
virtual SScaleKey *addScaleKey(SJoint *joint);
|
||||||
|
|
||||||
virtual SWeight *createWeight(SJoint *joint);
|
virtual SWeight *addWeight(SJoint *joint);
|
||||||
|
|
||||||
virtual void updateBoundingBox(void);
|
virtual void updateBoundingBox(void);
|
||||||
|
|
||||||
|
|
|
@ -261,11 +261,13 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D
|
||||||
if ( a->Pos.y > c->Pos.y ) swapVertexPointer(&a, &c);
|
if ( a->Pos.y > c->Pos.y ) swapVertexPointer(&a, &c);
|
||||||
if ( b->Pos.y > c->Pos.y ) swapVertexPointer(&b, &c);
|
if ( b->Pos.y > c->Pos.y ) swapVertexPointer(&b, &c);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
@ -274,11 +276,11 @@ void CTRGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4D
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -272,25 +272,26 @@ void CTRGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,cons
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -274,25 +274,26 @@ void CTRGouraudAlphaNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,c
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -2000,25 +2000,26 @@ void CTRTextureBlend::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -278,11 +278,13 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
@ -291,11 +293,11 @@ void CTRTextureDetailMap2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -290,25 +290,26 @@ void CTRTextureGouraud2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,co
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -298,21 +298,23 @@ void CTRTextureGouraudAdd2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -266,11 +266,13 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
@ -279,11 +281,11 @@ void CTRTextureGouraudAddNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -359,25 +359,26 @@ void CTRTextureGouraudAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -359,25 +359,26 @@ void CTRTextureGouraudAlphaNoZ::drawTriangle ( const s4DVertex *a,const s4DVerte
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -262,25 +262,26 @@ void CTRTextureGouraudNoZ2::drawTriangle ( const s4DVertex *a,const s4DVertex *b
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -305,25 +305,26 @@ void CTRTextureVertexAlpha2::drawTriangle ( const s4DVertex *a,const s4DVertex *
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -286,25 +286,26 @@ void CTRTextureLightMap2_Add::drawTriangle ( const s4DVertex *a,const s4DVertex
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -256,25 +256,26 @@ void CTRTextureLightMap2_M1::drawTriangle ( const s4DVertex *a,const s4DVertex *
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -256,25 +256,26 @@ void CTRTextureLightMap2_M2::drawTriangle ( const s4DVertex *a,const s4DVertex *
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -584,11 +584,13 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
@ -598,11 +600,11 @@ void CTRTextureLightMap2_M4::drawTriangle_Min ( const s4DVertex *a,const s4DVert
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
@ -956,25 +958,26 @@ void CTRTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex *
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_EQUAL_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -300,26 +300,26 @@ void CTRGTextureLightMap2_M4::drawTriangle ( const s4DVertex *a,const s4DVertex
|
||||||
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c);
|
||||||
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b);
|
||||||
|
|
||||||
|
const f32 ca = c->Pos.y - a->Pos.y;
|
||||||
|
const f32 ba = b->Pos.y - a->Pos.y;
|
||||||
|
const f32 cb = c->Pos.y - b->Pos.y;
|
||||||
// calculate delta y of the edges
|
// calculate delta y of the edges
|
||||||
scan.invDeltaY[0] = core::reciprocal ( c->Pos.y - a->Pos.y );
|
scan.invDeltaY[0] = (ca != 0.f)?core::reciprocal ( ca ):0.f;
|
||||||
scan.invDeltaY[1] = core::reciprocal ( b->Pos.y - a->Pos.y );
|
scan.invDeltaY[1] = (ba != 0.f)?core::reciprocal ( ba ):0.f;
|
||||||
scan.invDeltaY[2] = core::reciprocal ( c->Pos.y - b->Pos.y );
|
scan.invDeltaY[2] = (cb != 0.f)?core::reciprocal ( cb ):0.f;
|
||||||
|
|
||||||
|
|
||||||
if ( F32_LOWER_0 ( scan.invDeltaY[0] ) )
|
if ( F32_LOWER_0 ( scan.invDeltaY[0] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
// find if the major edge is left or right aligned
|
// find if the major edge is left or right aligned
|
||||||
f32 temp[4];
|
f32 temp[4];
|
||||||
|
|
||||||
temp[0] = a->Pos.x - c->Pos.x;
|
temp[0] = a->Pos.x - c->Pos.x;
|
||||||
temp[1] = a->Pos.y - c->Pos.y;
|
temp[1] = -ca;
|
||||||
temp[2] = b->Pos.x - a->Pos.x;
|
temp[2] = b->Pos.x - a->Pos.x;
|
||||||
temp[3] = b->Pos.y - a->Pos.y;
|
temp[3] = ba;
|
||||||
|
|
||||||
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > (f32) 0.0 ? 0 : 1;
|
scan.left = ( temp[0] * temp[3] - temp[1] * temp[2] ) > 0.f ? 0 : 1;
|
||||||
scan.right = 1 - scan.left;
|
scan.right = 1 - scan.left;
|
||||||
|
|
||||||
// calculate slopes for the major edge
|
// calculate slopes for the major edge
|
||||||
|
|
|
@ -132,7 +132,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
|
||||||
#endif
|
#endif
|
||||||
for (i=0; i<mesh->Materials.size(); ++i)
|
for (i=0; i<mesh->Materials.size(); ++i)
|
||||||
{
|
{
|
||||||
mesh->Buffers.push_back( AnimatedMesh->createBuffer() );
|
mesh->Buffers.push_back( AnimatedMesh->addMeshBuffer() );
|
||||||
mesh->Buffers.getLast()->Material = mesh->Materials[i];
|
mesh->Buffers.getLast()->Material = mesh->Materials[i];
|
||||||
|
|
||||||
if (!mesh->HasSkinning)
|
if (!mesh->HasSkinning)
|
||||||
|
@ -256,7 +256,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
|
||||||
{
|
{
|
||||||
for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k)
|
for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k)
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->createWeight(joint);
|
ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->addWeight(joint);
|
||||||
WeightClone->strength = weight.strength;
|
WeightClone->strength = weight.strength;
|
||||||
WeightClone->vertex_id = verticesLinkIndex[id][k];
|
WeightClone->vertex_id = verticesLinkIndex[id][k];
|
||||||
WeightClone->buffer_id = verticesLinkBuffer[id][k];
|
WeightClone->buffer_id = verticesLinkBuffer[id][k];
|
||||||
|
@ -491,11 +491,11 @@ bool CXMeshFileLoader::parseDataObject()
|
||||||
if (objectName == "Mesh")
|
if (objectName == "Mesh")
|
||||||
{
|
{
|
||||||
// some meshes have no frames at all
|
// some meshes have no frames at all
|
||||||
//CurFrame = AnimatedMesh->createJoint(0);
|
//CurFrame = AnimatedMesh->addJoint(0);
|
||||||
|
|
||||||
SXMesh *mesh=new SXMesh;
|
SXMesh *mesh=new SXMesh;
|
||||||
|
|
||||||
//mesh->Buffer=AnimatedMesh->createBuffer();
|
//mesh->Buffer=AnimatedMesh->addMeshBuffer();
|
||||||
Meshes.push_back(mesh);
|
Meshes.push_back(mesh);
|
||||||
|
|
||||||
return parseDataObjectMesh(*mesh);
|
return parseDataObjectMesh(*mesh);
|
||||||
|
@ -605,7 +605,7 @@ bool CXMeshFileLoader::parseDataObjectFrame(CSkinnedMesh::SJoint *Parent)
|
||||||
#ifdef _XREADER_DEBUG
|
#ifdef _XREADER_DEBUG
|
||||||
os::Printer::log("creating joint ", name.c_str());
|
os::Printer::log("creating joint ", name.c_str());
|
||||||
#endif
|
#endif
|
||||||
joint=AnimatedMesh->createJoint(Parent);
|
joint=AnimatedMesh->addJoint(Parent);
|
||||||
joint->Name=name;
|
joint->Name=name;
|
||||||
JointID=AnimatedMesh->getAllJoints().size()-1;
|
JointID=AnimatedMesh->getAllJoints().size()-1;
|
||||||
}
|
}
|
||||||
|
@ -1110,7 +1110,7 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh)
|
||||||
os::Printer::log("creating joint for skinning ", TransformNodeName.c_str());
|
os::Printer::log("creating joint for skinning ", TransformNodeName.c_str());
|
||||||
#endif
|
#endif
|
||||||
n = AnimatedMesh->getAllJoints().size();
|
n = AnimatedMesh->getAllJoints().size();
|
||||||
joint=AnimatedMesh->createJoint(0);
|
joint=AnimatedMesh->addJoint(0);
|
||||||
joint->Name=TransformNodeName;
|
joint->Name=TransformNodeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1131,7 +1131,7 @@ bool CXMeshFileLoader::parseDataObjectSkinWeights(SXMesh &mesh)
|
||||||
mesh.WeightJoint.push_back(n);
|
mesh.WeightJoint.push_back(n);
|
||||||
mesh.WeightNum.push_back(joint->Weights.size());
|
mesh.WeightNum.push_back(joint->Weights.size());
|
||||||
|
|
||||||
CSkinnedMesh::SWeight *weight=AnimatedMesh->createWeight(joint);
|
CSkinnedMesh::SWeight *weight=AnimatedMesh->addWeight(joint);
|
||||||
|
|
||||||
weight->buffer_id=0;
|
weight->buffer_id=0;
|
||||||
weight->vertex_id=readInt();
|
weight->vertex_id=readInt();
|
||||||
|
@ -1705,7 +1705,7 @@ bool CXMeshFileLoader::parseDataObjectAnimation()
|
||||||
#ifdef _XREADER_DEBUG
|
#ifdef _XREADER_DEBUG
|
||||||
os::Printer::log("creating joint for animation ", FrameName.c_str());
|
os::Printer::log("creating joint for animation ", FrameName.c_str());
|
||||||
#endif
|
#endif
|
||||||
joint=AnimatedMesh->createJoint(0);
|
joint=AnimatedMesh->addJoint(0);
|
||||||
joint->Name=FrameName;
|
joint->Name=FrameName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1797,7 +1797,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
||||||
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
os::Printer::log("Line", core::stringc(Line).c_str(), ELL_WARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
ISkinnedMesh::SRotationKey *key=AnimatedMesh->createRotationKey(joint);
|
ISkinnedMesh::SRotationKey *key=AnimatedMesh->addRotationKey(joint);
|
||||||
key->frame=time;
|
key->frame=time;
|
||||||
key->rotation.set(X,Y,Z,W);
|
key->rotation.set(X,Y,Z,W);
|
||||||
}
|
}
|
||||||
|
@ -1826,13 +1826,13 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
||||||
|
|
||||||
if (keyType==2)
|
if (keyType==2)
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SPositionKey *key=AnimatedMesh->createPositionKey(joint);
|
ISkinnedMesh::SPositionKey *key=AnimatedMesh->addPositionKey(joint);
|
||||||
key->frame=time;
|
key->frame=time;
|
||||||
key->position=vector;
|
key->position=vector;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ISkinnedMesh::SScaleKey *key=AnimatedMesh->createScaleKey(joint);
|
ISkinnedMesh::SScaleKey *key=AnimatedMesh->addScaleKey(joint);
|
||||||
key->frame=time;
|
key->frame=time;
|
||||||
key->scale=vector;
|
key->scale=vector;
|
||||||
}
|
}
|
||||||
|
@ -1865,12 +1865,12 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
||||||
|
|
||||||
//core::vector3df rotation = mat.getRotationDegrees();
|
//core::vector3df rotation = mat.getRotationDegrees();
|
||||||
|
|
||||||
ISkinnedMesh::SRotationKey *keyR=AnimatedMesh->createRotationKey(joint);
|
ISkinnedMesh::SRotationKey *keyR=AnimatedMesh->addRotationKey(joint);
|
||||||
keyR->frame=time;
|
keyR->frame=time;
|
||||||
keyR->rotation= core::quaternion(mat);
|
keyR->rotation= core::quaternion(mat);
|
||||||
|
|
||||||
|
|
||||||
ISkinnedMesh::SPositionKey *keyP=AnimatedMesh->createPositionKey(joint);
|
ISkinnedMesh::SPositionKey *keyP=AnimatedMesh->addPositionKey(joint);
|
||||||
keyP->frame=time;
|
keyP->frame=time;
|
||||||
keyP->position=mat.getTranslation();
|
keyP->position=mat.getTranslation();
|
||||||
|
|
||||||
|
@ -1883,7 +1883,7 @@ bool CXMeshFileLoader::parseDataObjectAnimationKey(ISkinnedMesh::SJoint *joint)
|
||||||
scale.Y=1;
|
scale.Y=1;
|
||||||
if (scale.Z==0)
|
if (scale.Z==0)
|
||||||
scale.Z=1;
|
scale.Z=1;
|
||||||
ISkinnedMesh::SScaleKey *keyS=AnimatedMesh->createScaleKey(joint);
|
ISkinnedMesh::SScaleKey *keyS=AnimatedMesh->addScaleKey(joint);
|
||||||
keyS->frame=time;
|
keyS->frame=time;
|
||||||
keyS->scale=scale;
|
keyS->scale=scale;
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -52,7 +52,7 @@ LINKOBJ = $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
|
||||||
#Compiler flags
|
#Compiler flags
|
||||||
CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng
|
CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng
|
||||||
CPPFLAGS = $(CXXINCS) -DIRRLICHT_EXPORTS=1
|
CPPFLAGS = $(CXXINCS) -DIRRLICHT_EXPORTS=1
|
||||||
CXXFLAGS = -Wall -pipe -fno-exceptions -fno-rtti
|
CXXFLAGS = -Wall -pipe -fno-exceptions -fno-rtti -fstrict-aliasing
|
||||||
ifndef NDEBUG
|
ifndef NDEBUG
|
||||||
CXXFLAGS += -g -D_DEBUG
|
CXXFLAGS += -g -D_DEBUG
|
||||||
else
|
else
|
||||||
|
|
|
@ -120,12 +120,7 @@ REALINLINE void memcpy32_small ( void * dest, const void *source, u32 bytesize )
|
||||||
// integer log2 of a float ieee 754. TODO: non ieee floating point
|
// integer log2 of a float ieee 754. TODO: non ieee floating point
|
||||||
static inline s32 s32_log2_f32( f32 f)
|
static inline s32 s32_log2_f32( f32 f)
|
||||||
{
|
{
|
||||||
#ifdef IRRLICHT_FAST_MATH
|
|
||||||
u32 x = IR ( f );
|
u32 x = IR ( f );
|
||||||
#else
|
|
||||||
u32 x = core::IR ( f );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ((x & 0x7F800000) >> 23) - 127;
|
return ((x & 0x7F800000) >> 23) - 127;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ bool terrainSceneNode(void)
|
||||||
driver->endScene();
|
driver->endScene();
|
||||||
|
|
||||||
// Note that this has to be a slightly fuzzier than usual compare to satisfy multiple OpenGL environments
|
// Note that this has to be a slightly fuzzier than usual compare to satisfy multiple OpenGL environments
|
||||||
bool result = takeScreenshotAndCompareAgainstReference(driver, "-terrainSceneNode-1.png", 98.3f);
|
bool result = takeScreenshotAndCompareAgainstReference(driver, "-terrainSceneNode-1.png", 98.24f);
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
logTestString("Small camera up rotation caused bad recalc.\n");
|
logTestString("Small camera up rotation caused bad recalc.\n");
|
||||||
|
@ -60,7 +60,7 @@ bool terrainSceneNode(void)
|
||||||
smgr->drawAll();
|
smgr->drawAll();
|
||||||
driver->endScene();
|
driver->endScene();
|
||||||
|
|
||||||
result &= takeScreenshotAndCompareAgainstReference(driver, "-terrainSceneNode-2.png", 98.9f);
|
result &= takeScreenshotAndCompareAgainstReference(driver, "-terrainSceneNode-2.png", 98.84f);
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
logTestString("Large camera up rotation caused bad recalc.\n");
|
logTestString("Large camera up rotation caused bad recalc.\n");
|
||||||
|
|
|
@ -48,7 +48,7 @@ bool testGeometryCreator(void)
|
||||||
{
|
{
|
||||||
smgr->drawAll();
|
smgr->drawAll();
|
||||||
driver->endScene();
|
driver->endScene();
|
||||||
result = takeScreenshotAndCompareAgainstReference(driver, "-testGeometryCreator.png", 100);
|
result = takeScreenshotAndCompareAgainstReference(driver, "-testGeometryCreator.png", 99.999f);
|
||||||
}
|
}
|
||||||
|
|
||||||
device->drop();
|
device->drop();
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
Test suite pass at GMT Wed Aug 19 23:13:32 2009
|
Test suite pass at GMT Wed Sep 9 14:11:32 2009
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue