summaryrefslogtreecommitdiff
path: root/indra/newview/llpathfindingpathtool.h
blob: 492304e4a462f3f05a27d2db618b90aaa3de8219 (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
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
/** 
 * @file llpathfindingpathtool.h
 * @author William Todd Stinson
 * @brief XXX
 *
 * $LicenseInfo:firstyear=2002&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_LLPATHFINDINGPATHTOOL_H
#define LL_LLPATHFINDINGPATHTOOL_H

#include "llsingleton.h"
#include "lltool.h"
#include "llpathinglib.h"

#include <boost/function.hpp>
#include <boost/signals2.hpp>

class LLPathfindingPathTool : public LLTool, public LLSingleton<LLPathfindingPathTool>
{
public:
	typedef enum
	{
		kPathStatusUnknown,
		kPathStatusChooseStartAndEndPoints,
		kPathStatusChooseStartPoint,
		kPathStatusChooseEndPoint,
		kPathStatusHasValidPath,
		kPathStatusHasInvalidPath,
		kPathStatusNotEnabled,
		kPathStatusNotImplemented,
		kPathStatusError
	} EPathStatus;

	typedef enum
	{
		kCharacterTypeNone,
		kCharacterTypeA,
		kCharacterTypeB,
		kCharacterTypeC,
		kCharacterTypeD
	} ECharacterType;

	LLPathfindingPathTool();
	virtual ~LLPathfindingPathTool();

	typedef boost::function<void (void)>         path_event_callback_t;
	typedef boost::signals2::signal<void (void)> path_event_signal_t;
	typedef boost::signals2::connection          path_event_slot_t;

	virtual BOOL      handleMouseDown(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleMouseUp(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleRightMouseDown(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleRightMouseUp(S32 pX, S32 pY, MASK pMask);
	virtual BOOL      handleDoubleClick(S32 x, S32 y, MASK mask);

	virtual BOOL      handleHover(S32 pX, S32 pY, MASK pMask);

	EPathStatus       getPathStatus() const;

	F32               getCharacterWidth() const;
	void              setCharacterWidth(F32 pCharacterWidth);

	ECharacterType    getCharacterType() const;
	void              setCharacterType(ECharacterType pCharacterType);

	bool              isRenderPath() const;
	void              clearPath();

	path_event_slot_t registerPathEventListener(path_event_callback_t pPathEventCallback);

protected:

private:
	bool              isAnyPathToolModKeys(MASK pMask) const;
	bool              isPointAModKeys(MASK pMask) const;
	bool              isPointBModKeys(MASK pMask) const;

	void              getRayPoints(S32 pX, S32 pY, LLVector3 &pRayStart, LLVector3 &pRayEnd) const;
	void              computeFinalPoints(S32 pX, S32 pY, MASK pMask);
	void              computeTempPoints(S32 pX, S32 pY, MASK pMask);

	void              setFinalA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
	bool              hasFinalA() const;
	const LLVector3   &getFinalAStart() const;
	const LLVector3   &getFinalAEnd() const;

	void              setTempA(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
	bool              hasTempA() const;

	void              setFinalB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
	bool              hasFinalB() const;
	const LLVector3   &getFinalBStart() const;
	const LLVector3   &getFinalBEnd() const;

	void              setTempB(const LLVector3 &pStartPoint, const LLVector3 &pEndPoint);
	bool              hasTempB() const;

	void              clearFinal();
	void              clearTemp();

	void              computeFinalPath();
	void              computeTempPath();

	LLPathingLib::PathingPacket mFinalPathData;
	LLPathingLib::PathingPacket mTempPathData;
	LLPathingLib::LLPLResult    mPathResult;
	ECharacterType              mCharacterType;
	path_event_signal_t         mPathEventSignal;
	bool                        mIsLeftMouseButtonHeld;
	bool                        mIsMiddleMouseButtonHeld;
	bool                        mIsRightMouseButtonHeld;
};

#endif // LL_LLPATHFINDINGPATHTOOL_H