This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

118 lines
3.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef MANIPULATOR_H
#define MANIPULATOR_H
#ifdef _WIN32
#pragma once
#endif
#include "mathlib/vector.h"
#include "vgui_controls/Panel.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