Allow tangent mesh to be converted

This commit is contained in:
Benau 2016-12-07 08:07:01 +08:00
parent 57d9e83ed4
commit a3905a1e19
4 changed files with 53 additions and 22 deletions

View File

@ -236,17 +236,48 @@ struct SSkinMeshBuffer : public IMeshBuffer
{ {
for(u32 n=0;n<Vertices_Standard.size();++n) for(u32 n=0;n<Vertices_Standard.size();++n)
{ {
video::S3DVertexSkinnedMesh Vertex = {}; video::S3DVertexSkinnedMesh Vertex;
Vertex.Color=Vertices_Standard[n].Color; Vertex.Color=Vertices_Standard[n].Color;
Vertex.Pos=Vertices_Standard[n].Pos; Vertex.Pos=Vertices_Standard[n].Pos;
Vertex.Normal=Vertices_Standard[n].Normal; Vertex.Normal=Vertices_Standard[n].Normal;
Vertex.TCoords=Vertices_Standard[n].TCoords; Vertex.TCoords=Vertices_Standard[n].TCoords;
Vertex.Tangent=core::vector3df(0.0f, 0.0f, 0.0f);
Vertex.Binormal=core::vector3df(0.0f, 0.0f, 0.0f);
Vertex.m_joint_idx1 = 0;
Vertex.m_joint_idx2 = 0;
Vertex.m_joint_idx3 = 0;
Vertex.m_joint_idx4 = 0;
Vertex.m_weight1 = 0;
Vertex.m_weight2 = 0;
Vertex.m_weight3 = 0;
Vertex.m_weight4 = 0;
Vertices_SkinnedMesh.push_back(Vertex);
}
}
if (VertexType==video::EVT_TANGENTS)
{
for(u32 n=0;n<Vertices_Tangents.size();++n)
{
video::S3DVertexSkinnedMesh Vertex;
Vertex.Color=Vertices_Tangents[n].Color;
Vertex.Pos=Vertices_Tangents[n].Pos;
Vertex.Normal=Vertices_Tangents[n].Normal;
Vertex.TCoords=Vertices_Tangents[n].TCoords;
Vertex.Tangent=Vertices_Tangents[n].Tangent;
Vertex.Binormal=Vertices_Tangents[n].Binormal;
Vertex.m_joint_idx1 = 0;
Vertex.m_joint_idx2 = 0;
Vertex.m_joint_idx3 = 0;
Vertex.m_joint_idx4 = 0;
Vertex.m_weight1 = 0;
Vertex.m_weight2 = 0;
Vertex.m_weight3 = 0;
Vertex.m_weight4 = 0;
Vertices_SkinnedMesh.push_back(Vertex); Vertices_SkinnedMesh.push_back(Vertex);
} }
} }
} }
//! Convert to tangents vertex type //! Convert to tangents vertex type
virtual void convertToTangents() virtual void convertToTangents()
{ {

View File

@ -18,11 +18,11 @@ namespace scene
//! constructor //! constructor
CSkinnedMesh::CSkinnedMesh() CSkinnedMesh::CSkinnedMesh()
: m_joint_total_size(0), SkinningBuffers(0), AnimationFrames(0.f), FramesPerSecond(25.f), : SkinningBuffers(0), AnimationFrames(0.f), FramesPerSecond(25.f),
LastAnimatedFrame(-1), SkinnedLastFrame(false), LastAnimatedFrame(-1), SkinnedLastFrame(false),
InterpolationMode(EIM_LINEAR), InterpolationMode(EIM_LINEAR),
HasAnimation(false), PreparedForSkinning(false), HasAnimation(false), PreparedForSkinning(false),
AnimateNormals(true), HardwareSkinning(false) AnimateNormals(true), HardwareSkinning(false), m_joint_total_size(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CSkinnedMesh"); setDebugName("CSkinnedMesh");

View File

@ -14,18 +14,18 @@
#include "matrix4.h" #include "matrix4.h"
#include "quaternion.h" #include "quaternion.h"
class JointInfluence class JointInfluence
{ {
public: public:
int joint_idx; int joint_idx;
float weight; float weight;
bool operator < (const JointInfluence& other) const bool operator < (const JointInfluence& other) const
{ {
return weight < other.weight; return weight < other.weight;
} }
}; };
typedef irr::core::array<irr::core::array typedef irr::core::array<irr::core::array
<irr::core::array<JointInfluence> > > WeightInfluence; <irr::core::array<JointInfluence> > > WeightInfluence;
namespace irr namespace irr
@ -173,17 +173,17 @@ namespace scene
IAnimatedMeshSceneNode* node, IAnimatedMeshSceneNode* node,
ISceneManager* smgr); ISceneManager* smgr);
void convertForSkinning(); void convertForSkinning();
void computeWeightInfluence(SJoint *joint, size_t &index, WeightInfluence& wi); void computeWeightInfluence(SJoint *joint, size_t &index, WeightInfluence& wi);
const void* getJointPointer() const { return m_joint_matrixes.const_pointer(); } const void* getJointPointer() const { return m_joint_matrixes.const_pointer(); }
u32 getTotalJointSize() const u32 getTotalJointSize() const
{ {
_IRR_DEBUG_BREAK_IF(m_joint_total_size == 0); _IRR_DEBUG_BREAK_IF(m_joint_total_size == 0);
return m_joint_total_size; return m_joint_total_size;
} }
private: private:
void checkForAnimation(); void checkForAnimation();
@ -230,7 +230,7 @@ private:
bool HasAnimation; bool HasAnimation;
bool PreparedForSkinning; bool PreparedForSkinning;
bool AnimateNormals; bool AnimateNormals;
bool HardwareSkinning; bool HardwareSkinning;
core::array<core::matrix4> m_joint_matrixes; core::array<core::matrix4> m_joint_matrixes;
u32 m_joint_total_size; u32 m_joint_total_size;
}; };

View File

@ -476,7 +476,7 @@ scene::IMesh* MeshTools::createMeshWithTangents(scene::IMesh* mesh,
void MeshTools::createSkinnedMeshWithTangents(scene::ISkinnedMesh* mesh, void MeshTools::createSkinnedMeshWithTangents(scene::ISkinnedMesh* mesh,
bool(*predicate)(scene::IMeshBuffer*)) bool(*predicate)(scene::IMeshBuffer*))
{return; {
core::array<scene::SSkinMeshBuffer*>& all_mb = mesh->getMeshBuffers(); core::array<scene::SSkinMeshBuffer*>& all_mb = mesh->getMeshBuffers();
const int all_mb_size = all_mb.size(); const int all_mb_size = all_mb.size();
for (int i = 0; i < all_mb_size; i++) for (int i = 0; i < all_mb_size; i++)