aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2021-08-24 23:51:48 +0200
committersfan5 <sfan5@live.de>2021-08-26 22:17:35 +0200
commitda33f80bb8afa6c18ea047ca230cf5dce90c963d (patch)
treea16bb666767f8efc50fa203e2deb26b16f20b4b9
parentf9078a6a1222e111f09fe6762ee998cbd835a8fa (diff)
downloadirrlicht-da33f80bb8afa6c18ea047ca230cf5dce90c963d.tar.xz
Readd CSceneCollisionManager with only the method we need
-rw-r--r--include/ISceneCollisionManager.h38
-rw-r--r--include/ISceneManager.h6
-rw-r--r--include/irrlicht.h2
-rw-r--r--source/Irrlicht/CMakeLists.txt1
-rw-r--r--source/Irrlicht/CSceneCollisionManager.cpp76
-rw-r--r--source/Irrlicht/CSceneCollisionManager.h41
-rw-r--r--source/Irrlicht/CSceneManager.cpp14
-rw-r--r--source/Irrlicht/CSceneManager.h6
8 files changed, 183 insertions, 1 deletions
diff --git a/include/ISceneCollisionManager.h b/include/ISceneCollisionManager.h
new file mode 100644
index 0000000..a74fb70
--- /dev/null
+++ b/include/ISceneCollisionManager.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __I_SCENE_COLLISION_MANAGER_H_INCLUDED__
+#define __I_SCENE_COLLISION_MANAGER_H_INCLUDED__
+
+#include "IReferenceCounted.h"
+#include "position2d.h"
+#include "line3d.h"
+
+namespace irr
+{
+
+namespace scene
+{
+ class ICameraSceneNode;
+
+ class ISceneCollisionManager : public virtual IReferenceCounted
+ {
+ public:
+
+ //! Returns a 3d ray which would go through the 2d screen coordinates.
+ /** \param pos: Screen coordinates in pixels.
+ \param camera: Camera from which the ray starts. If null, the
+ active camera is used.
+ \return Ray starting from the position of the camera and ending
+ at a length of the far value of the camera at a position which
+ would be behind the 2d screen coordinates. */
+ virtual core::line3d<f32> getRayFromScreenCoordinates(
+ const core::position2d<s32>& pos, const ICameraSceneNode* camera = 0) = 0;
+
+ };
+
+} // end namespace scene
+} // end namespace irr
+
+#endif
diff --git a/include/ISceneManager.h b/include/ISceneManager.h
index 2f25e41..a7fe190 100644
--- a/include/ISceneManager.h
+++ b/include/ISceneManager.h
@@ -106,6 +106,7 @@ namespace scene
class IMesh;
class IMeshBuffer;
class IMeshCache;
+ class ISceneCollisionManager;
class IMeshLoader;
class IMeshManipulator;
class IMeshSceneNode;
@@ -578,6 +579,11 @@ namespace scene
\return A pointer to the specified loader, 0 if the index is incorrect. */
virtual ISceneLoader* getSceneLoader(u32 index) const = 0;
+ //! Get pointer to the scene collision manager.
+ /** \return Pointer to the collision manager
+ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
+ virtual ISceneCollisionManager* getSceneCollisionManager() = 0;
+
//! Get pointer to the mesh manipulator.
/** \return Pointer to the mesh manipulator
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
diff --git a/include/irrlicht.h b/include/irrlicht.h
index ea82b62..0ed16bc 100644
--- a/include/irrlicht.h
+++ b/include/irrlicht.h
@@ -49,7 +49,6 @@
#include "EMaterialTypes.h"
#include "EMeshWriterEnums.h"
#include "EMessageBoxFlags.h"
-// #include "ESceneNodeAnimatorTypes.h"
#include "ESceneNodeTypes.h"
#include "ETerrainElements.h"
#include "fast_atof.h"
@@ -123,6 +122,7 @@
#include "irrString.h"
#include "irrTypes.h"
#include "path.h"
+#include "ISceneCollisionManager.h"
#include "ISceneLoader.h"
#include "ISceneManager.h"
#include "ISceneNode.h"
diff --git a/source/Irrlicht/CMakeLists.txt b/source/Irrlicht/CMakeLists.txt
index 6e716af..122bd58 100644
--- a/source/Irrlicht/CMakeLists.txt
+++ b/source/Irrlicht/CMakeLists.txt
@@ -128,6 +128,7 @@ add_library(IRROBJ OBJECT
CDummyTransformationSceneNode.cpp
CEmptySceneNode.cpp
CMeshManipulator.cpp
+ CSceneCollisionManager.cpp
CSceneManager.cpp
CMeshCache.cpp
CDefaultSceneNodeFactory.cpp
diff --git a/source/Irrlicht/CSceneCollisionManager.cpp b/source/Irrlicht/CSceneCollisionManager.cpp
new file mode 100644
index 0000000..f975ab8
--- /dev/null
+++ b/source/Irrlicht/CSceneCollisionManager.cpp
@@ -0,0 +1,76 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "CSceneCollisionManager.h"
+#include "ICameraSceneNode.h"
+#include "SViewFrustum.h"
+
+#include "os.h"
+#include "irrMath.h"
+
+namespace irr
+{
+namespace scene
+{
+
+//! constructor
+CSceneCollisionManager::CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver)
+: SceneManager(smanager), Driver(driver)
+{
+ #ifdef _DEBUG
+ setDebugName("CSceneCollisionManager");
+ #endif
+
+ if (Driver)
+ Driver->grab();
+}
+
+
+//! destructor
+CSceneCollisionManager::~CSceneCollisionManager()
+{
+ if (Driver)
+ Driver->drop();
+}
+
+
+//! Returns a 3d ray which would go through the 2d screen coordinates.
+core::line3d<f32> CSceneCollisionManager::getRayFromScreenCoordinates(
+ const core::position2d<s32> & pos, const ICameraSceneNode* camera)
+{
+ core::line3d<f32> ln(0,0,0,0,0,0);
+
+ if (!SceneManager)
+ return ln;
+
+ if (!camera)
+ camera = SceneManager->getActiveCamera();
+
+ if (!camera)
+ return ln;
+
+ const scene::SViewFrustum* f = camera->getViewFrustum();
+
+ core::vector3df farLeftUp = f->getFarLeftUp();
+ core::vector3df lefttoright = f->getFarRightUp() - farLeftUp;
+ core::vector3df uptodown = f->getFarLeftDown() - farLeftUp;
+
+ const core::rect<s32>& viewPort = Driver->getViewPort();
+ core::dimension2d<u32> screenSize(viewPort.getWidth(), viewPort.getHeight());
+
+ f32 dx = pos.X / (f32)screenSize.Width;
+ f32 dy = pos.Y / (f32)screenSize.Height;
+
+ if (camera->isOrthogonal())
+ ln.start = f->cameraPosition + (lefttoright * (dx-0.5f)) + (uptodown * (dy-0.5f));
+ else
+ ln.start = f->cameraPosition;
+
+ ln.end = farLeftUp + (lefttoright * dx) + (uptodown * dy);
+
+ return ln;
+}
+
+} // end namespace scene
+} // end namespace irr
diff --git a/source/Irrlicht/CSceneCollisionManager.h b/source/Irrlicht/CSceneCollisionManager.h
new file mode 100644
index 0000000..9f51103
--- /dev/null
+++ b/source/Irrlicht/CSceneCollisionManager.h
@@ -0,0 +1,41 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_SCENE_COLLISION_MANAGER_H_INCLUDED__
+#define __C_SCENE_COLLISION_MANAGER_H_INCLUDED__
+
+#include "ISceneCollisionManager.h"
+#include "ISceneManager.h"
+#include "IVideoDriver.h"
+
+namespace irr
+{
+namespace scene
+{
+
+ class CSceneCollisionManager : public ISceneCollisionManager
+ {
+ public:
+
+ //! constructor
+ CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver);
+
+ //! destructor
+ virtual ~CSceneCollisionManager();
+
+ //! Returns a 3d ray which would go through the 2d screen coordinates.
+ virtual core::line3d<f32> getRayFromScreenCoordinates(
+ const core::position2d<s32> & pos, const ICameraSceneNode* camera = 0) _IRR_OVERRIDE_;
+
+ private:
+
+ ISceneManager* SceneManager;
+ video::IVideoDriver* Driver;
+ };
+
+
+} // end namespace scene
+} // end namespace irr
+
+#endif
diff --git a/source/Irrlicht/CSceneManager.cpp b/source/Irrlicht/CSceneManager.cpp
index cf8749d..2371a14 100644
--- a/source/Irrlicht/CSceneManager.cpp
+++ b/source/Irrlicht/CSceneManager.cpp
@@ -48,6 +48,8 @@
#include "CDefaultSceneNodeFactory.h"
+#include "CSceneCollisionManager.h"
+
#include <locale.h>
namespace irr
@@ -95,6 +97,9 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
Parameters->setAttribute(DEBUG_NORMAL_LENGTH, 1.f);
Parameters->setAttribute(DEBUG_NORMAL_COLOR, video::SColor(255, 34, 221, 221));
+ // create collision manager
+ CollisionManager = new CSceneCollisionManager(this, Driver);
+
// add file format loaders. add the least commonly used ones first,
// as these are checked last
@@ -154,6 +159,9 @@ CSceneManager::~CSceneManager()
if (CursorControl)
CursorControl->drop();
+ if (CollisionManager)
+ CollisionManager->drop();
+
if (GUIEnvironment)
GUIEnvironment->drop();
@@ -827,6 +835,12 @@ ISceneLoader* CSceneManager::getSceneLoader(u32 index) const
return 0;
}
+//! Returns a pointer to the scene collision manager.
+ISceneCollisionManager* CSceneManager::getSceneCollisionManager()
+{
+ return CollisionManager;
+}
+
//! Returns a pointer to the mesh manipulator.
IMeshManipulator* CSceneManager::getMeshManipulator()
diff --git a/source/Irrlicht/CSceneManager.h b/source/Irrlicht/CSceneManager.h
index 882a704..e7e6ce3 100644
--- a/source/Irrlicht/CSceneManager.h
+++ b/source/Irrlicht/CSceneManager.h
@@ -146,6 +146,9 @@ namespace scene
//! Retrieve the given scene loader
virtual ISceneLoader* getSceneLoader(u32 index) const _IRR_OVERRIDE_;
+ //! Returns a pointer to the scene collision manager.
+ virtual ISceneCollisionManager* getSceneCollisionManager() _IRR_OVERRIDE_;
+
//! Returns a pointer to the mesh manipulator.
virtual IMeshManipulator* getMeshManipulator() _IRR_OVERRIDE_;
@@ -329,6 +332,9 @@ namespace scene
//! cursor control
gui::ICursorControl* CursorControl;
+ //! collision manager
+ ISceneCollisionManager* CollisionManager;
+
//! render pass lists
core::array<ISceneNode*> CameraList;
core::array<ISceneNode*> SkyBoxList;