Merge branch 'master' into feat/gltf-loader
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
// This file is part of the "Irrlicht Engine".
|
||||
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
||||
|
||||
#include "IrrCompileConfig.h"
|
||||
#include "CSceneManager.h"
|
||||
#include "IVideoDriver.h"
|
||||
#include "IFileSystem.h"
|
||||
@@ -15,31 +14,13 @@
|
||||
|
||||
#include "os.h"
|
||||
|
||||
// We need this include for the case of skinned mesh support without
|
||||
// any such loader
|
||||
#ifdef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
#include "CSkinnedMesh.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_X_LOADER_
|
||||
#include "CXMeshFileLoader.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_OBJ_LOADER_
|
||||
#include "COBJMeshFileLoader.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_B3D_LOADER_
|
||||
#include "CB3DMeshFileLoader.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_GLTF_LOADER_
|
||||
#include "CGLTFMeshFileLoader.h"
|
||||
#endif
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
#include "CBillboardSceneNode.h"
|
||||
#endif // _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
#include "CAnimatedMeshSceneNode.h"
|
||||
#include "CCameraSceneNode.h"
|
||||
#include "CMeshSceneNode.h"
|
||||
@@ -54,10 +35,9 @@ namespace scene
|
||||
{
|
||||
|
||||
//! constructor
|
||||
CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
|
||||
gui::ICursorControl* cursorControl, IMeshCache* cache,
|
||||
gui::IGUIEnvironment* gui)
|
||||
: ISceneNode(0, 0), Driver(driver), FileSystem(fs), GUIEnvironment(gui),
|
||||
CSceneManager::CSceneManager(video::IVideoDriver* driver,
|
||||
gui::ICursorControl* cursorControl, IMeshCache* cache)
|
||||
: ISceneNode(0, 0), Driver(driver),
|
||||
CursorControl(cursorControl),
|
||||
ActiveCamera(0), ShadowColor(150,0,0,0), AmbientLight(0,0,0,0), Parameters(0),
|
||||
MeshCache(cache), CurrentRenderPass(ESNRP_NONE)
|
||||
@@ -73,15 +53,9 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
|
||||
if (Driver)
|
||||
Driver->grab();
|
||||
|
||||
if (FileSystem)
|
||||
FileSystem->grab();
|
||||
|
||||
if (CursorControl)
|
||||
CursorControl->grab();
|
||||
|
||||
if (GUIEnvironment)
|
||||
GUIEnvironment->grab();
|
||||
|
||||
// create mesh cache if not there already
|
||||
if (!MeshCache)
|
||||
MeshCache = new CMeshCache();
|
||||
@@ -100,18 +74,10 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
|
||||
// TODO: now that we have multiple scene managers, these should be
|
||||
// shallow copies from the previous manager if there is one.
|
||||
|
||||
#ifdef _IRR_COMPILE_WITH_X_LOADER_
|
||||
MeshLoaderList.push_back(new CXMeshFileLoader(this, FileSystem));
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_OBJ_LOADER_
|
||||
MeshLoaderList.push_back(new COBJMeshFileLoader(this, FileSystem));
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_B3D_LOADER_
|
||||
MeshLoaderList.push_back(new CXMeshFileLoader(this));
|
||||
MeshLoaderList.push_back(new COBJMeshFileLoader(this));
|
||||
MeshLoaderList.push_back(new CB3DMeshFileLoader(this));
|
||||
#endif
|
||||
#ifdef _IRR_COMPILE_WITH_GLTF_LOADER_
|
||||
MeshLoaderList.push_back(new CGLTFMeshFileLoader());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -126,18 +92,12 @@ CSceneManager::~CSceneManager()
|
||||
if (Driver)
|
||||
Driver->removeAllHardwareBuffers();
|
||||
|
||||
if (FileSystem)
|
||||
FileSystem->drop();
|
||||
|
||||
if (CursorControl)
|
||||
CursorControl->drop();
|
||||
|
||||
if (CollisionManager)
|
||||
CollisionManager->drop();
|
||||
|
||||
if (GUIEnvironment)
|
||||
GUIEnvironment->drop();
|
||||
|
||||
u32 i;
|
||||
for (i=0; i<MeshLoaderList.size(); ++i)
|
||||
MeshLoaderList[i]->drop();
|
||||
@@ -162,29 +122,6 @@ CSceneManager::~CSceneManager()
|
||||
}
|
||||
|
||||
|
||||
//! gets an animateable mesh. loads it if needed. returned pointer must not be dropped.
|
||||
IAnimatedMesh* CSceneManager::getMesh(const io::path& filename, const io::path& alternativeCacheName)
|
||||
{
|
||||
io::path cacheName = alternativeCacheName.empty() ? filename : alternativeCacheName;
|
||||
IAnimatedMesh* msh = MeshCache->getMeshByName(cacheName);
|
||||
if (msh)
|
||||
return msh;
|
||||
|
||||
io::IReadFile* file = FileSystem->createAndOpenFile(filename);
|
||||
if (!file)
|
||||
{
|
||||
os::Printer::log("Could not load mesh, because file could not be opened: ", filename, ELL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
msh = getUncachedMesh(file, filename, cacheName);
|
||||
|
||||
file->drop();
|
||||
|
||||
return msh;
|
||||
}
|
||||
|
||||
|
||||
//! gets an animateable mesh. loads it if needed. returned pointer must not be dropped.
|
||||
IAnimatedMesh* CSceneManager::getMesh(io::IReadFile* file)
|
||||
{
|
||||
@@ -239,21 +176,6 @@ video::IVideoDriver* CSceneManager::getVideoDriver()
|
||||
}
|
||||
|
||||
|
||||
//! returns the GUI Environment
|
||||
gui::IGUIEnvironment* CSceneManager::getGUIEnvironment()
|
||||
{
|
||||
return GUIEnvironment;
|
||||
}
|
||||
|
||||
//! Get the active FileSystem
|
||||
/** \return Pointer to the FileSystem
|
||||
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
|
||||
io::IFileSystem* CSceneManager::getFileSystem()
|
||||
{
|
||||
return FileSystem;
|
||||
}
|
||||
|
||||
|
||||
//! adds a scene node for rendering a static mesh
|
||||
//! the returned pointer must not be dropped.
|
||||
IMeshSceneNode* CSceneManager::addMeshSceneNode(IMesh* mesh, ISceneNode* parent, s32 id,
|
||||
@@ -323,7 +245,6 @@ IBillboardSceneNode* CSceneManager::addBillboardSceneNode(ISceneNode* parent,
|
||||
video::SColor colorTop, video::SColor colorBottom
|
||||
)
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_BILLBOARD_SCENENODE_
|
||||
if (!parent)
|
||||
parent = this;
|
||||
|
||||
@@ -332,9 +253,6 @@ IBillboardSceneNode* CSceneManager::addBillboardSceneNode(ISceneNode* parent,
|
||||
node->drop();
|
||||
|
||||
return node;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -582,17 +500,6 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
s32 index = Parameters->findAttribute("calls");
|
||||
Parameters->setAttribute(index, Parameters->getAttributeAsInt(index)+1);
|
||||
|
||||
if (!taken)
|
||||
{
|
||||
index = Parameters->findAttribute("culled");
|
||||
Parameters->setAttribute(index, Parameters->getAttributeAsInt(index)+1);
|
||||
}
|
||||
#endif
|
||||
|
||||
return taken;
|
||||
}
|
||||
|
||||
@@ -613,15 +520,6 @@ void CSceneManager::drawAll()
|
||||
if (!Driver)
|
||||
return;
|
||||
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
// reset attributes
|
||||
Parameters->setAttribute("culled", 0);
|
||||
Parameters->setAttribute("calls", 0);
|
||||
Parameters->setAttribute("drawn_solid", 0);
|
||||
Parameters->setAttribute("drawn_transparent", 0);
|
||||
Parameters->setAttribute("drawn_transparent_effect", 0);
|
||||
#endif
|
||||
|
||||
u32 i; // new ISO for scoping problem in some compilers
|
||||
|
||||
// reset all transforms
|
||||
@@ -683,9 +581,6 @@ void CSceneManager::drawAll()
|
||||
for (i=0; i<SolidNodeList.size(); ++i)
|
||||
SolidNodeList[i].Node->render();
|
||||
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
Parameters->setAttribute("drawn_solid", (s32) SolidNodeList.size() );
|
||||
#endif
|
||||
SolidNodeList.set_used(0);
|
||||
}
|
||||
|
||||
@@ -698,9 +593,6 @@ void CSceneManager::drawAll()
|
||||
for (i=0; i<TransparentNodeList.size(); ++i)
|
||||
TransparentNodeList[i].Node->render();
|
||||
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
Parameters->setAttribute ( "drawn_transparent", (s32) TransparentNodeList.size() );
|
||||
#endif
|
||||
TransparentNodeList.set_used(0);
|
||||
}
|
||||
|
||||
@@ -713,9 +605,7 @@ void CSceneManager::drawAll()
|
||||
|
||||
for (i=0; i<TransparentEffectNodeList.size(); ++i)
|
||||
TransparentEffectNodeList[i].Node->render();
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
Parameters->setAttribute("drawn_transparent_effect", (s32) TransparentEffectNodeList.size());
|
||||
#endif
|
||||
|
||||
TransparentEffectNodeList.set_used(0);
|
||||
}
|
||||
|
||||
@@ -726,9 +616,7 @@ void CSceneManager::drawAll()
|
||||
|
||||
for (i=0; i<GuiNodeList.size(); ++i)
|
||||
GuiNodeList[i]->render();
|
||||
#ifdef _IRR_SCENEMANAGER_DEBUG
|
||||
Parameters->setAttribute("drawn_gui_nodes", (s32) GuiNodeList.size());
|
||||
#endif
|
||||
|
||||
GuiNodeList.set_used(0);
|
||||
}
|
||||
clearDeletionList();
|
||||
@@ -952,7 +840,7 @@ IMeshCache* CSceneManager::getMeshCache()
|
||||
//! Creates a new scene manager.
|
||||
ISceneManager* CSceneManager::createNewSceneManager(bool cloneContent)
|
||||
{
|
||||
CSceneManager* manager = new CSceneManager(Driver, FileSystem, CursorControl, MeshCache, GUIEnvironment);
|
||||
CSceneManager* manager = new CSceneManager(Driver, CursorControl, MeshCache);
|
||||
|
||||
if (cloneContent)
|
||||
manager->cloneMembers(this, manager);
|
||||
@@ -978,59 +866,20 @@ const video::SColorf& CSceneManager::getAmbientLight() const
|
||||
//! Get a skinned mesh, which is not available as header-only code
|
||||
ISkinnedMesh* CSceneManager::createSkinnedMesh()
|
||||
{
|
||||
#ifdef _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_
|
||||
return new CSkinnedMesh();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Returns a mesh writer implementation if available
|
||||
IMeshWriter* CSceneManager::createMeshWriter(EMESH_WRITER_TYPE type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case EMWT_IRR_MESH:
|
||||
case EMWT_COLLADA:
|
||||
return 0;
|
||||
case EMWT_STL:
|
||||
#ifdef _IRR_COMPILE_WITH_STL_WRITER_
|
||||
return new CSTLMeshWriter(this);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
case EMWT_OBJ:
|
||||
#ifdef _IRR_COMPILE_WITH_OBJ_WRITER_
|
||||
return new COBJMeshWriter(this, FileSystem);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
case EMWT_PLY:
|
||||
#ifdef _IRR_COMPILE_WITH_PLY_WRITER_
|
||||
return new CPLYMeshWriter();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
case EMWT_B3D:
|
||||
#ifdef _IRR_COMPILE_WITH_B3D_WRITER_
|
||||
return new CB3DMeshWriter();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// creates a scenemanager
|
||||
ISceneManager* createSceneManager(video::IVideoDriver* driver,
|
||||
io::IFileSystem* fs, gui::ICursorControl* cursorcontrol,
|
||||
gui::IGUIEnvironment *guiEnvironment)
|
||||
ISceneManager* createSceneManager(video::IVideoDriver* driver, gui::ICursorControl* cursorcontrol)
|
||||
{
|
||||
return new CSceneManager(driver, fs, cursorcontrol, 0, guiEnvironment );
|
||||
return new CSceneManager(driver, cursorcontrol, nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user