summaryrefslogtreecommitdiff
path: root/indra/llappearance/llavatarjoint.h
blob: 09269bbc3fbe29dc701e72b4a2bf9b0167646947 (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
/** 
 * @file llavatarjoint.h
 * @brief Implementation of LLAvatarJoint 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_LLAVATARJOINT_H
#define LL_LLAVATARJOINT_H

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

class LLFace;
class LLAvatarJointMesh;

extern const F32 DEFAULT_AVATAR_JOINT_LOD;

//-----------------------------------------------------------------------------
// class LLViewerJoint
//-----------------------------------------------------------------------------
class LLAvatarJoint :
	public LLJoint
{
public:
	LLAvatarJoint();
	LLAvatarJoint(S32 joint_num);
	// *TODO: Only used for LLVOAvatarSelf::mScreenp.  *DOES NOT INITIALIZE mResetAfterRestoreOldXform*
	LLAvatarJoint(const std::string &name, LLJoint *parent = NULL);
	virtual ~LLAvatarJoint();

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

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

	// Returns true if this object is transparent.
	// This is used to determine in which order to draw objects.
	virtual bool isTransparent() { return mIsTransparent; }

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

	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; }

	void setPickName(LLJointPickName name) { mPickName = name; }
	LLJointPickName getPickName() { return mPickName; }

	void setVisible( bool visible, bool recursive );

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

	// LLViewerJoint interface
	virtual U32 render( F32 pixelArea, bool first_pass = true, bool is_dummy = false ) = 0;
	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();
	

public:
	static bool	sDisableLOD;
	avatar_joint_mesh_list_t mMeshParts; //LLViewerJointMesh*
	void setMeshID( S32 id ) {mMeshID = id;}

protected:
	void init();

	bool		mValid;
	bool		mIsTransparent;
	U32			mComponents;
	F32			mMinPixelArea;
	LLJointPickName	mPickName;
	bool		mVisible;
	S32			mMeshID;
};

class LLAvatarJointCollisionVolume : public LLAvatarJoint
{
public:
	LLAvatarJointCollisionVolume();
	virtual ~LLAvatarJointCollisionVolume() {};

	/*virtual*/ bool inheritScale() { return true; }
	/*virtual*/ U32 render( F32 pixelArea, bool first_pass = true, bool is_dummy = false );

	void renderCollision();

	LLVector3 getVolumePos(LLVector3 &offset);
};

#endif // LL_LLAVATARJOINT_H