Team Fortress 2 Source Code as on 22/4/2020
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.

383 lines
12 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #ifndef SCULPTOPTIONS_H
  7. #define SCULPTOPTIONS_H
  8. #ifdef _WIN32
  9. #pragma once
  10. #endif
  11. #include "disppaint.h"
  12. #include "afxwin.h"
  13. class CMapView3D;
  14. class CPaintSculptDlg;
  15. class CSculptTool
  16. {
  17. public:
  18. CSculptTool();
  19. ~CSculptTool();
  20. void SetPaintOwner( CPaintSculptDlg *pOwner ) { m_PaintOwner = pOwner; }
  21. virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
  22. virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &SpatialData );
  23. virtual void RenderTool3D(CRender3D *pRender) = 0;
  24. virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  25. virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  26. virtual bool OnRMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  27. virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  28. virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  29. virtual bool OnLButtonUpDialog(UINT nFlags, CPoint point) { return false; }
  30. virtual bool OnLButtonDownDialog(UINT nFlags, CPoint point) { return false; }
  31. virtual bool OnMouseMoveDialog(UINT nFlags, CPoint point) { return false; }
  32. protected:
  33. // Painting.
  34. virtual bool PrePaint( CMapView3D *pView, const Vector2D &vPoint );
  35. virtual bool PostPaint( bool bAutoSew );
  36. virtual bool DoPaint( CMapView3D *pView, const Vector2D &vPoint );
  37. virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp ) = 0;
  38. bool GetStartingSpot( CMapView3D *pView, const Vector2D &vPoint );
  39. bool IsPointInScreenCircle( CMapView3D *pView, CMapDisp *pDisp, CMapDisp *pOrigDisp, int nVertIndex, bool bUseOrigDisplacement = true, bool bUseCurrentPosition = false, float *pflLengthPercent = NULL );
  40. void DoPaintSmooth( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
  41. bool PaintSphereDispBBoxOverlap( const Vector &vCenter, float flRadius, const Vector &vBBoxMin, const Vector &vBBoxMax );
  42. bool IsInSphereRadius( const Vector &vCenter, float flRadius2, const Vector &vPos, float &flDistance2 );
  43. float CalcSmoothRadius2( const Vector &vPoint );
  44. bool DoPaintSmoothOneOverExp( const Vector &vNewCenter, Vector &vPaintPos );
  45. void AddToUndo( CMapDisp **pDisp );
  46. void DrawDirection( CRender3D *pRender, Vector vDirection, Color Towards, Color Away );
  47. void DuplicateSelectedDisp( );
  48. void PrepareDispForPainting( );
  49. bool FindCollisionIntercept( CCamera *pCamera, const Vector2D &vPoint, bool bUseOrigPosition, Vector &vCollisionPoint, Vector &vCollisionNormal, float &vCollisionIntercept );
  50. private:
  51. void DetermineKeysDown();
  52. protected:
  53. static bool MapDispLessFunc( EditDispHandle_t const &a, EditDispHandle_t const &b )
  54. {
  55. return a < b;
  56. }
  57. static CUtlMap<EditDispHandle_t, CMapDisp *> m_OrigMapDisp;
  58. Vector m_StartingCollisionPoint, m_StartingCollisionNormal, m_OriginalCollisionPoint, m_OriginalCollisionNormal, m_CurrentCollisionPoint, m_CurrentCollisionNormal;
  59. float m_StartingCollisionIntercept, m_OriginalCollisionIntercept, m_CurrentCollisionIntercept;
  60. float m_StartingProjectedRadius, m_OriginalProjectedRadius, m_CurrentProjectedRadius;
  61. bool m_OriginalCollisionValid, m_CurrentCollisionValid;
  62. Vector2D m_MousePoint;
  63. bool m_bLMBDown; // left mouse button state
  64. bool m_bRMBDown; // right mouse button state
  65. bool m_bAltDown, m_bCtrlDown, m_bShiftDown;
  66. bool m_ValidPaintingSpot;
  67. float m_BrushSize;
  68. CPaintSculptDlg *m_PaintOwner;
  69. SpatialPaintData_t m_SpatialData;
  70. };
  71. class CSculptPainter : public CSculptTool
  72. {
  73. public:
  74. CSculptPainter();
  75. ~CSculptPainter();
  76. virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
  77. virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
  78. virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  79. virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  80. virtual bool OnRMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  81. virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  82. virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  83. protected:
  84. virtual bool DoSizing( const Vector2D &vPoint );
  85. bool m_InPaintingMode;
  86. bool m_InSizingMode;
  87. Vector2D m_StartSizingPoint;
  88. float m_OrigBrushSize;
  89. };
  90. class CSculptPushOptions : public CDialog, public CSculptPainter
  91. {
  92. DECLARE_DYNAMIC(CSculptPushOptions)
  93. public:
  94. CSculptPushOptions(CWnd* pParent = NULL); // standard constructor
  95. virtual ~CSculptPushOptions();
  96. virtual BOOL OnInitDialog( void );
  97. virtual void OnOK();
  98. virtual void OnCancel();
  99. // Dialog Data
  100. enum { IDD = IDD_DISP_SCULPT_PUSH_OPTIONS };
  101. typedef enum
  102. {
  103. OFFSET_MODE_ADAPTIVE,
  104. OFFSET_MODE_ABSOLUTE
  105. } OffsetMode;
  106. typedef enum
  107. {
  108. NORMAL_MODE_BRUSH_CENTER,
  109. NORMAL_MODE_SCREEN,
  110. NORMAL_MODE_SCREEN_XY,
  111. NORMAL_MODE_X,
  112. NORMAL_MODE_Y,
  113. NORMAL_MODE_Z,
  114. NORMAL_MODE_SELECTED
  115. } NormalMode;
  116. typedef enum
  117. {
  118. DENSITY_MODE_ADDITIVE,
  119. DENSITY_MODE_ATTENUATED,
  120. } DensityMode;
  121. protected:
  122. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  123. DECLARE_MESSAGE_MAP()
  124. public:
  125. afx_msg void OnCbnSelchangeIdcSculptPushOptionNormalMode();
  126. CComboBox m_OffsetModeControl;
  127. CEdit m_OffsetDistanceControl;
  128. CEdit m_OffsetAmountControl;
  129. CEdit m_SmoothAmountControl;
  130. CEdit m_FalloffPositionControl;
  131. CEdit m_FalloffFinalControl;
  132. CComboBox m_DensityModeControl;
  133. CComboBox m_NormalModeControl;
  134. afx_msg void OnCbnSelchangeSculptPushOptionOffsetMode();
  135. private:
  136. OffsetMode m_OffsetMode;
  137. float m_OffsetDistance, m_OffsetAmount;
  138. NormalMode m_NormalMode;
  139. DensityMode m_DensityMode;
  140. float m_Direction;
  141. float m_SmoothAmount;
  142. Vector m_SelectedNormal;
  143. float m_flFalloffSpot;
  144. float m_flFalloffEndingValue;
  145. void GetPaintAxis( CCamera *pCamera, const Vector2D &vPoint, Vector &vPaintAxis );
  146. public:
  147. virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
  148. virtual void RenderTool3D(CRender3D *pRender);
  149. virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  150. protected:
  151. virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
  152. void DoSmoothOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
  153. public:
  154. afx_msg void OnEnChangeSculptPushOptionOffsetDistance();
  155. afx_msg void OnCbnSelchangeSculptPushOptionDensityMode();
  156. afx_msg void OnEnKillfocusSculptPushOptionSmoothAmount();
  157. afx_msg void OnEnKillfocusSculptPushOptionOffsetAmount();
  158. afx_msg void OnEnKillfocusSculptPushOptionFalloffPosition();
  159. afx_msg void OnEnKillfocusSculptPushOptionFalloffFinal();
  160. };
  161. class CSculptCarveOptions : public CDialog, public CSculptPainter
  162. {
  163. DECLARE_DYNAMIC(CSculptCarveOptions)
  164. public:
  165. CSculptCarveOptions(CWnd* pParent = NULL); // standard constructor
  166. virtual ~CSculptCarveOptions();
  167. virtual BOOL OnInitDialog( void );
  168. virtual void OnOK();
  169. virtual void OnCancel();
  170. // Dialog Data
  171. enum { IDD = IDD_DISP_SCULPT_CARVE_OPTIONS };
  172. typedef enum
  173. {
  174. OFFSET_MODE_ADAPTIVE,
  175. OFFSET_MODE_ABSOLUTE
  176. } OffsetMode;
  177. typedef enum
  178. {
  179. NORMAL_MODE_BRUSH_CENTER,
  180. NORMAL_MODE_SCREEN,
  181. NORMAL_MODE_SCREEN_XY,
  182. NORMAL_MODE_X,
  183. NORMAL_MODE_Y,
  184. NORMAL_MODE_Z,
  185. NORMAL_MODE_SELECTED
  186. } NormalMode;
  187. typedef enum
  188. {
  189. DENSITY_MODE_ADDITIVE,
  190. DENSITY_MODE_ATTENUATED,
  191. } DensityMode;
  192. protected:
  193. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  194. DECLARE_MESSAGE_MAP()
  195. public:
  196. CComboBox m_OffsetModeControl;
  197. CEdit m_OffsetDistanceControl;
  198. CEdit m_OffsetAmountControl;
  199. CEdit m_SmoothAmountControl;
  200. CComboBox m_DensityModeControl;
  201. CComboBox m_NormalModeControl;
  202. CStatic m_CarveBrushControl;
  203. private:
  204. const static int MAX_SCULPT_SIZE = 100;
  205. const static int MAX_QUEUE_SIZE = 20;
  206. OffsetMode m_OffsetMode;
  207. float m_OffsetDistance, m_OffsetAmount;
  208. NormalMode m_NormalMode;
  209. DensityMode m_DensityMode;
  210. float m_Direction;
  211. float m_SmoothAmount;
  212. Vector m_SelectedNormal;
  213. float m_BrushPoints[ MAX_SCULPT_SIZE ];
  214. int m_BrushLocation;
  215. Vector2D m_StartLine, m_EndLine;
  216. CUtlVector< Vector2D > m_DrawPoints;
  217. CUtlVector< Vector2D > m_DrawNormal;
  218. CUtlVector< Vector2D > m_PointQueue;
  219. void GetPaintAxis( CCamera *pCamera, const Vector2D &vPoint, Vector &vPaintAxis );
  220. void AdjustBrush( int x, int y );
  221. void AdjustBrushCursor( int x, int y );
  222. bool CalculatePointNormal( int PointIndex, Vector2D &vNormal );
  223. bool CalculateQueuePoint( Vector2D &vPoint, Vector2D &vNormal );
  224. void AddQueuePoint( const Vector2D &vPoint, bool bDrawIt );
  225. public:
  226. virtual bool BeginPaint( CMapView3D *pView, const Vector2D &vPoint );
  227. // virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
  228. virtual void RenderTool3D(CRender3D *pRender);
  229. virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  230. virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  231. virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  232. virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  233. protected:
  234. bool IsPointAffected( CMapView3D *pView, CMapDisp *pDisp, CMapDisp *pOrigDisp, int nVertIndex, int nBrushPoint, Vector2D &vViewVert, bool bUseOrigDisplacement = true, bool bUseCurrentPosition = false );
  235. virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
  236. public:
  237. afx_msg void OnPaint();
  238. afx_msg void OnEnChangeSculptPushOptionOffsetDistance();
  239. afx_msg void OnCbnSelchangeSculptPushOptionDensityMode();
  240. afx_msg void OnEnKillfocusSculptPushOptionSmoothAmount();
  241. afx_msg void OnEnKillfocusSculptPushOptionOffsetAmount();
  242. afx_msg void OnCbnSelchangeIdcSculptPushOptionNormalMode();
  243. afx_msg void OnCbnSelchangeSculptPushOptionOffsetMode();
  244. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  245. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  246. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  247. virtual BOOL PreTranslateMessage( MSG* pMsg );
  248. };
  249. #if 0
  250. class ITextureInternal;
  251. // CSculptProjectOptions dialog
  252. class CSculptProjectOptions : public CDialog, public CSculptTool
  253. {
  254. DECLARE_DYNAMIC(CSculptProjectOptions)
  255. public:
  256. CSculptProjectOptions(CWnd* pParent = NULL); // standard constructor
  257. virtual ~CSculptProjectOptions();
  258. // Dialog Data
  259. enum { IDD = IDD_DISP_SCULPT_PROJECT_OPTIONS };
  260. public:
  261. virtual bool Paint( CMapView3D *pView, const Vector2D &vPoint, SpatialPaintData_t &spatialData );
  262. virtual void RenderTool3D(CRender3D *pRender);
  263. virtual bool OnLMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  264. virtual bool OnLMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  265. virtual bool OnRMouseUp3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  266. virtual bool OnRMouseDown3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  267. virtual bool OnMouseMove3D( CMapView3D *pView, UINT nFlags, const Vector2D &vPoint );
  268. protected:
  269. typedef enum
  270. {
  271. PROJECT_MODE_NONE,
  272. PROJECT_MODE_SIZE,
  273. PROJECT_MODE_POSITION,
  274. PROJECT_MODE_TILE,
  275. } ToolMode;
  276. CFileDialog *m_FileDialog;
  277. unsigned char *m_ImagePixels;
  278. int m_Width, m_Height;
  279. ITextureInternal *m_pTexture;
  280. IMaterial *m_pMaterial;
  281. Vector m_ProjectLocation, m_ProjectSize;
  282. Vector m_OriginalProjectLocation, m_OriginalProjectSize;
  283. int m_ProjectX, m_ProjectY, m_ProjectWidth, m_ProjectHeight;
  284. float m_TileWidth, m_TileHeight;
  285. float m_OriginalTileWidth, m_OriginalTileHeight;
  286. ToolMode m_ToolMode;
  287. Vector2D m_StartSizingPoint;
  288. protected:
  289. virtual void DoPaintOperation( CMapView3D *pView, const Vector2D &vPoint, CMapDisp *pDisp, CMapDisp *pOrigDisp );
  290. virtual bool DoSizing( const Vector2D &vPoint );
  291. virtual bool DoPosition( const Vector2D &vPoint );
  292. virtual bool DoTiling( const Vector2D &vPoint );
  293. bool ReadImage( CString &FileName );
  294. protected:
  295. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  296. DECLARE_MESSAGE_MAP()
  297. public:
  298. afx_msg void OnBnClickedLoadImage();
  299. public:
  300. CSliderCtrl m_ProjectSizeControl;
  301. public:
  302. afx_msg void OnNMCustomdrawProjectSize(NMHDR *pNMHDR, LRESULT *pResult);
  303. public:
  304. virtual BOOL OnInitDialog();
  305. public:
  306. CStatic m_ProjectSizeNumControl;
  307. };
  308. #endif
  309. #endif // SCULPTOPTIONS_H