summaryrefslogtreecommitdiff
path: root/indra/llappearance/llavatarjointmesh.h
blob: 33f50fce00cbe1a8d5df5bc946f6a289e6615325 (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
/**
 * @file llavatarjointmesh.h
 * @brief Declaration of LLAvatarJointMesh 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_LLAVATARJOINTMESH_H
#define LL_LLAVATARJOINTMESH_H

#include "llavatarjoint.h"
#include "llgltexture.h"
#include "llpolymesh.h"
#include "v4color.h"

class LLDrawable;
class LLFace;
class LLCharacter;
class LLTexLayerSet;

typedef enum e_avatar_render_pass
{
    AVATAR_RENDER_PASS_SINGLE,
    AVATAR_RENDER_PASS_CLOTHING_INNER,
    AVATAR_RENDER_PASS_CLOTHING_OUTER
} EAvatarRenderPass;

class LLSkinJoint
{
public:
    LLSkinJoint();
    ~LLSkinJoint();
    bool setupSkinJoint( LLAvatarJoint *joint);

    LLAvatarJoint   *mJoint;
    LLVector3       mRootToJointSkinOffset;
    LLVector3       mRootToParentJointSkinOffset;
};

//-----------------------------------------------------------------------------
// class LLViewerJointMesh
//-----------------------------------------------------------------------------
class LLAvatarJointMesh : public virtual LLAvatarJoint
{
protected:
    LLColor4                    mColor;         // color value
//  LLColor4                    mSpecular;      // specular color (always white for now)
    F32                         mShiny;         // shiny value
    LLPointer<LLGLTexture>      mTexture;       // ptr to a global texture
    LLTexLayerSet*              mLayerSet;      // ptr to a layer set owned by the avatar
    U32                         mTestImageName;     // handle to a temporary texture for previewing uploads
    LLPolyMesh*                 mMesh;          // ptr to a global polymesh
    bool                        mCullBackFaces; // true by default
    LLFace*                     mFace;          // ptr to a face w/ AGP copy of mesh

    U32                         mFaceIndexCount;

    U32                         mNumSkinJoints;
    LLSkinJoint*                mSkinJoints;
    S32                         mMeshID;

public:
    static bool                 sPipelineRender;
    //RN: this is here for testing purposes
    static U32                  sClothingMaskImageName;
    static LLColor4             sClothingInnerColor;

public:
    // Constructor
    LLAvatarJointMesh();

    // Destructor
    virtual ~LLAvatarJointMesh();

    // Gets the shape color
    void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha );

    // Sets the shape color
    void setColor( F32 red, F32 green, F32 blue, F32 alpha );
    void setColor( const LLColor4& color );

    // Sets the shininess
    void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; };

    // Sets the shape texture
    void setTexture( LLGLTexture *texture );

    bool hasGLTexture() const;

    void setTestTexture( U32 name ) { mTestImageName = name; }

    // Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture)
    void setLayerSet( LLTexLayerSet* layer_set );

    bool hasComposite() const;

    // Gets the poly mesh
    LLPolyMesh *getMesh();

    // Sets the poly mesh
    void setMesh( LLPolyMesh *mesh );

    // Sets up joint matrix data for rendering
    void setupJoint(LLAvatarJoint* current_joint);

    // Sets ID for picking
    void setMeshID( S32 id ) {mMeshID = id;}

    // Gets ID for picking
    S32 getMeshID() { return mMeshID; }

    void setIsTransparent(bool is_transparent) { mIsTransparent = is_transparent; }

private:
    // Allocate skin data
    bool allocateSkinData( U32 numSkinJoints );

    // Free skin data
    void freeSkinData();
};

#endif // LL_LLAVATARJOINTMESH_H