mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 06:06:50 +00:00
384 lines
12 KiB
C++
384 lines
12 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef SCULPTOPTIONS_H
|
|
#define SCULPTOPTIONS_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "disppaint.h"
|
|
#include "afxwin.h"
|
|
|
|
class CMapView3D;
|
|
class CPaintSculptDlg;
|
|
|
|
class CSculptTool
|
|
{
|
|
public:
|
|
CSculptTool();
|
|
~CSculptTool();
|
|
|
|
void SetPaintOwner( CPaintSculptDlg *pOwner ) { m_PaintOwner = pOwner; }
|
|
|
|
virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &SpatialData );
|
|
virtual void RenderTool3D(CRender3D *pRender) = 0;
|
|
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 bool OnLButtonUpDialog(UINT nFlags, CPoint point) { return false; }
|
|
virtual bool OnLButtonDownDialog(UINT nFlags, CPoint point) { return false; }
|
|
virtual bool OnMouseMoveDialog(UINT nFlags, CPoint point) { return false; }
|
|
|
|
protected:
|
|
|
|
// Painting.
|
|
virtual bool PrePaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
virtual bool PostPaint( bool bAutoSew );
|
|
virtual bool DoPaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp ) = 0;
|
|
|
|
bool GetStartingSpot( CMapView3D *pView, const Vector2D &vPoint );
|
|
|
|
bool IsPointInScreenCircle( CMapView3D *pView, CMapDisp *pDisp, CMapDisp *pOrigDisp, int nVertIndex, bool bUseOrigDisplacement = true, bool bUseCurrentPosition = false, float *pflLengthPercent = NULL );
|
|
|
|
void DoPaintSmooth( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
|
|
bool PaintSphereDispBBoxOverlap( const Vector &vCenter, float flRadius, const Vector &vBBoxMin, const Vector &vBBoxMax );
|
|
bool IsInSphereRadius( const Vector &vCenter, float flRadius2, const Vector &vPos, float &flDistance2 );
|
|
float CalcSmoothRadius2( const Vector &vPoint );
|
|
bool DoPaintSmoothOneOverExp( const Vector &vNewCenter, Vector &vPaintPos );
|
|
|
|
void AddToUndo( CMapDisp **pDisp );
|
|
|
|
void DrawDirection( CRender3D *pRender, Vector vDirection, Color Towards, Color Away );
|
|
void DuplicateSelectedDisp( );
|
|
void PrepareDispForPainting( );
|
|
bool FindCollisionIntercept( CCamera *pCamera, const Vector2D &vPoint, bool bUseOrigPosition, Vector &vCollisionPoint, Vector &vCollisionNormal, float &vCollisionIntercept );
|
|
|
|
private:
|
|
void DetermineKeysDown();
|
|
|
|
protected:
|
|
static bool MapDispLessFunc( EditDispHandle_t const &a, EditDispHandle_t const &b )
|
|
{
|
|
return a < b;
|
|
}
|
|
|
|
static CUtlMap<EditDispHandle_t, CMapDisp *> m_OrigMapDisp;
|
|
|
|
Vector m_StartingCollisionPoint, m_StartingCollisionNormal, m_OriginalCollisionPoint, m_OriginalCollisionNormal, m_CurrentCollisionPoint, m_CurrentCollisionNormal;
|
|
float m_StartingCollisionIntercept, m_OriginalCollisionIntercept, m_CurrentCollisionIntercept;
|
|
float m_StartingProjectedRadius, m_OriginalProjectedRadius, m_CurrentProjectedRadius;
|
|
bool m_OriginalCollisionValid, m_CurrentCollisionValid;
|
|
|
|
Vector2D m_MousePoint;
|
|
bool m_bLMBDown; // left mouse button state
|
|
bool m_bRMBDown; // right mouse button state
|
|
bool m_bAltDown, m_bCtrlDown, m_bShiftDown;
|
|
|
|
bool m_ValidPaintingSpot;
|
|
|
|
float m_BrushSize;
|
|
|
|
CPaintSculptDlg *m_PaintOwner;
|
|
|
|
SpatialPaintData_t m_SpatialData;
|
|
};
|
|
|
|
class CSculptPainter : public CSculptTool
|
|
{
|
|
public:
|
|
CSculptPainter();
|
|
~CSculptPainter();
|
|
|
|
virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
|
|
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 );
|
|
|
|
protected:
|
|
virtual bool DoSizing( const Vector2D &vPoint );
|
|
|
|
bool m_InPaintingMode;
|
|
bool m_InSizingMode;
|
|
Vector2D m_StartSizingPoint;
|
|
float m_OrigBrushSize;
|
|
};
|
|
|
|
class CSculptPushOptions : public CDialog, public CSculptPainter
|
|
{
|
|
DECLARE_DYNAMIC(CSculptPushOptions)
|
|
|
|
public:
|
|
CSculptPushOptions(CWnd* pParent = NULL); // standard constructor
|
|
virtual ~CSculptPushOptions();
|
|
|
|
virtual BOOL OnInitDialog( void );
|
|
virtual void OnOK();
|
|
virtual void OnCancel();
|
|
|
|
// Dialog Data
|
|
enum { IDD = IDD_DISP_SCULPT_PUSH_OPTIONS };
|
|
|
|
typedef enum
|
|
{
|
|
OFFSET_MODE_ADAPTIVE,
|
|
OFFSET_MODE_ABSOLUTE
|
|
} OffsetMode;
|
|
|
|
typedef enum
|
|
{
|
|
NORMAL_MODE_BRUSH_CENTER,
|
|
NORMAL_MODE_SCREEN,
|
|
NORMAL_MODE_SCREEN_XY,
|
|
NORMAL_MODE_X,
|
|
NORMAL_MODE_Y,
|
|
NORMAL_MODE_Z,
|
|
NORMAL_MODE_SELECTED
|
|
} NormalMode;
|
|
|
|
typedef enum
|
|
{
|
|
DENSITY_MODE_ADDITIVE,
|
|
DENSITY_MODE_ATTENUATED,
|
|
} DensityMode;
|
|
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
public:
|
|
afx_msg void OnCbnSelchangeIdcSculptPushOptionNormalMode();
|
|
CComboBox m_OffsetModeControl;
|
|
CEdit m_OffsetDistanceControl;
|
|
CEdit m_OffsetAmountControl;
|
|
CEdit m_SmoothAmountControl;
|
|
CEdit m_FalloffPositionControl;
|
|
CEdit m_FalloffFinalControl;
|
|
CComboBox m_DensityModeControl;
|
|
CComboBox m_NormalModeControl;
|
|
afx_msg void OnCbnSelchangeSculptPushOptionOffsetMode();
|
|
|
|
private:
|
|
OffsetMode m_OffsetMode;
|
|
float m_OffsetDistance, m_OffsetAmount;
|
|
NormalMode m_NormalMode;
|
|
DensityMode m_DensityMode;
|
|
float m_Direction;
|
|
float m_SmoothAmount;
|
|
Vector m_SelectedNormal;
|
|
float m_flFalloffSpot;
|
|
float m_flFalloffEndingValue;
|
|
|
|
void GetPaintAxis( CCamera *pCamera, const Vector2D &vPoint, Vector &vPaintAxis );
|
|
|
|
public:
|
|
virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
virtual void RenderTool3D(CRender3D *pRender);
|
|
virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
|
|
|
|
protected:
|
|
virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
|
|
void DoSmoothOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
|
|
|
|
public:
|
|
afx_msg void OnEnChangeSculptPushOptionOffsetDistance();
|
|
afx_msg void OnCbnSelchangeSculptPushOptionDensityMode();
|
|
afx_msg void OnEnKillfocusSculptPushOptionSmoothAmount();
|
|
afx_msg void OnEnKillfocusSculptPushOptionOffsetAmount();
|
|
afx_msg void OnEnKillfocusSculptPushOptionFalloffPosition();
|
|
afx_msg void OnEnKillfocusSculptPushOptionFalloffFinal();
|
|
};
|
|
|
|
|
|
class CSculptCarveOptions : public CDialog, public CSculptPainter
|
|
{
|
|
DECLARE_DYNAMIC(CSculptCarveOptions)
|
|
|
|
public:
|
|
CSculptCarveOptions(CWnd* pParent = NULL); // standard constructor
|
|
virtual ~CSculptCarveOptions();
|
|
|
|
virtual BOOL OnInitDialog( void );
|
|
virtual void OnOK();
|
|
virtual void OnCancel();
|
|
|
|
// Dialog Data
|
|
enum { IDD = IDD_DISP_SCULPT_CARVE_OPTIONS };
|
|
|
|
typedef enum
|
|
{
|
|
OFFSET_MODE_ADAPTIVE,
|
|
OFFSET_MODE_ABSOLUTE
|
|
} OffsetMode;
|
|
|
|
typedef enum
|
|
{
|
|
NORMAL_MODE_BRUSH_CENTER,
|
|
NORMAL_MODE_SCREEN,
|
|
NORMAL_MODE_SCREEN_XY,
|
|
NORMAL_MODE_X,
|
|
NORMAL_MODE_Y,
|
|
NORMAL_MODE_Z,
|
|
NORMAL_MODE_SELECTED
|
|
} NormalMode;
|
|
|
|
typedef enum
|
|
{
|
|
DENSITY_MODE_ADDITIVE,
|
|
DENSITY_MODE_ATTENUATED,
|
|
} DensityMode;
|
|
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
public:
|
|
CComboBox m_OffsetModeControl;
|
|
CEdit m_OffsetDistanceControl;
|
|
CEdit m_OffsetAmountControl;
|
|
CEdit m_SmoothAmountControl;
|
|
CComboBox m_DensityModeControl;
|
|
CComboBox m_NormalModeControl;
|
|
CStatic m_CarveBrushControl;
|
|
|
|
private:
|
|
const static int MAX_SCULPT_SIZE = 100;
|
|
const static int MAX_QUEUE_SIZE = 20;
|
|
|
|
OffsetMode m_OffsetMode;
|
|
float m_OffsetDistance, m_OffsetAmount;
|
|
NormalMode m_NormalMode;
|
|
DensityMode m_DensityMode;
|
|
float m_Direction;
|
|
float m_SmoothAmount;
|
|
Vector m_SelectedNormal;
|
|
float m_BrushPoints[ MAX_SCULPT_SIZE ];
|
|
int m_BrushLocation;
|
|
Vector2D m_StartLine, m_EndLine;
|
|
CUtlVector< Vector2D > m_DrawPoints;
|
|
CUtlVector< Vector2D > m_DrawNormal;
|
|
|
|
CUtlVector< Vector2D > m_PointQueue;
|
|
|
|
|
|
void GetPaintAxis( CCamera *pCamera, const Vector2D &vPoint, Vector &vPaintAxis );
|
|
void AdjustBrush( int x, int y );
|
|
void AdjustBrushCursor( int x, int y );
|
|
bool CalculatePointNormal( int PointIndex, Vector2D &vNormal );
|
|
bool CalculateQueuePoint( Vector2D &vPoint, Vector2D &vNormal );
|
|
void AddQueuePoint( const Vector2D &vPoint, bool bDrawIt );
|
|
|
|
public:
|
|
virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
|
|
// virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
|
|
virtual void RenderTool3D(CRender3D *pRender);
|
|
virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
|
|
virtual bool OnLMouseDown3D( 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 );
|
|
|
|
protected:
|
|
bool IsPointAffected( CMapView3D *pView, CMapDisp *pDisp, CMapDisp *pOrigDisp, int nVertIndex, int nBrushPoint, Vector2D &vViewVert, bool bUseOrigDisplacement = true, bool bUseCurrentPosition = false );
|
|
virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
|
|
|
|
public:
|
|
afx_msg void OnPaint();
|
|
afx_msg void OnEnChangeSculptPushOptionOffsetDistance();
|
|
afx_msg void OnCbnSelchangeSculptPushOptionDensityMode();
|
|
afx_msg void OnEnKillfocusSculptPushOptionSmoothAmount();
|
|
afx_msg void OnEnKillfocusSculptPushOptionOffsetAmount();
|
|
afx_msg void OnCbnSelchangeIdcSculptPushOptionNormalMode();
|
|
afx_msg void OnCbnSelchangeSculptPushOptionOffsetMode();
|
|
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
|
|
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
|
|
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
|
|
virtual BOOL PreTranslateMessage( MSG* pMsg );
|
|
};
|
|
|
|
#if 0
|
|
|
|
class ITextureInternal;
|
|
|
|
// CSculptProjectOptions dialog
|
|
|
|
class CSculptProjectOptions : public CDialog, public CSculptTool
|
|
{
|
|
DECLARE_DYNAMIC(CSculptProjectOptions)
|
|
|
|
public:
|
|
CSculptProjectOptions(CWnd* pParent = NULL); // standard constructor
|
|
virtual ~CSculptProjectOptions();
|
|
|
|
// Dialog Data
|
|
enum { IDD = IDD_DISP_SCULPT_PROJECT_OPTIONS };
|
|
|
|
public:
|
|
virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
|
|
virtual void RenderTool3D(CRender3D *pRender);
|
|
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 );
|
|
|
|
protected:
|
|
typedef enum
|
|
{
|
|
PROJECT_MODE_NONE,
|
|
PROJECT_MODE_SIZE,
|
|
PROJECT_MODE_POSITION,
|
|
PROJECT_MODE_TILE,
|
|
} ToolMode;
|
|
|
|
CFileDialog *m_FileDialog;
|
|
unsigned char *m_ImagePixels;
|
|
int m_Width, m_Height;
|
|
ITextureInternal *m_pTexture;
|
|
IMaterial *m_pMaterial;
|
|
|
|
Vector m_ProjectLocation, m_ProjectSize;
|
|
Vector m_OriginalProjectLocation, m_OriginalProjectSize;
|
|
int m_ProjectX, m_ProjectY, m_ProjectWidth, m_ProjectHeight;
|
|
float m_TileWidth, m_TileHeight;
|
|
float m_OriginalTileWidth, m_OriginalTileHeight;
|
|
ToolMode m_ToolMode;
|
|
Vector2D m_StartSizingPoint;
|
|
|
|
protected:
|
|
virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
|
|
virtual bool DoSizing( const Vector2D &vPoint );
|
|
virtual bool DoPosition( const Vector2D &vPoint );
|
|
virtual bool DoTiling( const Vector2D &vPoint );
|
|
bool ReadImage( CString &FileName );
|
|
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
public:
|
|
afx_msg void OnBnClickedLoadImage();
|
|
public:
|
|
CSliderCtrl m_ProjectSizeControl;
|
|
public:
|
|
afx_msg void OnNMCustomdrawProjectSize(NMHDR *pNMHDR, LRESULT *pResult);
|
|
public:
|
|
virtual BOOL OnInitDialog();
|
|
public:
|
|
CStatic m_ProjectSizeNumControl;
|
|
};
|
|
#endif
|
|
|
|
#endif // SCULPTOPTIONS_H
|