--- /dev/null
+// 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
class IMesh;\r
class IMeshBuffer;\r
class IMeshCache;\r
+ class ISceneCollisionManager;\r
class IMeshLoader;\r
class IMeshManipulator;\r
class IMeshSceneNode;\r
\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
#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
CDummyTransformationSceneNode.cpp
CEmptySceneNode.cpp
CMeshManipulator.cpp
+ CSceneCollisionManager.cpp
CSceneManager.cpp
CMeshCache.cpp
CDefaultSceneNodeFactory.cpp
--- /dev/null
+// 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
--- /dev/null
+// 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
\r
#include "CDefaultSceneNodeFactory.h"\r
\r
+#include "CSceneCollisionManager.h"\r
+\r
#include <locale.h>\r
\r
namespace irr\r
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
if (CursorControl)\r
CursorControl->drop();\r
\r
+ if (CollisionManager)\r
+ CollisionManager->drop();\r
+\r
if (GUIEnvironment)\r
GUIEnvironment->drop();\r
\r
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
//! 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
//! 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