Commit fa754dd4 authored by hybrid's avatar hybrid

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-e03cc46cb475
parent afa978f2
...@@ -23,8 +23,8 @@ namespace scene ...@@ -23,8 +23,8 @@ namespace scene
#define PLY_INPUT_BUFFER_SIZE 51200 // file is loaded in 50k chunks #define PLY_INPUT_BUFFER_SIZE 51200 // file is loaded in 50k chunks
// constructor // constructor
CPLYMeshFileLoader::CPLYMeshFileLoader() CPLYMeshFileLoader::CPLYMeshFileLoader(scene::ISceneManager* smgr)
: File(0), Buffer(0) : SceneManager(smgr), File(0), Buffer(0)
{ {
} }
...@@ -233,6 +233,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file) ...@@ -233,6 +233,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
mb->getIndexBuffer().reallocate(vertCount); mb->getIndexBuffer().reallocate(vertCount);
mb->setHardwareMappingHint(EHM_STATIC); mb->setHardwareMappingHint(EHM_STATIC);
bool hasNormals=true;
// loop through each of the elements // loop through each of the elements
for (u32 i=0; i<ElementList.size(); ++i) for (u32 i=0; i<ElementList.size(); ++i)
{ {
...@@ -241,7 +242,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file) ...@@ -241,7 +242,7 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
{ {
// loop through vertex properties // loop through vertex properties
for (u32 j=0; j < ElementList[i]->Count; ++j) for (u32 j=0; j < ElementList[i]->Count; ++j)
readVertex(*ElementList[i], mb); hasNormals &= readVertex(*ElementList[i], mb);
} }
else if (ElementList[i]->Name == "face") else if (ElementList[i]->Name == "face")
{ {
...@@ -257,6 +258,8 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file) ...@@ -257,6 +258,8 @@ IAnimatedMesh* CPLYMeshFileLoader::createMesh(io::IReadFile* file)
} }
} }
mb->recalculateBoundingBox(); mb->recalculateBoundingBox();
if (!hasNormals)
SceneManager->getMeshManipulator()->recalculateNormals(mb);
SMesh* m = new SMesh(); SMesh* m = new SMesh();
m->addMeshBuffer(mb); m->addMeshBuffer(mb);
m->recalculateBoundingBox(); m->recalculateBoundingBox();
...@@ -292,6 +295,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM ...@@ -292,6 +295,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
vert.Normal.Y = 1.0f; vert.Normal.Y = 1.0f;
vert.Normal.Z = 0.0f; vert.Normal.Z = 0.0f;
bool result=false;
for (u32 i=0; i < Element.Properties.size(); ++i) for (u32 i=0; i < Element.Properties.size(); ++i)
{ {
E_PLY_PROPERTY_TYPE t = Element.Properties[i].Type; E_PLY_PROPERTY_TYPE t = Element.Properties[i].Type;
...@@ -303,11 +307,20 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM ...@@ -303,11 +307,20 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
else if (Element.Properties[i].Name == "z") else if (Element.Properties[i].Name == "z")
vert.Pos.Y = getFloat(t); vert.Pos.Y = getFloat(t);
else if (Element.Properties[i].Name == "nx") else if (Element.Properties[i].Name == "nx")
{
vert.Normal.X = getFloat(t); vert.Normal.X = getFloat(t);
result=true;
}
else if (Element.Properties[i].Name == "ny") else if (Element.Properties[i].Name == "ny")
{
vert.Normal.Z = getFloat(t); vert.Normal.Z = getFloat(t);
result=true;
}
else if (Element.Properties[i].Name == "nz") else if (Element.Properties[i].Name == "nz")
{
vert.Normal.Y = getFloat(t); vert.Normal.Y = getFloat(t);
result=true;
}
else if (Element.Properties[i].Name == "u") else if (Element.Properties[i].Name == "u")
vert.TCoords.X = getFloat(t); vert.TCoords.X = getFloat(t);
else if (Element.Properties[i].Name == "v") else if (Element.Properties[i].Name == "v")
...@@ -338,7 +351,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM ...@@ -338,7 +351,7 @@ bool CPLYMeshFileLoader::readVertex(const SPLYElement &Element, scene::CDynamicM
mb->getVertexBuffer().push_back(vert); mb->getVertexBuffer().push_back(vert);
return true; return result;
} }
bool CPLYMeshFileLoader::readFace(const SPLYElement &Element, scene::CDynamicMeshBuffer* mb) bool CPLYMeshFileLoader::readFace(const SPLYElement &Element, scene::CDynamicMeshBuffer* mb)
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define __C_PLY_MESH_FILE_LOADER_H_INCLUDED__ #define __C_PLY_MESH_FILE_LOADER_H_INCLUDED__
#include "IMeshLoader.h" #include "IMeshLoader.h"
#include "ISceneManager.h"
#include "CDynamicMeshBuffer.h" #include "CDynamicMeshBuffer.h"
namespace irr namespace irr
...@@ -30,7 +31,7 @@ class CPLYMeshFileLoader : public IMeshLoader ...@@ -30,7 +31,7 @@ class CPLYMeshFileLoader : public IMeshLoader
public: public:
//! Constructor //! Constructor
CPLYMeshFileLoader(); CPLYMeshFileLoader(scene::ISceneManager* smgr);
//! Destructor //! Destructor
virtual ~CPLYMeshFileLoader(); virtual ~CPLYMeshFileLoader();
...@@ -132,6 +133,7 @@ private: ...@@ -132,6 +133,7 @@ private:
core::array<SPLYElement*> ElementList; core::array<SPLYElement*> ElementList;
scene::ISceneManager* SceneManager;
io::IReadFile *File; io::IReadFile *File;
c8 *Buffer; c8 *Buffer;
bool IsBinaryFile, IsWrongEndian, EndOfFile; bool IsBinaryFile, IsWrongEndian, EndOfFile;
......
...@@ -237,7 +237,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, ...@@ -237,7 +237,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
MeshLoaderList.push_back(new CSTLMeshFileLoader()); MeshLoaderList.push_back(new CSTLMeshFileLoader());
#endif #endif
#ifdef _IRR_COMPILE_WITH_PLY_LOADER_ #ifdef _IRR_COMPILE_WITH_PLY_LOADER_
MeshLoaderList.push_back(new CPLYMeshFileLoader()); MeshLoaderList.push_back(new CPLYMeshFileLoader(this));
#endif #endif
#ifdef _IRR_COMPILE_WITH_SMF_LOADER_ #ifdef _IRR_COMPILE_WITH_SMF_LOADER_
MeshLoaderList.push_back(new CSMFMeshFileLoader(Driver)); MeshLoaderList.push_back(new CSMFMeshFileLoader(Driver));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment