mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Copy irrlichtmt to <root>/irr/
This commit is contained in:
parent
a7908da968
commit
f638482fba
349 changed files with 109124 additions and 0 deletions
74
irr/src/CSceneCollisionManager.cpp
Normal file
74
irr/src/CSceneCollisionManager.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
// 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<f32> CSceneCollisionManager::getRayFromScreenCoordinates(
|
||||
const core::position2d<s32> &pos, const ICameraSceneNode *camera)
|
||||
{
|
||||
core::line3d<f32> 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<s32> &viewPort = Driver->getViewPort();
|
||||
core::dimension2d<u32> 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
|
Loading…
Add table
Add a link
Reference in a new issue