summaryrefslogtreecommitdiff
path: root/indra/newview/lltoolbrush.h
blob: 3cae7559a3a4933119fb7ff9fd49f033c48dc34e (plain)
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
/** 
 * @file lltoolbrush.h
 * @brief toolbrush class header file
 *
 * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
 * $License$
 */

#ifndef LL_LLTOOLBRUSH_H
#define LL_LLTOOLBRUSH_H

#include "lltool.h"
#include "v3math.h"
#include "lleditmenuhandler.h"

class LLSurface;
class LLVector3d;
class LLViewerRegion;

template<class DATA_TYPE> class LLLinkedList;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLToolBrushLand
//
// A toolbrush that modifies the land.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class LLToolBrushLand : public LLTool, public LLEditMenuHandler
{
public:
	LLToolBrushLand();
	
	// x,y in window coords, 0,0 = left,bot
	virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
	virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );		
	virtual BOOL handleHover( S32 x, S32 y, MASK mask );
	virtual void handleSelect();
	virtual void handleDeselect();

	// isAlwaysRendered() - return true if this is a tool that should
	// always be rendered regardless of selection.
	virtual BOOL isAlwaysRendered() { return TRUE; }

	// Draw the area that will be affected.
	virtual void render();

	// on Idle is where the land modification actually occurs
	static void onIdle(void* brush_tool);  

	void			onMouseCaptureLost();

	void modifyLandInSelectionGlobal();
	virtual void	undo();
	virtual BOOL	canUndo()	{ return TRUE; }

	virtual void	redo();
	virtual BOOL	canRedo()	{ return FALSE; }


protected:
	void brush( void );
	void modifyLandAtPointGlobal( const LLVector3d &spot, MASK mask );

	void determineAffectedRegions(LLLinkedList<LLViewerRegion>& regions,
								  const LLVector3d& spot) const;
	void renderOverlay(LLSurface& land, const LLVector3& pos_region,
					   const LLVector3& pos_world);

	// Does region allow terraform, or are we a god?
	bool canTerraform(LLViewerRegion* regionp) const;

	// Modal dialog that you can't terraform the region
	void alertNoTerraform(LLViewerRegion* regionp);

protected:
	F32 mStartingZ;
	S32 mMouseX;
	S32 mMouseY;
	S32 mBrushIndex;
	BOOL mGotHover;
	BOOL mLastShowParcelOwners;
	BOOL mBrushSelected;
	LLLinkedList<LLViewerRegion> mLastAffectedRegions;
};

extern LLToolBrushLand *gToolLand;

#endif // LL_LLTOOLBRUSH_H