diff options
Diffstat (limited to 'hammer/gizmo.cpp')
| -rw-r--r-- | hammer/gizmo.cpp | 355 |
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 ); +} + |