OpenBarnyard
 
Loading...
Searching...
No Matches
AGUI2MouseCursor.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "AGUI2MouseCursor.h"
4#include "AGUI2.h"
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include <Core/TMemoryDebugOn.h>
11
13
15{
16 m_MousePos.x = 0.0f;
17 m_MousePos.y = 0.0f;
18 m_CursorCenter = { 0.0f, 0.0f };
19 m_pMouseDevice = TNULL;
20 m_pPointerUpSection = TNULL;
21 m_pPointerDownSection = TNULL;
22 m_fCursorAccelerations[ Acceleration_Off ] = 1.0f;
23 m_fCursorAccelerations[ Acceleration_Slow ] = 10.0f;
24 m_fCursorAccelerations[ Acceleration_Fast ] = 20.0f;
25 m_eAccelerationType = Acceleration_Fast;
26 m_RadialFieldPos = TVector2::VEC_ZERO;
27 m_fRadialRadius = -1.0f;
28}
29
30TBOOL AGUI2MouseCursor::Create( const TCHAR* a_szPointerUpTexture, const TCHAR* a_szPointerDownTexture, TFLOAT a_fScalar )
31{
33
34 if ( m_pMouseDevice == TNULL )
35 {
36 return TFALSE;
37 }
38
39 m_pPointerUpSection = AGUI2TextureSectionManager::GetTextureSection( a_szPointerUpTexture );
40 TFLOAT fCursorWidth = m_pPointerUpSection->GetWidth();
41 TFLOAT fCursorHeight = m_pPointerUpSection->GetHeight();
42
43 AGUI2Rectangle::SetDimensions( fCursorWidth, fCursorHeight );
44 AGUI2Element::GetTransform().Scale( a_fScalar, a_fScalar );
45 AGUI2Rectangle::SetTextureSection( m_pPointerUpSection );
47 m_CursorCenter = { -fCursorWidth / 2, -fCursorHeight / 2 };
48
49 if ( a_szPointerDownTexture )
50 {
51 m_pPointerDownSection = AGUI2TextureSectionManager::GetTextureSection( a_szPointerDownTexture );
52 }
53
56
57 return TTRUE;
58}
59
61{
62 if ( m_pMouseDevice )
63 {
65 m_pMouseDevice->GetAxisFloat( TInputDeviceMouse::AXIS_CURSOR, 0 ),
66 m_pMouseDevice->GetAxisFloat( TInputDeviceMouse::AXIS_CURSOR, 1 )
67 );
68
69 if ( !m_pPointerDownSection || !m_pMouseDevice->IsDown( TInputDeviceMouse::BUTTON_1 ) )
70 {
71 AGUI2Rectangle::SetTextureSection( m_pPointerUpSection );
72 SetDimensions( m_pPointerUpSection->GetWidth(), m_pPointerUpSection->GetHeight() );
73 m_bIsMouseDown = TFALSE;
74 }
75 else
76 {
77 AGUI2Rectangle::SetTextureSection( m_pPointerDownSection );
78 SetDimensions( m_pPointerDownSection->GetWidth(), m_pPointerDownSection->GetHeight() );
79 m_bIsMouseDown = TTRUE;
80 }
81
82 AGUI2Element::GetTransform().SetTranslation( m_MousePos.x, m_MousePos.y );
83
84 AGUI2Transform oScreenTransform;
85 GetScreenTransform( oScreenTransform );
86 oScreenTransform.Transform( m_CursorPos, m_CursorCenter );
87 }
88
89 return;
90}
91
92void AGUI2MouseCursor::MoveCursor( TFLOAT a_fDeltaX, TFLOAT a_fDeltaY )
93{
94 TFLOAT fCursorAccelerationX;
95 TFLOAT fCursorAccelerationY;
96
97 // X
98 fCursorAccelerationX = 1.0f;
99
100 if ( m_eAccelerationType != Acceleration_Fast || TMath::Abs( a_fDeltaX ) <= m_fCursorAccelerations[ Acceleration_Fast ] )
101 {
102 if ( m_eAccelerationType != Acceleration_Off && m_fCursorAccelerations[ Acceleration_Slow ] < TMath::Abs( a_fDeltaX ) )
103 {
104 fCursorAccelerationX = 2.0f;
105 }
106 }
107 else
108 {
109 fCursorAccelerationX = 4.0f;
110 }
111
112 // Y
113 fCursorAccelerationY = 1.0f;
114
115 if ( m_eAccelerationType != Acceleration_Off && m_fCursorAccelerations[ Acceleration_Slow ] < TMath::Abs( a_fDeltaY ) )
116 {
117 fCursorAccelerationY = 4.0f;
118 }
119
120 if ( m_eAccelerationType == Acceleration_Fast && m_fCursorAccelerations[ Acceleration_Fast ] < TMath::Abs( a_fDeltaY ) )
121 {
122 fCursorAccelerationY = 4.0f;
123 }
124
125 m_MousePos.x += fCursorAccelerationX * a_fDeltaX * m_fCursorAccelerations[ Acceleration_Off ];
126 m_MousePos.y += fCursorAccelerationY * a_fDeltaY * m_fCursorAccelerations[ Acceleration_Off ];
127
128 TFLOAT fMinsX, fMinsY;
129 TFLOAT fMaxsX, fMaxsY;
130 AGUI2::GetRootElement()->GetMins( fMinsX, fMinsY );
131 AGUI2::GetRootElement()->GetMaxs( fMaxsX, fMaxsY );
132
133 if ( m_MousePos.x < fMinsX ) m_MousePos.x = fMinsX;
134 if ( m_MousePos.x > fMaxsX ) m_MousePos.x = fMaxsX;
135 if ( m_MousePos.y < fMinsY ) m_MousePos.y = fMinsY;
136 if ( m_MousePos.y > fMaxsY ) m_MousePos.y = fMaxsY;
137
138 if ( m_fRadialRadius != -1.0f )
139 {
140 Toshi::TVector2 vec = m_MousePos - m_RadialFieldPos;
141
142 if ( m_fRadialRadius < vec.Magnitude() )
143 {
144 vec.Normalize();
145 m_MousePos.x = vec.x * m_fRadialRadius + m_RadialFieldPos.x;
146 m_MousePos.y = vec.y * m_fRadialRadius + m_RadialFieldPos.y;
147 }
148 }
149}
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
char TCHAR
Definition Typedefs.h:20
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
@ AGUI2ATTACHMENT_TOPLEFT
@ AGUI2ATTACHMENT_MIDDLECENTER
TFORCEINLINE TFLOAT Abs(TFLOAT fVal)
Definition TMathInline.h:63
TInputDevice * GetDeviceByIndex(TClass *a_pClass, TUINT a_uiIndex)
constinit static const TVector2 VEC_ZERO
Definition TVector2.h:132
static TFORCEINLINE TInputInterface * GetSingleton()
Definition TSingleton.h:49
static AGUI2Element * GetRootElement()
Definition AGUI2.h:31
AGUI2Transform & GetTransform()
void AddChildTail(AGUI2Element &a_rElement)
virtual void GetMaxs(TFLOAT &a_fX, TFLOAT &a_fY)
void SetAttachment(AGUI2ATTACHMENT a_eAnchor, AGUI2ATTACHMENT a_ePivot)
virtual void GetMins(TFLOAT &a_fX, TFLOAT &a_fY)
void GetScreenTransform(AGUI2Transform &a_rOutTransform)
virtual void SetDimensions(TFLOAT a_fWidth, TFLOAT a_fHeight)
TBOOL Create(const TCHAR *a_szPointerUpTexture, const TCHAR *a_szPointerDownTexture, TFLOAT a_fScalar)
void MoveCursor(TFLOAT a_fDeltaX, TFLOAT a_fDeltaY)
void SetTextureSection(AGUI2TextureSection *a_pTexSection)
Sets material and UVs from AGUI2TextureSection.
static AGUI2TextureSection * GetTextureSection(const TCHAR *a_szSectionName)
void Transform(Toshi::TVector2 &a_rOutVec, const Toshi::TVector2 &a_rTransformVec) const
constexpr void SetTranslation(TFLOAT a_fX, TFLOAT a_fY)
void Scale(TFLOAT a_fScaleX, TFLOAT a_fScaleY)