diff options
Diffstat (limited to 'gameui/HapticControlBox.cpp')
| -rw-r--r-- | gameui/HapticControlBox.cpp | 191 |
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 |