summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerjoint.h
blob: 0d3092a0447e6fe976866bc4462452803b063060 (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
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
/** 
 * @file llviewerjoint.h
 * @brief Implementation of LLViewerJoint class
 *
 * $LicenseInfo:firstyear=2001&license=viewergpl$
 * 
 * Copyright (c) 2001-2009, Linden Research, Inc.
 * 
 * Second Life Viewer Source Code
 * The source code in this file ("Source Code") is provided by Linden Lab
 * to you under the terms of the GNU General Public License, version 2.0
 * ("GPL"), unless you have obtained a separate licensing agreement
 * ("Other License"), formally executed by you and Linden Lab.  Terms of
 * the GPL can be found in doc/GPL-license.txt in this distribution, or
 * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
 * 
 * There are special exceptions to the terms and conditions of the GPL as
 * it is applied to this Source Code. View the full text of the exception
 * in the file doc/FLOSS-exception.txt in this software distribution, or
 * online at
 * http://secondlifegrid.net/programs/open_source/licensing/flossexception
 * 
 * By copying, modifying or distributing this software, you acknowledge
 * that you have read and understood your obligations described above,
 * and agree to abide by those obligations.
 * 
 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
 * COMPLETENESS OR PERFORMANCE.
 * $/LicenseInfo$
 */

#ifndef LL_LLVIEWERJOINT_H
#define LL_LLVIEWERJOINT_H

//-----------------------------------------------------------------------------
// Header Files
//-----------------------------------------------------------------------------
#include "lljoint.h"

class LLFace;
class LLViewerJointMesh;

//-----------------------------------------------------------------------------
// class LLViewerJoint
//-----------------------------------------------------------------------------
class LLViewerJoint :
	public LLJoint
{
public:
	LLViewerJoint();
	LLViewerJoint(const std::string &name, LLJoint *parent = NULL);
	virtual ~LLViewerJoint();

	// Gets the validity of this joint
	BOOL getValid() { return mValid; }

	// Sets the validity of this joint
	virtual void setValid( BOOL valid, BOOL recursive=FALSE );

	// Primarily for debugging and character setup
	// Derived classes may add text/graphic output.
	// Draw skeleton graphic for debugging and character setup
 	void renderSkeleton(BOOL recursive=TRUE); // debug only (unused)

	// Draws a bone graphic to the parent joint.
	// Derived classes may add text/graphic output.
	// Called by renderSkeleton().
 	void drawBone(); // debug only (unused)

	// Render character hierarchy.
	// Traverses the entire joint hierarchy, setting up
	// transforms and calling the drawShape().
	// Derived classes may add text/graphic output.
	virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE );	// Returns triangle count

	// Returns true if this object is transparent.
	// This is used to determine in which order to draw objects.
	virtual BOOL isTransparent();

	// Returns true if this object should inherit scale modifiers from its immediate parent
	virtual BOOL inheritScale() { return FALSE; }

	// Draws the shape attached to a joint.
	// Called by render().
	virtual U32 drawShape( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE );
	virtual void drawNormals() {}

	enum Components
	{
		SC_BONE		= 1,
		SC_JOINT	= 2,
		SC_AXES		= 4
	};

	// Selects which skeleton components to draw
	void setSkeletonComponents( U32 comp, BOOL recursive = TRUE );

	// Returns which skeleton components are enables for drawing
	U32 getSkeletonComponents() { return mComponents; }

	// Sets the level of detail for this node as a minimum
	// pixel area threshold.  If the current pixel area for this
	// object is less than the specified threshold, the node is
	// not traversed.  In addition, if a value is specified (not
	// default of 0.0), and the pixel area is larger than the
	// specified minimum, the node is rendered, but no other siblings
	// of this node under the same parent will be.
	F32 getLOD() { return mMinPixelArea; }
	void setLOD( F32 pixelArea ) { mMinPixelArea = pixelArea; }
	
	// Sets the OpenGL selection stack name that is pushed and popped
	// with this joint state.  The default value indicates that no name
	// should be pushed/popped.
	enum PickName
	{
		PN_DEFAULT = -1,
		PN_0 = 0,
		PN_1 = 1,
		PN_2 = 2,
		PN_3 = 3,
		PN_4 = 4,
		PN_5 = 5
	};
	void setPickName(PickName name) { mPickName = name; }
	PickName getPickName() { return mPickName; }

	virtual void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);
	virtual void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE);
	virtual BOOL updateLOD(F32 pixel_area, BOOL activate);
	virtual void updateJointGeometry();
	virtual void dump();

	void setVisible( BOOL visible, BOOL recursive );

	// Takes meshes in mMeshParts and sets each one as a child joint
	void setMeshesToChildren();

public:
	static BOOL	sDisableLOD;
	std::vector<LLViewerJointMesh*> mMeshParts;
	void setMeshID( S32 id ) {mMeshID = id;}

protected:
	void init();

	BOOL		mValid;
	U32			mComponents;
	F32			mMinPixelArea;
	PickName	mPickName;
	BOOL		mVisible;
	S32			mMeshID;
};

class LLViewerJointCollisionVolume : public LLViewerJoint
{
public:
	LLViewerJointCollisionVolume();
	LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent = NULL);
	virtual ~LLViewerJointCollisionVolume() {};

	virtual BOOL inheritScale() { return TRUE; }

	void renderCollision();
	LLVector3 getVolumePos(LLVector3 &offset);
};

#endif // LL_LLVIEWERJOINT_H