summaryrefslogtreecommitdiff
path: root/gameui/HapticControlBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/HapticControlBox.cpp')
-rw-r--r--gameui/HapticControlBox.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/gameui/HapticControlBox.cpp b/gameui/HapticControlBox.cpp
new file mode 100644
index 0000000..10a240f
--- /dev/null
+++ b/gameui/HapticControlBox.cpp
@@ -0,0 +1,191 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#include "HapticControlBox.h"
+#include <vgui_controls/Controls.h>
+#include <vgui_controls/Panel.h>
+#include "cvarslider.h"
+#include "mathlib/vmatrix.h"
+#include <vgui/ISurface.h>
+#include "KeyValues.h"
+#include <vgui/ISystem.h>
+ControlBoxVisual::ControlBoxVisual(vgui::Panel *parent,const char *panelName, CCvarSlider *n, CCvarSlider *r, CCvarSlider *u, CCvarSlider *f, CCvarSlider *l, CCvarSlider *d) :
+BaseClass(parent,panelName)
+{
+ m_iMouseOver = -1;
+ m_flTime=0;
+
+ //disable mouse input.
+ SetMouseInputEnabled(false);
+
+ SlideValues = new CCvarSliderCube(n, r, u, f, l, d);
+
+ SlideValues->Down->AddActionSignalTarget(GetVPanel());
+ SlideValues->Far->AddActionSignalTarget(GetVPanel());
+ SlideValues->Up->AddActionSignalTarget(GetVPanel());
+ SlideValues->Near->AddActionSignalTarget(GetVPanel());
+ SlideValues->Left->AddActionSignalTarget(GetVPanel());
+ SlideValues->Right->AddActionSignalTarget(GetVPanel());
+ SetWide(64);
+ SetTall(64);
+}
+
+void ControlBoxVisual::OnSlideEnter(KeyValues*data)
+{
+ vgui::VPANEL fromPanel = data->GetInt("VPANEL");
+ if(fromPanel == SlideValues->Up->GetVPanel())
+ m_iMouseOver = HUI_BOX_UP;
+ else if(fromPanel == SlideValues->Down->GetVPanel())
+ m_iMouseOver = HUI_BOX_DOWN;
+ else if(fromPanel == SlideValues->Right->GetVPanel())
+ m_iMouseOver = HUI_BOX_RIGHT;
+ else if(fromPanel == SlideValues->Left->GetVPanel())
+ m_iMouseOver = HUI_BOX_LEFT;
+ else if(fromPanel == SlideValues->Far->GetVPanel())
+ m_iMouseOver = HUI_BOX_FAR;
+ else if(fromPanel == SlideValues->Near->GetVPanel())
+ m_iMouseOver = HUI_BOX_NEAR;
+}
+void ControlBoxVisual::OnSlideExit(KeyValues*data)
+{
+ //vgui::VPANEL fromPanel = data->GetInt("VPANEL");
+ m_iMouseOver=-1;
+}
+void ControlBoxVisual::Paint()
+{
+ m_flTime = vgui::system()->GetFrameTime();
+ BaseClass::Paint();
+ vgui::surface()->DrawSetColor(0,0,0,255);
+ DrawCube();
+ vgui::surface()->DrawSetColor(255,255,255,255);
+
+ //first draw the cube once.
+ DrawCube( SlideValues->Near->GetSliderValue()*-1,
+ SlideValues->Right->GetSliderValue()*-1,
+ SlideValues->Up->GetSliderValue()*-1,
+ SlideValues->Far->GetSliderValue(),
+ SlideValues->Left->GetSliderValue(),
+ SlideValues->Down->GetSliderValue());
+ //then check if we have something selected
+ if(m_iMouseOver!=-1)
+ {
+ vgui::surface()->DrawSetColor(255,0,0,255);
+ // if we do, draw a special cube.
+ DrawCube( SlideValues->Near->GetSliderValue()*-1,
+ SlideValues->Right->GetSliderValue()*-1,
+ SlideValues->Up->GetSliderValue()*-1,
+ SlideValues->Far->GetSliderValue(),
+ SlideValues->Left->GetSliderValue(),
+ SlideValues->Down->GetSliderValue(),
+ m_iMouseOver);
+
+
+ }
+}
+
+void ControlBoxVisual::DrawCube(float n, float r, float u, float f, float l, float d, int specialside)
+{
+
+
+ l*=-1;
+ r*=-1;//flip
+
+
+
+ Vector right[4];
+ //right side
+ right[0]= Vector(f,r,d);
+ right[1]= Vector(f,r,u);
+ right[2]= Vector(n,r,u);
+ right[3]= Vector(n,r,d);
+
+ Vector left[4];
+ //left side
+ left[0]= Vector(f,l,d);
+ left[1]= Vector(f,l,u);
+ left[2]= Vector(n,l,u);
+ left[3]= Vector(n,l,d);
+ //yikes, this is kind of alot of typing.
+ switch(specialside)
+ {
+ case HUI_BOX_UP:
+ left[0] = left[1];
+ left[3] = left[2];
+ left[1] =Vector(1,-1,-1);
+ left[2] =Vector(-1,-1,-1);
+ right[0]= right[1];
+ right[3]= right[2];
+ right[1]=Vector(1,1,-1);
+ right[2]=Vector(-1,1,-1);
+ break;
+ case HUI_BOX_DOWN:
+ left[1] = left[0];
+ left[2] = left[3];
+ left[0] =Vector(1,-1,1);
+ left[3] =Vector(-1,-1,1);
+ right[1] = right[0];
+ right[2] = right[3];
+ right[0] =Vector(1,1,1);
+ right[3] =Vector(-1,1,1);
+ break;
+ case HUI_BOX_LEFT:
+ right[0] = left[0];
+ right[1] = left[1];
+ right[2] = left[2];
+ right[3] = left[3];
+ left[0] =Vector(1,-1,1);
+ left[1] =Vector(1,-1,-1);
+ left[2] =Vector(-1,-1,-1);
+ left[3] =Vector(-1,-1,1);
+ break;
+ case HUI_BOX_RIGHT:
+ left[0] = right[0];
+ left[1] = right[1];
+ left[2] = right[2];
+ left[3] = right[3];
+ right[0] =Vector(1,1,1);
+ right[1] =Vector(1,1,-1);
+ right[2] =Vector(-1,1,-1);
+ right[3] =Vector(-1,1,1);
+ break;
+ case HUI_BOX_FAR:
+ left[3] = left[0];
+ left[2] = left[1];
+ left[0] =Vector(1,-1,1);
+ left[1] =Vector(1,-1,-1);
+ right[3] = right[0];
+ right[2] = right[1];
+ right[0] =Vector(1,1,1);
+ right[1] =Vector(1,1,-1);
+ break;
+ case HUI_BOX_NEAR:
+ left[0] = left[3];
+ left[1] = left[2];
+ left[3] =Vector(-1,-1,1);
+ left[2] =Vector(-1,-1,-1);
+ right[0] = right[3];
+ right[1] = right[2];
+ right[3] =Vector(-1,1,1);
+ right[2] =Vector(-1,1,-1);
+ break;
+ default:
+ break;
+ }
+
+ Vector pos = Vector(0,0.25 + sin(m_flTime),0.5);
+ VMatrix Project = SetupMatrixProjection(pos,VPlane(Vector(1,0,0),-3));
+ Vector vdrawsize = Vector(1,(float)GetWide()/10.0f,(float)GetTall()/10.0f);
+ for(int i=0;i!=4;i++)
+ {
+ right[i] = Project.VMul3x3(right[i])*vdrawsize;
+ left[i] = Project.VMul3x3(left[i])*vdrawsize;
+ }
+ vdrawsize *=5;
+ for(int i = 0;i!=4;i++)
+ {
+ int next = i+1;
+ if(next>3)
+ next = 0;
+ vgui::surface()->DrawLine(vdrawsize.y+left[i].y,vdrawsize.z+left[i].z,vdrawsize.y+left[next].y,vdrawsize.z+left[next].z);
+ vgui::surface()->DrawLine(vdrawsize.y+right[i].y,vdrawsize.z+right[i].z,vdrawsize.y+right[next].y,vdrawsize.z+right[next].z);
+ vgui::surface()->DrawLine(vdrawsize.y+left[i].y,vdrawsize.z+left[i].z,vdrawsize.y+right[i].y,vdrawsize.z+right[i].z);
+ }
+} \ No newline at end of file