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
|
/**
* @file llflexibleobject.h
* @author JJ Ventrella, Andrew Meadows, Tom Yedwab
* @brief Flexible object definition
*
* Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
* $License$
*/
/**
* This is for specifying objects in the world that are animated and
* rendered locally - on the viewer. Flexible Objects are linear arrays
* of positions, which stay at a fixed distance from each other. One
* position is fixed as an "anchor" and is attached to some other object
* in the world, determined by the server. All the other positions are
* updated according to local physics.
*/
#ifndef LL_LLFLEXIBLEOBJECT_H
#define LL_LLFLEXIBLEOBJECT_H
#include "llmemory.h"
#include "llprimitive.h"
#include "llvovolume.h"
#include "llwind.h"
// 10 ms for the whole thing!
const F32 FLEXIBLE_OBJECT_TIMESLICE = 0.003f;
const U32 FLEXIBLE_OBJECT_MAX_LOD = 10;
// See llprimitive.h for LLFlexibleObjectData and DEFAULT/MIN/MAX values
//-------------------------------------------------------------------
struct LLFlexibleObjectSection
{
// Input parameters
LLVector2 mScale;
LLQuaternion mAxisRotation;
// Simulated state
LLVector3 mPosition;
LLVector3 mVelocity;
LLVector3 mDirection;
LLQuaternion mRotation;
// Derivatives (Not all currently used, will come back with LLVolume changes to automagically generate normals)
LLVector3 mdPosition;
//LLMatrix4 mRotScale;
//LLMatrix4 mdRotScale;
};
//---------------------------------------------------------
// The LLVolumeImplFlexible class
//---------------------------------------------------------
class LLVolumeImplFlexible : public LLVolumeInterface
{
public:
LLVolumeImplFlexible(LLViewerObject* volume, LLFlexibleObjectData* attributes);
// Implements LLVolumeInterface
LLVector3 getFramePosition() const;
LLQuaternion getFrameRotation() const;
LLVolumeInterfaceType getInterfaceType() const { return INTERFACE_FLEXIBLE; }
BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
BOOL doUpdateGeometry(LLDrawable *drawable);
LLVector3 getPivotPosition() const;
void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
void onSetScale(const LLVector3 &scale, BOOL damped);
void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin);
void onShift(const LLVector3 &shift_vector);
bool isVolumeUnique() const { return true; }
bool isVolumeGlobal() const { return true; }
bool isActive() const { return true; }
const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
void updateRelativeXform(BOOL global_volume = FALSE);
void doFlexibleUpdate(); // Called to update the simulation
void doFlexibleRebuild(); // Called to rebuild the geometry
static void resetUpdateBins();
static void doFlexibleUpdateBins();
//void setAttributes( LLFlexibleObjectData );
void setParentPositionAndRotationDirectly( LLVector3 p, LLQuaternion r );
void setUsingCollisionSphere( bool u );
void setCollisionSphere( LLVector3 position, F32 radius );
void setRenderingCollisionSphere( bool r);
LLVector3 getEndPosition();
LLQuaternion getEndRotation();
LLVector3 getNodePosition( int nodeIndex );
LLVector3 getAnchorPosition() const;
private:
//--------------------------------------
// private members
//--------------------------------------
LLViewerObject* mVO;
LLTimer mTimer;
LLVector3 mAnchorPosition;
LLVector3 mParentPosition;
LLQuaternion mParentRotation;
LLQuaternion mInitialAxisRotation;
LLQuaternion mLastSegmentRotation;
BOOL mInitialized;
BOOL mUpdated;
LLFlexibleObjectData* mAttributes;
LLFlexibleObjectSection mSection [ (1<<FLEXIBLE_OBJECT_MAX_SECTIONS)+1 ];
S32 mInitializedRes;
S32 mSimulateRes;
S32 mRenderRes;
U32 mFrameNum;
LLVector3 mCollisionSpherePosition;
F32 mCollisionSphereRadius;
U64 mLastUpdate;
BOOL mJustShifted;
//--------------------------------------
// private methods
//--------------------------------------
void setAttributesOfAllSections ();
void remapSections(LLFlexibleObjectSection *source, S32 source_sections,
LLFlexibleObjectSection *dest, S32 dest_sections);
U64 getLastUpdate() const { return mLastUpdate; }
// LOD Bins
struct FlexCompare
{
bool operator()(LLVolumeImplFlexible* a, LLVolumeImplFlexible* b) const
{
U64 a_update = a->getLastUpdate();
U64 b_update = b->getLastUpdate();
if (a_update == b_update)
{
return a < b; // compare pointers
}
return a_update < b_update;
}
};
typedef std::set<LLVolumeImplFlexible*, FlexCompare> lodset_t;
static lodset_t sLODBins[ FLEXIBLE_OBJECT_MAX_LOD ];
static U64 sCurrentUpdateFrame;
static U32 sDebugInserted;
static U32 sDebugVisible;
public:
// Global setting for update rate
static F32 sUpdateFactor;
};// end of class definition
#endif // LL_LLFLEXIBLEOBJECT_H
|