You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
401 lines
14 KiB
401 lines
14 KiB
//========= 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
|
|
|