diff options
Diffstat (limited to 'public/matsys_controls/manipulator.h')
| -rw-r--r-- | public/matsys_controls/manipulator.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/public/matsys_controls/manipulator.h b/public/matsys_controls/manipulator.h new file mode 100644 index 0000000..f030509 --- /dev/null +++ b/public/matsys_controls/manipulator.h @@ -0,0 +1,129 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef MANIPULATOR_H +#define MANIPULATOR_H +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Panel.h" +#include "mathlib/vector.h" + +//----------------------------------------------------------------------------- +// Manipulator interface +//----------------------------------------------------------------------------- +class IManipulator +{ +public: + virtual ~IManipulator(){} + virtual void OnBeginManipulation( void ) = 0; + virtual void OnAcceptManipulation( void ) = 0; + virtual void OnCancelManipulation( void ) = 0; + + virtual void OnTick( void ) = 0; + + virtual void OnCursorMoved( int x, int y ) = 0; + virtual void OnMousePressed( vgui::MouseCode code, int x, int y ) = 0; + virtual void OnMouseReleased( vgui::MouseCode code, int x, int y ) = 0; + virtual void OnMouseWheeled( int delta ) = 0; + + virtual void SetViewportSize( int w, int h ) = 0; +}; + + +//----------------------------------------------------------------------------- +// Base class helper for implementing manipulators +//----------------------------------------------------------------------------- +class CBaseManipulator : public IManipulator +{ +public: + CBaseManipulator() + { + m_nViewport[ 0 ] = m_nViewport[ 1 ] = 0; + } + + virtual void OnTick( void ) {}; + + virtual void OnBeginManipulation( void ) {} + virtual void OnAcceptManipulation( void ) {}; + virtual void OnCancelManipulation( void ) {}; + + virtual void OnCursorMoved( int x, int y ) {}; + virtual void OnMousePressed( vgui::MouseCode code, int x, int y ) {}; + virtual void OnMouseReleased( vgui::MouseCode code, int x, int y ) {}; + virtual void OnMouseWheeled( int delta ) {}; + + virtual void SetViewportSize( int w, int h ) + { + m_nViewport[ 0 ] = w; + m_nViewport[ 1 ] = h; + } + +protected: + int m_nViewport[ 2 ]; +}; + + +//----------------------------------------------------------------------------- +// Base class for manipulators which operate on transforms +//----------------------------------------------------------------------------- +class CTransformManipulator : public CBaseManipulator +{ +public: + CTransformManipulator( matrix3x4_t *pTransform ); + + void SetTransform( matrix3x4_t *transform ); + matrix3x4_t *GetTransform(); + +protected: + matrix3x4_t *m_pTransform; +}; + + +//----------------------------------------------------------------------------- +// Standard maya-like transform manipulator +//----------------------------------------------------------------------------- +class CPotteryWheelManip : public CTransformManipulator +{ +public: + CPotteryWheelManip( matrix3x4_t *pTransform ); + + virtual void OnBeginManipulation( void ); + virtual void OnAcceptManipulation( void ); + virtual void OnCancelManipulation( void ); + + virtual void OnTick( void ); + + virtual void OnCursorMoved( int x, int y ); + virtual void OnMousePressed( vgui::MouseCode code, int x, int y ); + virtual void OnMouseReleased( vgui::MouseCode code, int x, int y ); + virtual void OnMouseWheeled( int delta ); + + // Sets the zoom level + void SetZoom( float flZoom ); + +protected: + int m_lastx, m_lasty; + + float m_zoom; + float m_altitude, m_azimuth; + //vec3 m_lookat + + float m_prevZoom; + float m_prevAltitude, m_prevAzimuth; + + float m_flLastMouseTime; + float m_flLastTickTime; + float m_flSpin; + bool m_bSpin; + + void UpdateTransform( void ); + void UpdateZoom( float delta ); +}; + + +#endif // MANIPULATOR_H |