summaryrefslogtreecommitdiff
path: root/hammer/tooldisplace.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/tooldisplace.h')
-rw-r--r--hammer/tooldisplace.h401
1 files changed, 401 insertions, 0 deletions
diff --git a/hammer/tooldisplace.h b/hammer/tooldisplace.h
new file mode 100644
index 0000000..79719cc
--- /dev/null
+++ b/hammer/tooldisplace.h
@@ -0,0 +1,401 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef TOOLDISPLACE_H
+#define TOOLDISPLACE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+//=============================================================================
+
+#include "ToolInterface.h"
+#include "MapDisp.h"
+#include "DispMapImageFilter.h"
+#include "MapFace.h"
+#include "DispPaint.h"
+
+class CMapView3D;
+
+//=============================================================================
+
+#define DISPTOOL_NONE 0
+#define DISPTOOL_SELECT 1
+#define DISPTOOL_PAINT 2
+#define DISPTOOL_SELECT_DISP_FACE 3
+#define DISPTOOL_TAG_WALKABLE 4
+#define DISPTOOL_TAG_BUILDABLE 5
+#define DISPTOOL_TAG_REMOVE 6
+#define DISPTOOL_PAINT_SCULPT 7
+
+#define DISPPAINT_EFFECT_RAISELOWER 0
+#define DISPPAINT_EFFECT_RAISETO 1
+#define DISPPAINT_EFFECT_SMOOTH 2
+#define DISPPAINT_EFFECT_MODULATE 3
+
+#define DISPPAINT_AXIS_X 0
+#define DISPPAINT_AXIS_Y 1
+#define DISPPAINT_AXIS_Z 2
+#define DISPPAINT_AXIS_SUBDIV 3
+#define DISPPAINT_AXIS_FACE 4
+
+#define DISPPAINT_BRUSHTYPE_SOFT 0
+#define DISPPAINT_BRUSHTYPE_HARD 1
+
+class CSculptTool;
+
+//=============================================================================
+//
+// Displacement Tool Class
+//
+class CToolDisplace : public CBaseTool
+{
+public:
+
+ //=========================================================================
+ //
+ // Constructor/Deconstructor
+ //
+ CToolDisplace();
+ ~CToolDisplace();
+
+ //=========================================================================
+ //
+ // CBaseTool implementation.
+ //
+ virtual void OnActivate();
+ virtual void OnDeactivate();
+ virtual ToolID_t GetToolID(void) { return TOOL_FACEEDIT_DISP; }
+
+ virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
+ virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
+ virtual bool OnRMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
+ virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
+ virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
+
+ virtual void RenderTool3D( CRender3D *pRender );
+
+ //=========================================================================
+ //
+ // Attribute Functions
+ //
+ inline void SetTool( unsigned int uiTool );
+ inline unsigned int GetTool( void );
+ inline void SetEffect( unsigned int uiEffect );
+ inline unsigned int GetEffect( void );
+
+ inline void SetBrushType( unsigned int uiBrushType ) { m_uiBrushType = uiBrushType; }
+ inline unsigned int GetBrushType( void ) { return m_uiBrushType; }
+
+ inline void SetChannel( int iType, float flValue );
+ inline void GetChannel( int iType, float &flValue );
+
+ inline void SetPaintAxis( int iType, Vector const &vecAxis );
+ inline void GetPaintAxis( int &iType, Vector &vecAxis );
+
+ inline CDispMapImageFilterManager *GetFilterRaiseLowerMgr( void );
+ inline CDispMapImageFilterManager *GetFilterRaiseToMgr( void );
+ inline CDispMapImageFilterManager *GetFilterSmoothMgr( void );
+
+ inline void SetSculptPainter( CSculptTool *Painter ) { m_SculptTool = Painter; }
+ inline CSculptTool *GetSculptPainter( void ) { return m_SculptTool; }
+
+ // flags
+ inline bool GetAutoSew( void );
+ inline void ToggleAutoSew( void );
+
+ inline bool IsNudging( void );
+
+ inline void SetSelectMask( bool bSelect );
+ inline void ToggleSelectMask( void );
+ inline bool HasSelectMask( void );
+ inline void SetGridMask( bool bGrid );
+ inline void ToggleGridMask( void );
+ inline bool HasGridMask( void );
+
+ //=========================================================================
+ //
+ // Spatial Painting
+ //
+ inline void ToggleSpatialPainting( void );
+ inline bool IsSpatialPainting( void );
+
+ inline void SetSpatialRadius( float flRadius );
+ inline float GetSpatialRadius( void );
+
+protected:
+
+ void ApplyPaintTool( UINT nFlags, const Vector2D &vPoint, CMapDisp *pDisp );
+ void ApplySpatialPaintTool( UINT nFlags,const Vector2D &vPoint, CMapDisp *pDisp );
+ void ApplySculptSpatialPaintTool( CMapView3D *pView, UINT nFlags,const Vector2D &vPoint );
+ void LiftFaceNormal( CMapView3D *pView, const Vector2D &vPoint );
+ void ResizeSpatialRadius_Activate( CMapView3D *pView );
+ void ResizeSpatialRadius_Do( void );
+ void ResizeSpatialRadius_Deactivate( void );
+
+ void Nudge_Activate( CMapView3D *pView, EditDispHandle_t dispHandle );
+ void Nudge_Deactivate( void );
+ void Nudge_Do( void );
+
+ void HandleSelection( CMapView3D *pView, const Vector2D &vPoint );
+ EditDispHandle_t GetHitPos( CMapView3D *pView, const Vector2D &vPoint );
+ inline CMapDisp *GetEditDisp( void );
+
+ void HandleTagging( CMapView3D *pView, const Vector2D &vPoint );
+ void HandleTaggingRemove( CMapDisp *pDisp, int nTriIndex );
+ void HandleTaggingReset( CMapView3D *pView, const Vector2D &vPoint );
+
+private:
+
+ void AddFiltersToManagers( void );
+ bool LoadFilters( const char *filename );
+ static ChunkFileResult_t LoadFiltersCallback( CChunkFile *pFile, CToolDisplace *pDisplaceTool );
+
+ int GetSelectedDisps( void );
+ EditDispHandle_t CollideWithSelectedDisps( const Vector &rayStart, const Vector &rayEnd );
+ bool RayAABBTest( CMapDisp *pDisp, const Vector &rayStart, const Vector &rayEnd );
+ void BuildParallelepiped( const Vector &boxMin, const Vector &boxMax, PLANE planes[6] );
+ bool RayPlaneTest( PLANE *pPlane, const Vector& rayStart, const Vector& rayEnd /*, float *fraction*/ );
+ float DistFromPointToRay( const Vector& rayStart, const Vector& rayEnd, const Vector& point );
+
+ inline void UpdateMapViews( CMapView3D *pView );
+ inline void CalcViewCenter( CMapView3D *pView );
+
+ void RenderPaintSphere( CRender3D *pRender );
+ void RenderHitBox( CRender3D *pRender );
+
+protected:
+
+ unsigned int m_uiTool; // active displacement tool
+ unsigned int m_uiEffect; // active displacement effect
+ unsigned int m_uiBrushType; // active brush type (soft, hard edged)
+
+ CDispMapImageFilterManager m_FilterLoaderMgr; // load all the filters into this manager initially
+ CDispMapImageFilterManager m_FilterRaiseLowerMgr; // filter manager for raise/lower filters
+ CDispMapImageFilterManager m_FilterRaiseToMgr; // filter manager for raise to filters
+ CDispMapImageFilterManager m_FilterSmoothMgr; // filter manager for smoothing filters
+
+ int m_iPaintChannel; // the paint channel - distance, alpha, etc...
+ float m_flPaintValueGeo; // the paint value - scalar distance
+ float m_flPaintValueData; // the paint value - scalar alpha, etc...
+ int m_iPaintAxis; // the paint axis type xyz-axis, subdiv normal, face normal
+ Vector m_vecPaintAxis; // the paint axis vector (for subdiv and face normal)
+
+ bool m_bAutoSew; // is the auto-sew functionality enabled
+ bool m_bSpatial; // painting spatially - set spatial default
+ float m_flSpatialRadius; // spatial painting radius
+ bool m_bSpatialRadius; // adjust the spatial radius
+
+ bool m_bSelectMaskTool; // show the "red" selection state (true/false)
+ bool m_bGridMaskTool; // show the displacement overlay (true/false)
+
+ bool m_bNudge; // special painting style
+ bool m_bNudgeInit;
+ EditDispHandle_t m_EditDispHandle; // displacement currently being nudged or painted on
+ CPoint m_viewCenter; // center point of the given view
+
+ Vector2D m_MousePoint;
+ bool m_bLMBDown; // left mouse button state
+ bool m_bRMBDown; // right mouse button state
+ CDispPaintMgr m_DispPaintMgr; // displacement painting manager
+ CSculptTool *m_SculptTool;
+};
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetTool( unsigned int uiTool )
+{
+ m_uiTool = uiTool;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline unsigned int CToolDisplace::GetTool( void )
+{
+ return m_uiTool;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetEffect( unsigned int uiEffect )
+{
+ m_uiEffect = uiEffect;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline unsigned int CToolDisplace::GetEffect( void )
+{
+ return m_uiEffect;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetChannel( int iType, float flValue )
+{
+ m_iPaintChannel = iType;
+ if ( iType == DISPPAINT_CHANNEL_POSITION )
+ {
+ m_flPaintValueGeo = flValue;
+ }
+ else if ( iType == DISPPAINT_CHANNEL_ALPHA )
+ {
+ m_flPaintValueData = flValue;
+ }
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::GetChannel( int iType, float &flValue )
+{
+ if ( iType == DISPPAINT_CHANNEL_POSITION )
+ {
+ flValue = m_flPaintValueGeo;
+ }
+ else if ( iType == DISPPAINT_CHANNEL_ALPHA )
+ {
+ flValue = m_flPaintValueData;
+ }
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetPaintAxis( int iType, Vector const &vecAxis )
+{
+ m_iPaintAxis = iType;
+ m_vecPaintAxis = vecAxis;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::GetPaintAxis( int &iType, Vector &vecAxis )
+{
+ iType = m_iPaintAxis;
+ vecAxis = m_vecPaintAxis;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline CDispMapImageFilterManager *CToolDisplace::GetFilterRaiseLowerMgr( void )
+{
+ return &m_FilterRaiseLowerMgr;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline CDispMapImageFilterManager *CToolDisplace::GetFilterRaiseToMgr( void )
+{
+ return &m_FilterRaiseToMgr;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline CDispMapImageFilterManager *CToolDisplace::GetFilterSmoothMgr( void )
+{
+ return &m_FilterSmoothMgr;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline bool CToolDisplace::GetAutoSew( void )
+{
+ return m_bAutoSew;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::ToggleAutoSew( void )
+{
+ m_bAutoSew = !m_bAutoSew;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline bool CToolDisplace::IsNudging( void )
+{
+ return m_bNudge;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetSelectMask( bool bSelect )
+{
+ m_bSelectMaskTool = bSelect;
+ CMapDisp::SetSelectMask( m_bSelectMaskTool );
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::ToggleSelectMask( void )
+{
+ m_bSelectMaskTool = !m_bSelectMaskTool;
+ CMapDisp::SetSelectMask( m_bSelectMaskTool );
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline bool CToolDisplace::HasSelectMask( void )
+{
+ return m_bSelectMaskTool;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::SetGridMask( bool bGrid )
+{
+ m_bGridMaskTool = bGrid;
+ CMapDisp::SetGridMask( m_bGridMaskTool );
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline void CToolDisplace::ToggleGridMask( void )
+{
+ m_bGridMaskTool = !m_bGridMaskTool;
+ CMapDisp::SetGridMask( m_bGridMaskTool );
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+inline bool CToolDisplace::HasGridMask( void )
+{
+ return m_bGridMaskTool;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Returns the displacement that we are working on, based on the last
+// button down event that we received..
+//-----------------------------------------------------------------------------
+inline CMapDisp *CToolDisplace::GetEditDisp( void )
+{
+ // sanity check
+ if ( m_EditDispHandle == EDITDISPHANDLE_INVALID )
+ return NULL;
+
+ return EditDispMgr()->GetDisp( m_EditDispHandle );
+}
+
+
+inline void CToolDisplace::ToggleSpatialPainting( void ) { m_bSpatial = !m_bSpatial; }
+inline bool CToolDisplace::IsSpatialPainting( void ) { return m_bSpatial; }
+
+inline void CToolDisplace::SetSpatialRadius( float flRadius ) { m_flSpatialRadius = flRadius; }
+inline float CToolDisplace::GetSpatialRadius( void ) { return m_flSpatialRadius; }
+
+#endif // TOOLDISPLACE_H