summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerjoint.h
blob: 76e3833acbf4fcaff77dd3796abd77c1a2c9df7c (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
/** 
 * @file llviewerjoint.h
 * @brief Implementation of LLViewerJoint class
 *
 * $LicenseInfo:firstyear=2001&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_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, bool terse_update = 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