1
0

Merge branch 'master' into feat/gltf-loader

This commit is contained in:
JosiahWI
2023-05-15 09:59:59 -05:00
185 changed files with 6431 additions and 9257 deletions

View File

@@ -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);
}