//========= 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