Commit a3a41d80 authored by hybrid's avatar hybrid

Major update to LWO loader to support more material properties and work with...

Major update to LWO loader to support more material properties and work with more meshes. Changed some meshloader constructors to take scenemanager instead of other parameters. Fixed obj loader texture loading with mixed file separators.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1215 dfc29bdd-3216-0410-991c-e03cc46cb475
parent b5ac2dfa
......@@ -14,14 +14,12 @@ namespace scene
{
//! Constructor
CBSPMeshFileLoader::CBSPMeshFileLoader(io::IFileSystem* fs,video::IVideoDriver* driver, scene::ISceneManager* smgr)
: FileSystem(fs), Driver(driver), SceneManager(smgr)
CBSPMeshFileLoader::CBSPMeshFileLoader(scene::ISceneManager* smgr,
io::IFileSystem* fs)
: FileSystem(fs), SceneManager(smgr)
{
if (FileSystem)
FileSystem->grab();
if (Driver)
Driver->grab();
}
......@@ -30,9 +28,6 @@ CBSPMeshFileLoader::~CBSPMeshFileLoader()
{
if (FileSystem)
FileSystem->drop();
if (Driver)
Driver->drop();
}
......@@ -53,7 +48,7 @@ IAnimatedMesh* CBSPMeshFileLoader::createMesh(io::IReadFile* file)
// load quake 3 bsp
if (strstr(file->getFileName(), ".bsp"))
{
CQ3LevelMesh* q = new CQ3LevelMesh(FileSystem, Driver, SceneManager);
CQ3LevelMesh* q = new CQ3LevelMesh(FileSystem, SceneManager);
q->getShader ( "scripts/models.shader", 1 );
q->getShader ( "scripts/liquid.shader", 1 );
......@@ -68,7 +63,7 @@ IAnimatedMesh* CBSPMeshFileLoader::createMesh(io::IReadFile* file)
// load quake 3 shader container
if (strstr(file->getFileName(), ".shader"))
{
CQ3LevelMesh* q = new CQ3LevelMesh(FileSystem, Driver, SceneManager);
CQ3LevelMesh* q = new CQ3LevelMesh(FileSystem, SceneManager);
q->getShader ( file->getFileName(), 1 );
return q;
}
......
......@@ -21,7 +21,7 @@ class CBSPMeshFileLoader : public IMeshLoader
public:
//! Constructor
CBSPMeshFileLoader(io::IFileSystem* fs, video::IVideoDriver* driver, scene::ISceneManager* smgr);
CBSPMeshFileLoader(scene::ISceneManager* smgr, io::IFileSystem* fs);
//! destructor
virtual ~CBSPMeshFileLoader();
......@@ -39,7 +39,6 @@ public:
private:
io::IFileSystem* FileSystem;
video::IVideoDriver* Driver;
scene::ISceneManager* SceneManager;
};
......
......@@ -266,9 +266,9 @@ namespace scene
//! Constructor
CColladaFileLoader::CColladaFileLoader(video::IVideoDriver* driver,
scene::ISceneManager* smgr, io::IFileSystem* fs)
: Driver(driver), SceneManager(smgr), FileSystem(fs), DummyMesh(0),
CColladaFileLoader::CColladaFileLoader(scene::ISceneManager* smgr,
io::IFileSystem* fs)
: SceneManager(smgr), FileSystem(fs), DummyMesh(0),
FirstLoadedMesh(0), LoadedMeshCount(0), CreateInstances(false)
{
......@@ -2485,6 +2485,7 @@ video::ITexture* CColladaFileLoader::getTextureFromImage(core::stringc uri)
#ifdef COLLADA_READER_DEBUG
os::Printer::log("COLLADA searching texture", uri.c_str());
#endif
video::IVideoDriver* driver = SceneManager->getVideoDriver();
for (;;)
{
uriToId(uri);
......@@ -2493,7 +2494,7 @@ video::ITexture* CColladaFileLoader::getTextureFromImage(core::stringc uri)
if (uri == Images[i].Id)
{
if (Images[i].Source.size() && Images[i].SourceIsFilename)
return Driver->getTexture(Images[i].Source.c_str());
return driver->getTexture(Images[i].Source.c_str());
else
if (Images[i].Source.size())
{
......@@ -2508,8 +2509,8 @@ video::ITexture* CColladaFileLoader::getTextureFromImage(core::stringc uri)
++ptrdest;
ptrsrc += 4;
}
video::IImage* img = Driver->createImageFromData(video::ECF_A8R8G8B8, Images[i].Dimension, data, true, true);
video::ITexture* tex = Driver->addTexture((CurrentlyLoadingMesh+"#"+Images[i].Id).c_str(), img);
video::IImage* img = driver->createImageFromData(video::ECF_A8R8G8B8, Images[i].Dimension, data, true, true);
video::ITexture* tex = driver->addTexture((CurrentlyLoadingMesh+"#"+Images[i].Id).c_str(), img);
img->drop();
return tex;
}
......
......@@ -177,8 +177,7 @@ class CColladaFileLoader : public IMeshLoader
public:
//! Constructor
CColladaFileLoader(video::IVideoDriver* driver,
scene::ISceneManager* smgr, io::IFileSystem* fs);
CColladaFileLoader(scene::ISceneManager* smgr, io::IFileSystem* fs);
//! destructor
virtual ~CColladaFileLoader();
......@@ -331,7 +330,6 @@ private:
//! read a parameter and value
void readParameter(io::IXMLReaderUTF8* reader);
video::IVideoDriver* Driver;
scene::ISceneManager* SceneManager;
io::IFileSystem* FileSystem;
......
......@@ -31,27 +31,15 @@ namespace scene
{
/** Constructor*/
CDMFLoader::CDMFLoader(video::IVideoDriver* driver, ISceneManager* smgr)
: Driver(driver) , SceneMgr(smgr)
CDMFLoader::CDMFLoader(ISceneManager* smgr)
: SceneMgr(smgr)
{
#ifdef _DEBUG
IReferenceCounted::setDebugName("CDMFLoader");
#endif
if (Driver)
Driver->grab();
}
/** Destructor*/
CDMFLoader::~CDMFLoader()
{
if (Driver)
Driver->drop();
}
/** Given first three points of a face, returns a face normal*/
void CDMFLoader::GetFaceNormal( f32 a[3], //First point
f32 b[3], //Second point
......@@ -91,6 +79,7 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file)
{
if (!file)
return 0;
video::IVideoDriver* driver = SceneMgr->getVideoDriver();
//Load stringlist
StringList dmfRawFile(file);
......@@ -229,8 +218,8 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file)
//Primary texture is normal
if ((materiali[i].textureFlag==0) || (materiali[i].textureBlend==4))
Driver->setTextureCreationFlag(ETCF_ALWAYS_32_BIT,true);
tex = Driver->getTexture((path+String(materiali[i].textureName)).c_str());
driver->setTextureCreationFlag(ETCF_ALWAYS_32_BIT,true);
tex = driver->getTexture((path+String(materiali[i].textureName)).c_str());
//Primary texture is just a colour
if(materiali[i].textureFlag==1)
......@@ -260,12 +249,12 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file)
//just for compatibility with older Irrlicht versions
//to support transparent materials
if (color.getAlpha()!=255 && materiali[i].textureBlend==4)
Driver->setTextureCreationFlag(ETCF_ALWAYS_32_BIT,true);
driver->setTextureCreationFlag(ETCF_ALWAYS_32_BIT,true);
IImage *immagine=Driver->createImageFromData(ECF_A8R8G8B8,
IImage *immagine=driver->createImageFromData(ECF_A8R8G8B8,
core::dimension2d<s32>(8,8),buf);
tex = Driver->addTexture("", immagine);
tex = driver->addTexture("", immagine);
//to support transparent materials
if(color.getAlpha()!=255 && materiali[i].textureBlend==4)
......@@ -278,7 +267,7 @@ IAnimatedMesh* CDMFLoader::createMesh(io::IReadFile* file)
//Lightmap is present
if (materiali[i].lightmapFlag == 0)
lig = Driver->getTexture((path+String(materiali[i].lightmapName)).c_str());
lig = driver->getTexture((path+String(materiali[i].lightmapName)).c_str());
else //no lightmap
{
lig = 0;
......
......@@ -50,10 +50,7 @@ namespace scene
public:
/** constructor*/
CDMFLoader(video::IVideoDriver* driver, ISceneManager* smgr);
/** destructor*/
virtual ~CDMFLoader();
CDMFLoader(ISceneManager* smgr);
//! returns true if the file maybe is able to be loaded by this class
//! based on the file extension (e.g. ".cob")
......
......@@ -22,15 +22,9 @@ namespace scene
//! Constructor
CIrrMeshFileLoader::CIrrMeshFileLoader(video::IVideoDriver* driver,
scene::ISceneManager* smgr, io::IFileSystem* fs)
: Driver(driver), SceneManager(smgr), FileSystem(fs)
{
}
//! destructor
CIrrMeshFileLoader::~CIrrMeshFileLoader()
CIrrMeshFileLoader::CIrrMeshFileLoader(scene::ISceneManager* smgr,
io::IFileSystem* fs)
: SceneManager(smgr), FileSystem(fs)
{
}
......@@ -175,10 +169,10 @@ IMeshBuffer* CIrrMeshFileLoader::readMeshBuffer(io::IXMLReader* reader)
{
//we've got a material
io::IAttributes* attributes = FileSystem->createEmptyAttributes(Driver);
io::IAttributes* attributes = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
attributes->read(reader, true, L"material");
Driver->fillMaterialStructureFromAttributes(material, attributes);
SceneManager->getVideoDriver()->fillMaterialStructureFromAttributes(material, attributes);
attributes->drop();
}
else
......
......@@ -25,11 +25,7 @@ class CIrrMeshFileLoader : public IMeshLoader
public:
//! Constructor
CIrrMeshFileLoader(video::IVideoDriver* driver,
scene::ISceneManager* smgr, io::IFileSystem* fs);
//! destructor
virtual ~CIrrMeshFileLoader();
CIrrMeshFileLoader(scene::ISceneManager* smgr, io::IFileSystem* fs);
//! returns true if the file maybe is able to be loaded by this class
//! based on the file extension (e.g. ".cob")
......@@ -83,7 +79,6 @@ private:
// member variables
video::IVideoDriver* Driver;
scene::ISceneManager* SceneManager;
io::IFileSystem* FileSystem;
};
......
......@@ -103,7 +103,7 @@ void CIrrMeshWriter::writeBoundingBox(const core::aabbox3df& box)
{
Writer->writeElement(L"boundingBox", true,
L"minEdge", getVectorAsStringLine(box.MinEdge).c_str(),
L"maxEdge", getVectorAsStringLine(box.MaxEdge).c_str() );
L"maxEdge", getVectorAsStringLine(box.MaxEdge).c_str());
}
......
This diff is collapsed.
......@@ -2,20 +2,22 @@
#define __C_LWO_MESH_FILE_LOADER_H_INCLUDED__
#include "IMeshLoader.h"
#include "IVideoDriver.h"
#include "irrString.h"
#include "SMeshBuffer.h"
#include "irrString.h"
#include "irrMap.h"
namespace irr
{
namespace io
{
class IReadFile;
class IFileSystem;
} // end namespace io
namespace scene
{
struct SMesh;
struct SMesh;
class ISceneManager;
//! Meshloader capable of loading Lightwave 3D meshes.
class CLWOMeshFileLoader : public IMeshLoader
......@@ -23,7 +25,7 @@ class CLWOMeshFileLoader : public IMeshLoader
public:
//! Constructor
CLWOMeshFileLoader(video::IVideoDriver* driver);
CLWOMeshFileLoader(scene::ISceneManager* smgr, io::IFileSystem* fs);
//! destructor
virtual ~CLWOMeshFileLoader();
......@@ -53,14 +55,18 @@ private:
u32 readVec(core::vector3df& vec);
u32 readVX(u32& num);
u32 readColor(video::SColor& color);
video::ITexture* loadTexture(const core::stringc& file);
video::IVideoDriver* Driver;
scene::ISceneManager* SceneManager;
io::IFileSystem* FileSystem;
io::IReadFile* File;
SMesh* Mesh;
core::array<core::vector3df> Points;
core::array<core::array<u32> > Polygons;
core::array<core::vector2df> TCoords;
core::array<core::array<u32> > Indices;
core::array<u16> MaterialMapping;
core::map<core::stringc, u32> VMap;
core::array<core::array<core::vector2df> > TCoords;
core::array<tLWOMaterial*> Materials;
core::array<core::stringc> Images;
u8 FormatVersion;
......
......@@ -454,11 +454,13 @@ void COBJMeshFileLoader::readMTL(const c8* fileName, core::stringc relPath)
}
video::ITexture * texture = 0;
if (FileSystem->existFile(textureNameBuf))
texture = Driver->getTexture( textureNameBuf );
core::stringc texname(textureNameBuf);
texname.replace('\\', '/');
if (FileSystem->existFile(texname.c_str()))
texture = Driver->getTexture(texname.c_str());
else
// try to read in the relative path, the .obj is loaded from
texture = Driver->getTexture( (relPath + textureNameBuf).c_str() );
texture = Driver->getTexture( (relPath + texname).c_str() );
if ( texture )
{
if (type==0)
......
......@@ -20,10 +20,10 @@ namespace scene
//! constructor
CQ3LevelMesh::CQ3LevelMesh(io::IFileSystem* fs, video::IVideoDriver* driver, scene::ISceneManager* smgr)
CQ3LevelMesh::CQ3LevelMesh(io::IFileSystem* fs, scene::ISceneManager* smgr)
: Textures(0), LightMaps(0),
Vertices(0), Faces(0), Planes(0), Nodes(0), Leafs(0), LeafFaces(0),
MeshVerts(0), Brushes(0), Driver(driver), FileSystem(fs), SceneManager ( smgr )
MeshVerts(0), Brushes(0), FileSystem(fs), SceneManager ( smgr )
{
#ifdef _DEBUG
IReferenceCounted::setDebugName("CQ3LevelMesh");
......@@ -34,6 +34,10 @@ CQ3LevelMesh::CQ3LevelMesh(io::IFileSystem* fs, video::IVideoDriver* driver, sce
Mesh[i] = 0;
}
if (smgr)
Driver = smgr->getVideoDriver();
else
Driver = 0;
if (Driver)
Driver->grab();
......
......@@ -24,7 +24,7 @@ namespace scene
public:
//! constructor
CQ3LevelMesh(io::IFileSystem* fs, video::IVideoDriver* driver, scene::ISceneManager* smgr);
CQ3LevelMesh(io::IFileSystem* fs, scene::ISceneManager* smgr);
//! destructor
virtual ~CQ3LevelMesh();
......
......@@ -192,10 +192,10 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
// add file format loaders
#ifdef _IRR_COMPILE_WITH_IRR_MESH_LOADER_
MeshLoaderList.push_back(new CIrrMeshFileLoader(Driver, this, FileSystem));
MeshLoaderList.push_back(new CIrrMeshFileLoader(this, FileSystem));
#endif
#ifdef _IRR_COMPILE_WITH_BSP_LOADER_
MeshLoaderList.push_back(new CBSPMeshFileLoader(FileSystem, Driver, this));
MeshLoaderList.push_back(new CBSPMeshFileLoader(this, FileSystem));
#endif
#ifdef _IRR_COMPILE_WITH_MD2_LOADER_
MeshLoaderList.push_back(new CMD2MeshFileLoader());
......@@ -222,10 +222,10 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
MeshLoaderList.push_back(new CMY3DMeshFileLoader(FileSystem, Driver, this));
#endif
#ifdef _IRR_COMPILE_WITH_COLLADA_LOADER_
MeshLoaderList.push_back(new CColladaFileLoader(Driver, this, FileSystem));
MeshLoaderList.push_back(new CColladaFileLoader(this, FileSystem));
#endif
#ifdef _IRR_COMPILE_WITH_DMF_LOADER_
MeshLoaderList.push_back(new CDMFLoader(Driver, this));
MeshLoaderList.push_back(new CDMFLoader(this));
#endif
#ifdef _IRR_COMPILE_WITH_OGRE_LOADER_
MeshLoaderList.push_back(new COgreMeshFileLoader(MeshManipulator, FileSystem, Driver));
......@@ -240,7 +240,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
MeshLoaderList.push_back(new CB3DMeshFileLoader(this));
#endif
#ifdef _IRR_COMPILE_WITH_LWO_LOADER_
MeshLoaderList.push_back(new CLWOMeshFileLoader(Driver));
MeshLoaderList.push_back(new CLWOMeshFileLoader(this, FileSystem));
#endif
#ifdef _IRR_COMPILE_WITH_STL_LOADER_
MeshLoaderList.push_back(new CSTLMeshFileLoader());
......@@ -1813,7 +1813,6 @@ bool CSceneManager::loadScene(io::IReadFile* file, ISceneUserDataSerializer* use
reader->drop();
return true;
}
......
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