source-engine/hammer/tooldisplace.h

402 lines
14 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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