1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
\r
2 // This file is part of the "Irrlicht Engine".
\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
\r
5 #include "CSceneCollisionManager.h"
\r
6 #include "ICameraSceneNode.h"
\r
7 #include "SViewFrustum.h"
\r
10 #include "irrMath.h"
\r
18 CSceneCollisionManager::CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver)
\r
19 : SceneManager(smanager), Driver(driver)
\r
22 setDebugName("CSceneCollisionManager");
\r
31 CSceneCollisionManager::~CSceneCollisionManager()
\r
38 //! Returns a 3d ray which would go through the 2d screen coordinates.
\r
39 core::line3d<f32> CSceneCollisionManager::getRayFromScreenCoordinates(
\r
40 const core::position2d<s32> & pos, const ICameraSceneNode* camera)
\r
42 core::line3d<f32> ln(0,0,0,0,0,0);
\r
48 camera = SceneManager->getActiveCamera();
\r
53 const scene::SViewFrustum* f = camera->getViewFrustum();
\r
55 core::vector3df farLeftUp = f->getFarLeftUp();
\r
56 core::vector3df lefttoright = f->getFarRightUp() - farLeftUp;
\r
57 core::vector3df uptodown = f->getFarLeftDown() - farLeftUp;
\r
59 const core::rect<s32>& viewPort = Driver->getViewPort();
\r
60 core::dimension2d<u32> screenSize(viewPort.getWidth(), viewPort.getHeight());
\r
62 f32 dx = pos.X / (f32)screenSize.Width;
\r
63 f32 dy = pos.Y / (f32)screenSize.Height;
\r
65 if (camera->isOrthogonal())
\r
66 ln.start = f->cameraPosition + (lefttoright * (dx-0.5f)) + (uptodown * (dy-0.5f));
\r
68 ln.start = f->cameraPosition;
\r
70 ln.end = farLeftUp + (lefttoright * dx) + (uptodown * dy);
\r
75 } // end namespace scene
\r
76 } // end namespace irr
\r