llflexibleobject.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llflexibleobject.h
  3.  * @author JJ Ventrella, Andrew Meadows, Tom Yedwab
  4.  * @brief Flexible object definition
  5.  *
  6.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2006-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. /**
  34.  * This is for specifying objects in the world that are animated and 
  35.  * rendered locally - on the viewer. Flexible Objects are linear arrays
  36.  * of positions, which stay at a fixed distance from each other. One 
  37.  * position is fixed as an "anchor" and is attached to some other object 
  38.  * in the world, determined by the server. All the other positions are 
  39.  * updated according to local physics. 
  40.  */
  41. #ifndef LL_LLFLEXIBLEOBJECT_H
  42. #define LL_LLFLEXIBLEOBJECT_H
  43. #include "llprimitive.h"
  44. #include "llvovolume.h"
  45. #include "llwind.h"
  46. // 10 ms for the whole thing!
  47. const F32 FLEXIBLE_OBJECT_TIMESLICE = 0.003f;
  48. const U32 FLEXIBLE_OBJECT_MAX_LOD = 10;
  49. // See llprimitive.h for LLFlexibleObjectData and DEFAULT/MIN/MAX values 
  50. //-------------------------------------------------------------------
  51. struct LLFlexibleObjectSection
  52. {
  53. // Input parameters
  54. LLVector2 mScale;
  55. LLQuaternion mAxisRotation;
  56. // Simulated state
  57. LLVector3 mPosition;
  58. LLVector3 mVelocity;
  59. LLVector3 mDirection;
  60. LLQuaternion mRotation;
  61. // Derivatives (Not all currently used, will come back with LLVolume changes to automagically generate normals)
  62. LLVector3 mdPosition;
  63. //LLMatrix4 mRotScale;
  64. //LLMatrix4 mdRotScale;
  65. };
  66. //---------------------------------------------------------
  67. // The LLVolumeImplFlexible class 
  68. //---------------------------------------------------------
  69. class LLVolumeImplFlexible : public LLVolumeInterface
  70. {
  71. public:
  72. LLVolumeImplFlexible(LLViewerObject* volume, LLFlexibleObjectData* attributes);
  73. // Implements LLVolumeInterface
  74. U32 getID() const { return mID; }
  75. LLVector3 getFramePosition() const;
  76. LLQuaternion getFrameRotation() const;
  77. LLVolumeInterfaceType getInterfaceType() const { return INTERFACE_FLEXIBLE; }
  78. BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  79. BOOL doUpdateGeometry(LLDrawable *drawable);
  80. LLVector3 getPivotPosition() const;
  81. void onSetVolume(const LLVolumeParams &volume_params, const S32 detail);
  82. void onSetScale(const LLVector3 &scale, BOOL damped);
  83. void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin);
  84. void onShift(const LLVector3 &shift_vector);
  85. bool isVolumeUnique() const { return true; }
  86. bool isVolumeGlobal() const { return true; }
  87. bool isActive() const { return true; }
  88. const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
  89. void updateRelativeXform();
  90. void doFlexibleUpdate(); // Called to update the simulation
  91. void doFlexibleRebuild(); // Called to rebuild the geometry
  92. void preRebuild();
  93. //void setAttributes( LLFlexibleObjectData );
  94. void setParentPositionAndRotationDirectly( LLVector3 p, LLQuaternion r );
  95. void setUsingCollisionSphere( bool u );
  96. void setCollisionSphere( LLVector3 position, F32 radius );
  97. void setRenderingCollisionSphere( bool r);
  98. LLVector3 getEndPosition();
  99. LLQuaternion getEndRotation();
  100. LLVector3 getNodePosition( int nodeIndex );
  101. LLVector3 getAnchorPosition() const;
  102. private:
  103. //--------------------------------------
  104. // private members
  105. //--------------------------------------
  106.     // Backlink only; don't make this an LLPointer.
  107. LLViewerObject* mVO;
  108. LLTimer mTimer;
  109. LLVector3 mAnchorPosition;
  110. LLVector3 mParentPosition;
  111. LLQuaternion mParentRotation;
  112. LLQuaternion mLastFrameRotation;
  113. LLQuaternion mLastSegmentRotation;
  114. BOOL mInitialized;
  115. BOOL mUpdated;
  116. LLFlexibleObjectData* mAttributes;
  117. LLFlexibleObjectSection mSection [ (1<<FLEXIBLE_OBJECT_MAX_SECTIONS)+1 ];
  118. S32 mInitializedRes;
  119. S32 mSimulateRes;
  120. S32 mRenderRes;
  121. U32 mFrameNum;
  122. LLVector3 mCollisionSpherePosition;
  123. F32 mCollisionSphereRadius;
  124. U32 mID;
  125. //--------------------------------------
  126. // private methods
  127. //--------------------------------------
  128. void setAttributesOfAllSections (LLVector3* inScale = NULL);
  129. void remapSections(LLFlexibleObjectSection *source, S32 source_sections,
  130.  LLFlexibleObjectSection *dest, S32 dest_sections);
  131. public:
  132. // Global setting for update rate
  133. static F32 sUpdateFactor;
  134. };// end of class definition
  135. #endif // LL_LLFLEXIBLEOBJECT_H