]> git.lizzy.rs Git - irrlicht.git/commitdiff
Readd CSceneCollisionManager with only the method we need
authorsfan5 <sfan5@live.de>
Tue, 24 Aug 2021 21:51:48 +0000 (23:51 +0200)
committersfan5 <sfan5@live.de>
Thu, 26 Aug 2021 20:17:35 +0000 (22:17 +0200)
include/ISceneCollisionManager.h [new file with mode: 0644]
include/ISceneManager.h
include/irrlicht.h
source/Irrlicht/CMakeLists.txt
source/Irrlicht/CSceneCollisionManager.cpp [new file with mode: 0644]
source/Irrlicht/CSceneCollisionManager.h [new file with mode: 0644]
source/Irrlicht/CSceneManager.cpp
source/Irrlicht/CSceneManager.h

diff --git a/include/ISceneCollisionManager.h b/include/ISceneCollisionManager.h
new file mode 100644 (file)
index 0000000..a74fb70
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt\r
+// This file is part of the "Irrlicht Engine".\r
+// For conditions of distribution and use, see copyright notice in irrlicht.h\r
+\r
+#ifndef __I_SCENE_COLLISION_MANAGER_H_INCLUDED__\r
+#define __I_SCENE_COLLISION_MANAGER_H_INCLUDED__\r
+\r
+#include "IReferenceCounted.h"\r
+#include "position2d.h"\r
+#include "line3d.h"\r
+\r
+namespace irr\r
+{\r
+\r
+namespace scene\r
+{\r
+       class ICameraSceneNode;\r
+\r
+       class ISceneCollisionManager : public virtual IReferenceCounted\r
+       {\r
+       public:\r
+\r
+               //! Returns a 3d ray which would go through the 2d screen coordinates.\r
+               /** \param pos: Screen coordinates in pixels.\r
+               \param camera: Camera from which the ray starts. If null, the\r
+               active camera is used.\r
+               \return Ray starting from the position of the camera and ending\r
+               at a length of the far value of the camera at a position which\r
+               would be behind the 2d screen coordinates. */\r
+               virtual core::line3d<f32> getRayFromScreenCoordinates(\r
+                       const core::position2d<s32>& pos, const ICameraSceneNode* camera = 0) = 0;\r
+\r
+       };\r
+\r
+} // end namespace scene\r
+} // end namespace irr\r
+\r
+#endif\r
index 2f25e4149c1882c63e0205aa8e1f4a37a0338a2d..a7fe1901af6409b2c7d6c033c38f9a9f25c908d9 100644 (file)
@@ -106,6 +106,7 @@ namespace scene
        class IMesh;\r
        class IMeshBuffer;\r
        class IMeshCache;\r
+       class ISceneCollisionManager;\r
        class IMeshLoader;\r
        class IMeshManipulator;\r
        class IMeshSceneNode;\r
@@ -578,6 +579,11 @@ namespace scene
                \return A pointer to the specified loader, 0 if the index is incorrect. */\r
                virtual ISceneLoader* getSceneLoader(u32 index) const = 0;\r
 \r
+               //! Get pointer to the scene collision manager.\r
+               /** \return Pointer to the collision manager\r
+               This pointer should not be dropped. See IReferenceCounted::drop() for more information. */\r
+               virtual ISceneCollisionManager* getSceneCollisionManager() = 0;\r
+\r
                //! Get pointer to the mesh manipulator.\r
                /** \return Pointer to the mesh manipulator\r
                This pointer should not be dropped. See IReferenceCounted::drop() for more information. */\r
index ea82b621cc6390a255dd3e1541ad3e63496ea7d4..0ed16bcabcd932ccbff01f8e6a726f4fbad3bdb1 100644 (file)
@@ -49,7 +49,6 @@
 #include "EMaterialTypes.h"\r
 #include "EMeshWriterEnums.h"\r
 #include "EMessageBoxFlags.h"\r
-// #include "ESceneNodeAnimatorTypes.h"\r
 #include "ESceneNodeTypes.h"\r
 #include "ETerrainElements.h"\r
 #include "fast_atof.h"\r
 #include "irrString.h"\r
 #include "irrTypes.h"\r
 #include "path.h"\r
+#include "ISceneCollisionManager.h"\r
 #include "ISceneLoader.h"\r
 #include "ISceneManager.h"\r
 #include "ISceneNode.h"\r
index 6e716afd5aeb63be82816c0b82ecd5259dcacaeb..122bd586e31e4e0247d63d2583ec7af4aa80fe33 100644 (file)
@@ -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 (file)
index 0000000..f975ab8
--- /dev/null
@@ -0,0 +1,76 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt\r
+// This file is part of the "Irrlicht Engine".\r
+// For conditions of distribution and use, see copyright notice in irrlicht.h\r
+\r
+#include "CSceneCollisionManager.h"\r
+#include "ICameraSceneNode.h"\r
+#include "SViewFrustum.h"\r
+\r
+#include "os.h"\r
+#include "irrMath.h"\r
+\r
+namespace irr\r
+{\r
+namespace scene\r
+{\r
+\r
+//! constructor\r
+CSceneCollisionManager::CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver)\r
+: SceneManager(smanager), Driver(driver)\r
+{\r
+       #ifdef _DEBUG\r
+       setDebugName("CSceneCollisionManager");\r
+       #endif\r
+\r
+       if (Driver)\r
+               Driver->grab();\r
+}\r
+\r
+\r
+//! destructor\r
+CSceneCollisionManager::~CSceneCollisionManager()\r
+{\r
+       if (Driver)\r
+               Driver->drop();\r
+}\r
+\r
+\r
+//! Returns a 3d ray which would go through the 2d screen coordinates.\r
+core::line3d<f32> CSceneCollisionManager::getRayFromScreenCoordinates(\r
+       const core::position2d<s32> & pos, const ICameraSceneNode* camera)\r
+{\r
+       core::line3d<f32> ln(0,0,0,0,0,0);\r
+\r
+       if (!SceneManager)\r
+               return ln;\r
+\r
+       if (!camera)\r
+               camera = SceneManager->getActiveCamera();\r
+\r
+       if (!camera)\r
+               return ln;\r
+\r
+       const scene::SViewFrustum* f = camera->getViewFrustum();\r
+\r
+       core::vector3df farLeftUp = f->getFarLeftUp();\r
+       core::vector3df lefttoright = f->getFarRightUp() - farLeftUp;\r
+       core::vector3df uptodown = f->getFarLeftDown() - farLeftUp;\r
+\r
+       const core::rect<s32>& viewPort = Driver->getViewPort();\r
+       core::dimension2d<u32> screenSize(viewPort.getWidth(), viewPort.getHeight());\r
+\r
+       f32 dx = pos.X / (f32)screenSize.Width;\r
+       f32 dy = pos.Y / (f32)screenSize.Height;\r
+\r
+       if (camera->isOrthogonal())\r
+               ln.start = f->cameraPosition + (lefttoright * (dx-0.5f)) + (uptodown * (dy-0.5f));\r
+       else\r
+               ln.start = f->cameraPosition;\r
+\r
+       ln.end = farLeftUp + (lefttoright * dx) + (uptodown * dy);\r
+\r
+       return ln;\r
+}\r
+\r
+} // end namespace scene\r
+} // end namespace irr\r
diff --git a/source/Irrlicht/CSceneCollisionManager.h b/source/Irrlicht/CSceneCollisionManager.h
new file mode 100644 (file)
index 0000000..9f51103
--- /dev/null
@@ -0,0 +1,41 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt\r
+// This file is part of the "Irrlicht Engine".\r
+// For conditions of distribution and use, see copyright notice in irrlicht.h\r
+\r
+#ifndef __C_SCENE_COLLISION_MANAGER_H_INCLUDED__\r
+#define __C_SCENE_COLLISION_MANAGER_H_INCLUDED__\r
+\r
+#include "ISceneCollisionManager.h"\r
+#include "ISceneManager.h"\r
+#include "IVideoDriver.h"\r
+\r
+namespace irr\r
+{\r
+namespace scene\r
+{\r
+\r
+       class CSceneCollisionManager : public ISceneCollisionManager\r
+       {\r
+       public:\r
+\r
+               //! constructor\r
+               CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver);\r
+\r
+               //! destructor\r
+               virtual ~CSceneCollisionManager();\r
+\r
+               //! Returns a 3d ray which would go through the 2d screen coordinates.\r
+               virtual core::line3d<f32> getRayFromScreenCoordinates(\r
+                       const core::position2d<s32> & pos, const ICameraSceneNode* camera = 0) _IRR_OVERRIDE_;\r
+\r
+       private:\r
+\r
+               ISceneManager* SceneManager;\r
+               video::IVideoDriver* Driver;\r
+       };\r
+\r
+\r
+} // end namespace scene\r
+} // end namespace irr\r
+\r
+#endif\r
index cf8749d706de72ad73363c0f43e01f2eed3597f4..2371a14aa34571ba7d5a54688d0f3f00ca3495c8 100644 (file)
@@ -48,6 +48,8 @@
 \r
 #include "CDefaultSceneNodeFactory.h"\r
 \r
+#include "CSceneCollisionManager.h"\r
+\r
 #include <locale.h>\r
 \r
 namespace irr\r
@@ -95,6 +97,9 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
        Parameters->setAttribute(DEBUG_NORMAL_LENGTH, 1.f);\r
        Parameters->setAttribute(DEBUG_NORMAL_COLOR, video::SColor(255, 34, 221, 221));\r
 \r
+       // create collision manager\r
+       CollisionManager = new CSceneCollisionManager(this, Driver);\r
+\r
        // add file format loaders. add the least commonly used ones first,\r
        // as these are checked last\r
 \r
@@ -154,6 +159,9 @@ CSceneManager::~CSceneManager()
        if (CursorControl)\r
                CursorControl->drop();\r
 \r
+       if (CollisionManager)\r
+               CollisionManager->drop();\r
+\r
        if (GUIEnvironment)\r
                GUIEnvironment->drop();\r
 \r
@@ -827,6 +835,12 @@ ISceneLoader* CSceneManager::getSceneLoader(u32 index) const
                return 0;\r
 }\r
 \r
+//! Returns a pointer to the scene collision manager.\r
+ISceneCollisionManager* CSceneManager::getSceneCollisionManager()\r
+{\r
+       return CollisionManager;\r
+}\r
+\r
 \r
 //! Returns a pointer to the mesh manipulator.\r
 IMeshManipulator* CSceneManager::getMeshManipulator()\r
index 882a704995c79b4fc33c839e0597fe245e2ecfea..e7e6ce35566cf9101fafc7c56564a84def620076 100644 (file)
@@ -146,6 +146,9 @@ namespace scene
                //! Retrieve the given scene loader\r
                virtual ISceneLoader* getSceneLoader(u32 index) const _IRR_OVERRIDE_;\r
 \r
+               //! Returns a pointer to the scene collision manager.\r
+               virtual ISceneCollisionManager* getSceneCollisionManager() _IRR_OVERRIDE_;\r
+\r
                //! Returns a pointer to the mesh manipulator.\r
                virtual IMeshManipulator* getMeshManipulator() _IRR_OVERRIDE_;\r
 \r
@@ -329,6 +332,9 @@ namespace scene
                //! cursor control\r
                gui::ICursorControl* CursorControl;\r
 \r
+               //! collision manager\r
+               ISceneCollisionManager* CollisionManager;\r
+\r
                //! render pass lists\r
                core::array<ISceneNode*> CameraList;\r
                core::array<ISceneNode*> SkyBoxList;\r