//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef SCULPTOPTIONS_H #define SCULPTOPTIONS_H #ifdef _WIN32 #pragma once #endif #include "disppaint.h" #include "afxwin.h" #include "afxcmn.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, int *pnCollideDisplacement = NULL, int *pnCollideTri = NULL ); private: void DetermineKeysDown(); protected: static bool MapDispLessFunc( EditDispHandle_t const &a, EditDispHandle_t const &b ) { return a < b; } static CUtlMap 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_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_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 class CTextureButton : public CButton { public: CTextureButton( ); void SetTexture( IEditorTexture *pTexture ); void SetSelected( bool bSelected ); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); private: IEditorTexture *m_pTexure; bool m_bSelected; }; class CColorButton : public CButton { public: CColorButton( ); void SetColor( float flRed, float flGreen, float flBlue ); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); private: float m_flRed, m_flGreen, m_flBlue; protected: DECLARE_MESSAGE_MAP() }; class CSculptBlendOptions : public CDialog, public CSculptPainter { DECLARE_DYNAMIC(CSculptBlendOptions) public: CSculptBlendOptions(CWnd* pParent = NULL); // standard constructor virtual ~CSculptBlendOptions(); virtual BOOL OnInitDialog( void ); virtual void OnOK(); virtual void OnCancel(); // Dialog Data enum { IDD = IDD_DISP_SCULPT_BLEND_OPTIONS }; typedef enum { COLOR_MODE_SINGLE, COLOR_MODE_RANGE, COLOR_MODE_OR, COLOR_MODE_MAX } ColorMode; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() public: private: float m_Direction; float m_flFalloffSpot; float m_flFalloffEndingValue; int m_nLastCollideDisplacement; int m_nLastCollideTri; ColorMode m_ColorMode[ MAX_MULTIBLEND_CHANNELS ]; int m_nSelectedTexture; Vector m_vStartDrawColor[ MAX_MULTIBLEND_CHANNELS ]; Vector m_vEndDrawColor[ MAX_MULTIBLEND_CHANNELS ]; int m_nDefaultFalloffPosition; int m_nDefaultFalloffFinal; int m_nDefaultBlendAmount; int m_nDefaultColorBlendAmount; int m_nDefaultAlphaBlendAmount; bool m_b4WayBlendMode; 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 bool DoPaint( CMapView3D *pView, const Vector2D &vPoint ); virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp ); void SelectTexture( int nTexture ); void SetColorMode( ColorMode NewMode, bool bSetDialog ); public: CSliderCtrl m_BlendAmountControl; afx_msg void OnNMCustomdrawBlendAmount(NMHDR *pNMHDR, LRESULT *pResult); CStatic m_BlendAmountTextControl; afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); CTextureButton m_TextureControl[ MAX_MULTIBLEND_CHANNELS ]; CButton m_TextureMaskControl[ MAX_MULTIBLEND_CHANNELS ]; CButton m_ColorMaskControl[ MAX_MULTIBLEND_CHANNELS ]; afx_msg void OnBnClickedTextureButton1(); afx_msg void OnBnClickedTextureButton2(); afx_msg void OnBnClickedTextureButton3(); afx_msg void OnBnClickedTextureButton4(); afx_msg void ShrinkBrush(); afx_msg void EnlargeBrush(); afx_msg void OnBnClickedSetColor(); afx_msg void OnBnClickedSetColor2(); afx_msg void OnBnClickedBlendColorOperation(); CSliderCtrl m_ColorBlendAmountControl; CStatic m_ColorBlendAmountTextControl; CColorButton m_ColorStartControl; CColorButton m_ColorEndControl; afx_msg void OnNMCustomdrawColorBlendAmount(NMHDR *pNMHDR, LRESULT *pResult); CComboBox m_BlendColorOperationControl; afx_msg void OnCbnSelchangeBlendColorOperation(); CSliderCtrl m_FalloffPositionControl; CSliderCtrl m_FalloffFinalControl; CSliderCtrl m_AlphaBlendAmountControl; CStatic m_AlphaBlendAmountTextControl; afx_msg void OnNMCustomdrawAlphaBlendAmount(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point); }; #endif // SCULPTOPTIONS_H