402 lines
14 KiB
C
402 lines
14 KiB
C
|
//========= 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
|