//========= 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