summaryrefslogtreecommitdiff
path: root/hammer/tooldisplace.h
blob: 79719cc372c30c24fceb867da37bfbbfbaae91a2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
//========= 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