khanat-opennel-code/code/nel/tools/3d/zviewer/move_listener.h

221 lines
3.9 KiB
C++

// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_MOVE_LISTENER_H
#define NL_MOVE_LISTENER_H
#include <nel/misc/types_nl.h>
#include <nel/misc/time_nl.h>
#include <nel/misc/event_listener.h>
#include <nel/misc/matrix.h>
#include <nel/3d/viewport.h>
#include <nel/3d/scene.h>
#include <nel/3d/camera.h>
#include <nel/3d/driver.h>
namespace NL3D
{
/**
* CMoveListener is a listener that handle a 3d matrix with mouse events.
* \author Stephane Coutelas
* \author Nevrax France
* \date 2000
*/
class CMoveListener : public NLMISC::IEventListener
{
public :
/**
* TMoveMode.
* moving modes
*/
enum TMoveMode
{
WALK,
FREE
};
private:
/// Internal use
virtual void operator()(const NLMISC::CEvent& event);
/// moving mode
TMoveMode _Mode;
/// view matrix
NLMISC::CMatrix _ViewMatrix;
/// viewport
NL3D::CViewport _Viewport;
/// true if first setMousePos done
bool _CursorInit;
CScene * _Scene;
/// screen width
uint _Width;
/// screen height
uint _Height;
///frustum parameters
float _Top;
float _Bottom;
float _Left;
float _Right;
float _Depth;
/// current position
CVector _Pos;
/// eyes height
float _EyesHeight;
///current rotation z angle
float _RotZ;
///current rotation x angle
float _RotX;
/// last local time measured
NLMISC::TTime _LastTime;
/// current local time
NLMISC::TTime _CurrentTime;
/// step for translation
float _TransSpeed;
/// step for rotation
float _RotSpeed;
/// false if mouse is use to move
bool _MouseFree;
public:
/**
* Constructor.
* You should call init then.
*/
CMoveListener();
/**
* Constructor.
* You should call init then.
* \param scene the scene
* \param w screen width in pixels
* \param h screen height in pixels
* \param camera the camera
*/
void init(CScene * scene, uint w, uint h, const class CCamera& camera)
{
_Scene = scene;
_Width = w;
_Height = h;
_Viewport = scene->getViewport();
float dummy;
_ViewMatrix = camera.getMatrix ();
camera.getFrustum (_Left, _Right, _Bottom, _Top, _Depth, dummy);
}
/**
* Set the moving mode
* \param m the moving mode
*/
void setMode(TMoveMode m)
{
_Mode = m;
}
void swapMode()
{
if(_Mode==WALK)
{
_Mode = FREE;
}
else
{
_Mode = WALK;
}
}
TMoveMode getMode() const
{
return _Mode;
}
void changeViewMatrix();
/**
* Register the listener to the server.
*/
void addToServer (NLMISC::CEventServer& server);
/**
* Unregister the listener to the server.
*/
void removeFromServer (NLMISC::CEventServer& server);
void setEyesHeight(float eh) { _EyesHeight = eh; }
float getEyesHeight() const { return _EyesHeight; }
void setPos(CVector pos) { _Pos = pos; }
CVector getPos() const { return _Pos; }
float getRotX() const { return _RotX; }
float getRotZ() const { return _RotZ; }
float getSpeed() const { return _TransSpeed; }
void setLocalTime(NLMISC::TTime time)
{
_LastTime = _CurrentTime;
_CurrentTime = time;
}
void changeControlMode()
{
_MouseFree = ! _MouseFree;
if(_MouseFree)
{
_Scene->getDriver()->showCursor(true);
}
else
{
_Scene->getDriver()->showCursor(false);
}
}
}; // NL3D
}
#endif // NL_MOVE_LISTENER_H
/* End of move_listener.h */