Add normals recalculation in case it is missing in the ply file
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3911 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
afa978f2a5
commit
fa754dd47b
|
@ -23,8 +23,8 @@ namespace scene
|
|||
#define PLY_INPUT_BUFFER_SIZE 51200 // file is loaded in 50k chunks
|
||||
|
||||
// constructor
|
||||
CPLYMeshFileLoader::CPLYMeshFileLoader()
|
||||
: File(0), Buffer(0)
|
||||
CPLYMeshFileLoader::CPLYMeshFileLoader(scene::ISceneManager* smgr)
|
||||
: SceneManager(smgr), File(0), Buffer(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -233,6 +233,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
|
|||
mb->getIndexBuffer().reallocate(vertCount);
|
||||
mb->setHardwareMappingHint(EHM_STATIC);
|
||||
|
||||
bool hasNormals=true;
|
||||
// loop through each of the elements
|
||||
for (u32 i=0; i<ElementList.size(); ++i)
|
||||
{
|
||||
|
@ -241,7 +242,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
|
|||
{
|
||||
// loop through vertex properties
|
||||
for (u32 j=0; j < ElementList[i]->Count; ++j)
|
||||
readVertex(*ElementList[i], mb);
|
||||
hasNormals &= readVertex(*ElementList[i], mb);
|
||||
}
|
||||
else if (ElementList[i]->Name == "face")
|
||||
{
|
||||
|
@ -257,6 +258,8 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
|
|||
}
|
||||
}
|
||||
mb->recalculateBoundingBox();
|
||||
if (!hasNormals)
|
||||
SceneManager->getMeshManipulator()->recalculateNormals(mb);
|
||||
SMesh* m = new SMesh();
|
||||
m->addMeshBuffer(mb);
|
||||
m->recalculateBoundingBox();
|
||||
|
@ -292,6 +295,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
|
|||
vert.Normal.Y = 1.0f;
|
||||
vert.Normal.Z = 0.0f;
|
||||
|
||||
bool result=false;
|
||||
for (u32 i=0; i < Element.Properties.size(); ++i)
|
||||
{
|
||||
E_PLY_PROPERTY_TYPE t = Element.Properties[i].Type;
|
||||
|
@ -303,11 +307,20 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
|
|||
else if (Element.Properties[i].Name == "z")
|
||||
vert.Pos.Y = getFloat(t);
|
||||
else if (Element.Properties[i].Name == "nx")
|
||||
{
|
||||
vert.Normal.X = getFloat(t);
|
||||
result=true;
|
||||
}
|
||||
else if (Element.Properties[i].Name == "ny")
|
||||
{
|
||||
vert.Normal.Z = getFloat(t);
|
||||
result=true;
|
||||
}
|
||||
else if (Element.Properties[i].Name == "nz")
|
||||
{
|
||||
vert.Normal.Y = getFloat(t);
|
||||
result=true;
|
||||
}
|
||||
else if (Element.Properties[i].Name == "u")
|
||||
vert.TCoords.X = getFloat(t);
|
||||
else if (Element.Properties[i].Name == "v")
|
||||
|
@ -338,7 +351,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
|
|||
|
||||
mb->getVertexBuffer().push_back(vert);
|
||||
|
||||
return true;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool CPLYMeshFileLoader::readFace(const SPLYElement &Element, scene::CDynamicMeshBuffer* mb)
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#define __C_PLY_MESH_FILE_LOADER_H_INCLUDED__
|
||||
|
||||
#include "IMeshLoader.h"
|
||||
#include "ISceneManager.h"
|
||||
#include "CDynamicMeshBuffer.h"
|
||||
|
||||
namespace irr
|
||||
|
@ -30,7 +31,7 @@ class CPLYMeshFileLoader : public IMeshLoader
|
|||
public:
|
||||
|
||||
//! Constructor
|
||||
CPLYMeshFileLoader();
|
||||
CPLYMeshFileLoader(scene::ISceneManager* smgr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CPLYMeshFileLoader();
|
||||
|
@ -132,6 +133,7 @@ private:
|
|||
|
||||
core::array<SPLYElement*> ElementList;
|
||||
|
||||
scene::ISceneManager* SceneManager;
|
||||
io::IReadFile *File;
|
||||
c8 *Buffer;
|
||||
bool IsBinaryFile, IsWrongEndian, EndOfFile;
|
||||
|
|
|
@ -237,7 +237,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
|
|||
MeshLoaderList.push_back(new CSTLMeshFileLoader());
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_PLY_LOADER_
|
||||
MeshLoaderList.push_back(new CPLYMeshFileLoader());
|
||||
MeshLoaderList.push_back(new CPLYMeshFileLoader(this));
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_SMF_LOADER_
|
||||
MeshLoaderList.push_back(new CSMFMeshFileLoader(Driver));
|
||||
|
|
Loading…
Reference in New Issue