summaryrefslogtreecommitdiff
path: root/hammer/gizmo.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/gizmo.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/gizmo.cpp')
-rw-r--r--hammer/gizmo.cpp355
1 files changed, 355 insertions, 0 deletions
diff --git a/hammer/gizmo.cpp b/hammer/gizmo.cpp
new file mode 100644
index 0000000..b5a6c68
--- /dev/null
+++ b/hammer/gizmo.cpp
@@ -0,0 +1,355 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "stdafx.h"
+#include "BoundBox.h"
+#include "Gizmo.h"
+#include "Render3D.h"
+#include "Resource.h"
+#include "materialsystem/imesh.h"
+#include "TextureSystem.h"
+#include "camera.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+static IEditorTexture* g_pAxisTexture = 0;
+static IEditorTexture* g_pRotateHandleTexture = 0;
+static IEditorTexture* g_pScaleHandleTexture = 0;
+static IEditorTexture* g_pTranslateHandleTexture = 0;
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CGizmo::CGizmo(void)
+{
+ static bool bFirst = true;
+
+ if (bFirst)
+ {
+ g_pAxisTexture = g_Textures.FindActiveTexture("editor/gizmoAxis");
+ g_pRotateHandleTexture = g_Textures.FindActiveTexture("editor/gizmoRotateHandle");
+ g_pScaleHandleTexture = g_Textures.FindActiveTexture("editor/gizmoScaleHandle");
+ g_pTranslateHandleTexture = g_Textures.FindActiveTexture("editor/gizmoTranslateHandle");
+ bFirst = false;
+ }
+
+ Initialize();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : x -
+// y -
+// z -
+//-----------------------------------------------------------------------------
+CGizmo::CGizmo(float x, float y, float z)
+{
+ Initialize();
+
+ m_Position[0] = x;
+ m_Position[1] = y;
+ m_Position[2] = z;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CGizmo::Initialize(void)
+{
+ m_Position[0] = m_Position[1] = m_Position[2] = 0;
+
+ m_fAxisLength = 100;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : ViewPoint -
+// Origin -
+// EndPoint -
+// red -
+// green -
+// blue -
+// Output :
+//-----------------------------------------------------------------------------
+#define GIZMO_AXIS_WIDTH 2
+#define GIZMO_HANDLE_WIDTH 4
+
+void CGizmo::DrawGizmoAxis(CRender3D *pRender, Vector& Origin,
+ Vector& EndPoint, int red, int green, int blue,
+ unsigned int uAxisHandle)
+{
+ CCamera *pCamera = pRender->GetCamera();
+
+ Vector ViewUp;
+ pCamera->GetViewUp(ViewUp);
+
+ Vector ViewPoint;
+ Vector ViewForward;
+ pCamera->GetViewPoint(ViewPoint);
+ VectorSubtract(Origin, ViewPoint, ViewForward);
+
+ Vector Axis;
+ VectorSubtract(EndPoint, Origin, Axis);
+
+ CrossProduct(ViewForward, Axis, ViewUp);
+ VectorNormalize(ViewUp);
+
+ Vector Start;
+ Vector End;
+
+ //
+ // Draw the first segment of the gizmo axis.
+ //
+ VectorMA(Origin, 0.1, Axis, Start);
+ VectorMA(Origin, 0.25, Axis, End);
+
+ pRender->BindTexture( g_pAxisTexture );
+
+ CMeshBuilder meshBuilder;
+
+ CMatRenderContextPtr pRenderContext( MaterialSystemInterface() );
+ IMesh* pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_POLYGON, 4 );
+
+ meshBuilder.TexCoord2f(0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f(0, 2, 0);
+ meshBuilder.Position3f(End[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f(0, 2, 1);
+ meshBuilder.Position3f(End[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f(0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ //
+ // Draw the scale handle.
+ //
+ Start = End;
+ VectorMA(Origin, 0.35, Axis, End);
+
+ pRender->BeginRenderHitTarget(this, uAxisHandle + GIZMO_HANDLE_SCALE);
+
+ pRender->BindTexture( g_pScaleHandleTexture );
+
+ pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_POLYGON, 4 );
+
+ meshBuilder.TexCoord2f( 0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] - ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] - ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 1, 0);
+ meshBuilder.Position3f(End[0] - ViewUp[0] * GIZMO_HANDLE_WIDTH, End[1] - ViewUp[1] * GIZMO_HANDLE_WIDTH, End[2] - ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 1, 1);
+ meshBuilder.Position3f(End[0] + ViewUp[0] * GIZMO_HANDLE_WIDTH, End[1] + ViewUp[1] * GIZMO_HANDLE_WIDTH, End[2] + ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] + ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] + ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ pRender->EndRenderHitTarget();
+
+ //
+ // Draw the second segment of the gizmo axis.
+ //
+ Start = End;
+ VectorMA(Origin, 0.5, Axis, End);
+
+ pRender->BindTexture( g_pAxisTexture );
+
+ pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_POLYGON, 4 );
+
+ meshBuilder.TexCoord2f( 0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 2, 0);
+ meshBuilder.Position3f(End[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.AdvanceVertex();
+ meshBuilder.Color3ub(red, green, blue);
+
+ meshBuilder.TexCoord2f( 0, 2, 1);
+ meshBuilder.Position3f(End[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ //
+ // Draw the rotate handle.
+ //
+ Start = End;
+ VectorMA(Origin, 0.6, Axis, End);
+
+ pRender->BeginRenderHitTarget(this, uAxisHandle + GIZMO_HANDLE_ROTATE);
+
+ pRender->BindTexture( g_pRotateHandleTexture );
+ pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_POLYGON, 4 );
+
+ meshBuilder.TexCoord2f( 0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] - ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] - ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 1, 0);
+ meshBuilder.Position3f(End[0] - ViewUp[0] * GIZMO_HANDLE_WIDTH, End[1] - ViewUp[1] * GIZMO_HANDLE_WIDTH, End[2] - ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 1, 1);
+ meshBuilder.Position3f(End[0] + ViewUp[0] * GIZMO_HANDLE_WIDTH, End[1] + ViewUp[1] * GIZMO_HANDLE_WIDTH, End[2] + ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] + ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] + ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ pRender->EndRenderHitTarget();
+
+ //
+ // Draw the third segment of the gizmo axis.
+ //
+ Start = End;
+ VectorMA(Origin, 0.75, Axis, End);
+
+ pRender->BindTexture( g_pAxisTexture );
+ pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_POLYGON, 4 );
+
+ meshBuilder.TexCoord2f( 0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 2, 0);
+ meshBuilder.Position3f(End[0] - ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] - ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] - ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 2, 1);
+ meshBuilder.Position3f(End[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, End[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, End[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_AXIS_WIDTH, Start[1] + ViewUp[1] * GIZMO_AXIS_WIDTH, Start[2] + ViewUp[2] * GIZMO_AXIS_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ //
+ // Draw the translate handle (arrowhead).
+ //
+ Start = End;
+
+ pRender->BeginRenderHitTarget(this, uAxisHandle + GIZMO_HANDLE_TRANSLATE);
+
+ pRender->BindTexture( g_pTranslateHandleTexture );
+ pMesh = pRenderContext->GetDynamicMesh( );
+ meshBuilder.Begin( pMesh, MATERIAL_TRIANGLES, 1 );
+
+ meshBuilder.TexCoord2f( 0, 0, 0);
+ meshBuilder.Position3f(Start[0] - ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] - ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] - ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 1, 0.5);
+ meshBuilder.Position3f(EndPoint[0], EndPoint[1], EndPoint[2]);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.TexCoord2f( 0, 0, 1);
+ meshBuilder.Position3f(Start[0] + ViewUp[0] * GIZMO_HANDLE_WIDTH, Start[1] + ViewUp[1] * GIZMO_HANDLE_WIDTH, Start[2] + ViewUp[2] * GIZMO_HANDLE_WIDTH);
+ meshBuilder.Color3ub(red, green, blue);
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+
+ pRender->EndRenderHitTarget();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pRender -
+//-----------------------------------------------------------------------------
+void CGizmo::Render(CRender3D *pRender)
+{
+ Vector XAxis( m_Position[0] + m_fAxisLength, m_Position[1], m_Position[2] );
+ Vector YAxis( m_Position[0], m_Position[1] + m_fAxisLength, m_Position[2] );
+ Vector ZAxis( m_Position[0], m_Position[1], m_Position[2] + m_fAxisLength );
+
+ static BoundBox UniformScaleBox;
+ Vector Mins;
+ Vector Maxs;
+ Mins[0] = m_Position[0] - m_fAxisLength * 0.1;
+ Mins[1] = m_Position[1] - m_fAxisLength * 0.1;
+ Mins[2] = m_Position[2] - m_fAxisLength * 0.1;
+ Maxs[0] = m_Position[0] + m_fAxisLength * 0.1;
+ Maxs[1] = m_Position[1] + m_fAxisLength * 0.1;
+ Maxs[2] = m_Position[2] + m_fAxisLength * 0.1;
+ UniformScaleBox.ResetBounds();
+ UniformScaleBox.UpdateBounds(Mins, Maxs);
+
+ pRender->BeginRenderHitTarget(this, GIZMO_HANDLE_UNIFORM_SCALE);
+ //pRender->RenderBox(Mins, Maxs, BoxType_Solid, 200, 200, 200);
+ pRender->EndRenderHitTarget();
+
+ pRender->SetRenderMode( RENDER_MODE_TEXTURED );
+
+ DrawGizmoAxis(pRender, m_Position, XAxis, 255, 0, 0, GIZMO_AXIS_X);
+ DrawGizmoAxis(pRender, m_Position, YAxis, 0, 255, 0, GIZMO_AXIS_Y);
+ DrawGizmoAxis(pRender, m_Position, ZAxis, 0, 0, 255, GIZMO_AXIS_Z);
+
+ pRender->SetRenderMode( RENDER_MODE_DEFAULT );
+}
+