diff --git a/include/ISceneCollisionManager.h b/include/ISceneCollisionManager.h new file mode 100644 index 00000000..a74fb70a --- /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 getRayFromScreenCoordinates( + const core::position2d& pos, const ICameraSceneNode* camera = 0) = 0; + + }; + +} // end namespace scene +} // end namespace irr + +#endif diff --git a/include/ISceneManager.h b/include/ISceneManager.h index 2f25e414..a7fe1901 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 ea82b621..0ed16bca 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 6e716afd..122bd586 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 00000000..f975ab81 --- /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 CSceneCollisionManager::getRayFromScreenCoordinates( + const core::position2d & pos, const ICameraSceneNode* camera) +{ + core::line3d 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& viewPort = Driver->getViewPort(); + core::dimension2d 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 00000000..9f511037 --- /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 getRayFromScreenCoordinates( + const core::position2d & 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 cf8749d7..2371a14a 100644 --- a/source/Irrlicht/CSceneManager.cpp +++ b/source/Irrlicht/CSceneManager.cpp @@ -48,6 +48,8 @@ #include "CDefaultSceneNodeFactory.h" +#include "CSceneCollisionManager.h" + #include 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 882a7049..e7e6ce35 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 CameraList; core::array SkyBoxList;