]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/CSceneCollisionManager.cpp
Readd CSceneCollisionManager with only the method we need
[irrlicht.git] / source / Irrlicht / CSceneCollisionManager.cpp
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
4 \r
5 #include "CSceneCollisionManager.h"\r
6 #include "ICameraSceneNode.h"\r
7 #include "SViewFrustum.h"\r
8 \r
9 #include "os.h"\r
10 #include "irrMath.h"\r
11 \r
12 namespace irr\r
13 {\r
14 namespace scene\r
15 {\r
16 \r
17 //! constructor\r
18 CSceneCollisionManager::CSceneCollisionManager(ISceneManager* smanager, video::IVideoDriver* driver)\r
19 : SceneManager(smanager), Driver(driver)\r
20 {\r
21         #ifdef _DEBUG\r
22         setDebugName("CSceneCollisionManager");\r
23         #endif\r
24 \r
25         if (Driver)\r
26                 Driver->grab();\r
27 }\r
28 \r
29 \r
30 //! destructor\r
31 CSceneCollisionManager::~CSceneCollisionManager()\r
32 {\r
33         if (Driver)\r
34                 Driver->drop();\r
35 }\r
36 \r
37 \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
41 {\r
42         core::line3d<f32> ln(0,0,0,0,0,0);\r
43 \r
44         if (!SceneManager)\r
45                 return ln;\r
46 \r
47         if (!camera)\r
48                 camera = SceneManager->getActiveCamera();\r
49 \r
50         if (!camera)\r
51                 return ln;\r
52 \r
53         const scene::SViewFrustum* f = camera->getViewFrustum();\r
54 \r
55         core::vector3df farLeftUp = f->getFarLeftUp();\r
56         core::vector3df lefttoright = f->getFarRightUp() - farLeftUp;\r
57         core::vector3df uptodown = f->getFarLeftDown() - farLeftUp;\r
58 \r
59         const core::rect<s32>& viewPort = Driver->getViewPort();\r
60         core::dimension2d<u32> screenSize(viewPort.getWidth(), viewPort.getHeight());\r
61 \r
62         f32 dx = pos.X / (f32)screenSize.Width;\r
63         f32 dy = pos.Y / (f32)screenSize.Height;\r
64 \r
65         if (camera->isOrthogonal())\r
66                 ln.start = f->cameraPosition + (lefttoright * (dx-0.5f)) + (uptodown * (dy-0.5f));\r
67         else\r
68                 ln.start = f->cameraPosition;\r
69 \r
70         ln.end = farLeftUp + (lefttoright * dx) + (uptodown * dy);\r
71 \r
72         return ln;\r
73 }\r
74 \r
75 } // end namespace scene\r
76 } // end namespace irr\r