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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llprimitive.h
  3.  * @brief LLPrimitive base class
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLPRIMITIVE_H
  33. #define LL_LLPRIMITIVE_H
  34. #include "lluuid.h"
  35. #include "v3math.h"
  36. #include "xform.h"
  37. #include "message.h"
  38. #include "llpointer.h"
  39. #include "llvolume.h"
  40. #include "lltextureentry.h"
  41. #include "llprimtexturelist.h"
  42. // Moved to stdtypes.h --JC
  43. // typedef U8 LLPCode;
  44. class LLMessageSystem;
  45. class LLVolumeParams;
  46. class LLColor4;
  47. class LLColor3;
  48. class LLTextureEntry;
  49. class LLDataPacker;
  50. class LLVolumeMgr;
  51. enum LLGeomType // NOTE: same vals as GL Ids
  52. {
  53. LLInvalid   = 0,
  54. LLLineLoop  = 2,
  55. LLLineStrip = 3,
  56. LLTriangles = 4,
  57. LLTriStrip  = 5,
  58. LLTriFan    = 6,
  59. LLQuads     = 7, 
  60. LLQuadStrip = 8
  61. };
  62. class LLVolume;
  63. /**
  64.  * exported constants
  65.  */
  66. extern const F32 OBJECT_CUT_MIN;
  67. extern const F32 OBJECT_CUT_MAX;
  68. extern const F32 OBJECT_CUT_INC;
  69. extern const F32 OBJECT_MIN_CUT_INC;
  70. extern const F32 OBJECT_ROTATION_PRECISION;
  71. extern const F32 OBJECT_TWIST_MIN;
  72. extern const F32 OBJECT_TWIST_MAX;
  73. extern const F32 OBJECT_TWIST_INC;
  74. // This is used for linear paths,
  75. // since twist is used in a slightly different manner.
  76. extern const F32 OBJECT_TWIST_LINEAR_MIN;
  77. extern const F32 OBJECT_TWIST_LINEAR_MAX;
  78. extern const F32 OBJECT_TWIST_LINEAR_INC;
  79. extern const F32 OBJECT_MIN_HOLE_SIZE;
  80. extern const F32 OBJECT_MAX_HOLE_SIZE_X;
  81. extern const F32 OBJECT_MAX_HOLE_SIZE_Y;
  82. // Revolutions parameters.
  83. extern const F32 OBJECT_REV_MIN;
  84. extern const F32 OBJECT_REV_MAX;
  85. extern const F32 OBJECT_REV_INC;
  86. extern const char *SCULPT_DEFAULT_TEXTURE;
  87. //============================================================================
  88. // TomY: Base class for things that pack & unpack themselves
  89. class LLNetworkData
  90. {
  91. public:
  92. // Extra parameter IDs
  93. enum
  94. {
  95. PARAMS_FLEXIBLE = 0x10,
  96. PARAMS_LIGHT    = 0x20,
  97. PARAMS_SCULPT   = 0x30,
  98. PARAMS_LIGHT_IMAGE = 0x40,
  99. };
  100. public:
  101. U16 mType;
  102. virtual ~LLNetworkData() {};
  103. virtual BOOL pack(LLDataPacker &dp) const = 0;
  104. virtual BOOL unpack(LLDataPacker &dp) = 0;
  105. virtual bool operator==(const LLNetworkData& data) const = 0;
  106. virtual void copy(const LLNetworkData& data) = 0;
  107. static BOOL isValid(U16 param_type, U32 size);
  108. };
  109. extern const F32 LIGHT_MIN_RADIUS;
  110. extern const F32 LIGHT_DEFAULT_RADIUS;
  111. extern const F32 LIGHT_MAX_RADIUS;
  112. extern const F32 LIGHT_MIN_FALLOFF;
  113. extern const F32 LIGHT_DEFAULT_FALLOFF;
  114. extern const F32 LIGHT_MAX_FALLOFF;
  115. extern const F32 LIGHT_MIN_CUTOFF;
  116. extern const F32 LIGHT_DEFAULT_CUTOFF;
  117. extern const F32 LIGHT_MAX_CUTOFF;
  118. class LLLightParams : public LLNetworkData
  119. {
  120. protected:
  121. LLColor4 mColor; // alpha = intensity
  122. F32 mRadius;
  123. F32 mFalloff;
  124. F32 mCutoff;
  125. public:
  126. LLLightParams();
  127. /*virtual*/ BOOL pack(LLDataPacker &dp) const;
  128. /*virtual*/ BOOL unpack(LLDataPacker &dp);
  129. /*virtual*/ bool operator==(const LLNetworkData& data) const;
  130. /*virtual*/ void copy(const LLNetworkData& data);
  131. // LLSD implementations here are provided by Eddy Stryker.
  132. // NOTE: there are currently unused in protocols
  133. LLSD asLLSD() const;
  134. operator LLSD() const { return asLLSD(); }
  135. bool fromLLSD(LLSD& sd);
  136. void setColor(const LLColor4& color) { mColor = color; mColor.clamp(); }
  137. void setRadius(F32 radius) { mRadius = llclamp(radius, LIGHT_MIN_RADIUS, LIGHT_MAX_RADIUS); }
  138. void setFalloff(F32 falloff) { mFalloff = llclamp(falloff, LIGHT_MIN_FALLOFF, LIGHT_MAX_FALLOFF); }
  139. void setCutoff(F32 cutoff) { mCutoff = llclamp(cutoff, LIGHT_MIN_CUTOFF, LIGHT_MAX_CUTOFF); }
  140. LLColor4 getColor() const { return mColor; }
  141. F32 getRadius() const { return mRadius; }
  142. F32 getFalloff() const { return mFalloff; }
  143. F32 getCutoff() const { return mCutoff; }
  144. };
  145. //-------------------------------------------------
  146. // This structure is also used in the part of the 
  147. // code that creates new flexible objects.
  148. //-------------------------------------------------
  149. // These were made into enums so that they could be used as fixed size
  150. // array bounds.
  151. enum EFlexibleObjectConst
  152. {
  153. // "Softness" => [0,3], increments of 1
  154. // Represents powers of 2: 0 -> 1, 3 -> 8
  155. FLEXIBLE_OBJECT_MIN_SECTIONS = 0,
  156. FLEXIBLE_OBJECT_DEFAULT_NUM_SECTIONS = 2,
  157. FLEXIBLE_OBJECT_MAX_SECTIONS = 3
  158. };
  159. // "Tension" => [0,10], increments of 0.1
  160. extern const F32 FLEXIBLE_OBJECT_MIN_TENSION;
  161. extern const F32 FLEXIBLE_OBJECT_DEFAULT_TENSION;
  162. extern const F32 FLEXIBLE_OBJECT_MAX_TENSION;
  163. // "Drag" => [0,10], increments of 0.1
  164. extern const F32 FLEXIBLE_OBJECT_MIN_AIR_FRICTION;
  165. extern const F32 FLEXIBLE_OBJECT_DEFAULT_AIR_FRICTION;
  166. extern const F32 FLEXIBLE_OBJECT_MAX_AIR_FRICTION;
  167. // "Gravity" = [-10,10], increments of 0.1
  168. extern const F32 FLEXIBLE_OBJECT_MIN_GRAVITY;
  169. extern const F32 FLEXIBLE_OBJECT_DEFAULT_GRAVITY;
  170. extern const F32 FLEXIBLE_OBJECT_MAX_GRAVITY;
  171. // "Wind" = [0,10], increments of 0.1
  172. extern const F32 FLEXIBLE_OBJECT_MIN_WIND_SENSITIVITY;
  173. extern const F32 FLEXIBLE_OBJECT_DEFAULT_WIND_SENSITIVITY;
  174. extern const F32 FLEXIBLE_OBJECT_MAX_WIND_SENSITIVITY;
  175. extern const F32 FLEXIBLE_OBJECT_MAX_INTERNAL_TENSION_FORCE;
  176. extern const F32 FLEXIBLE_OBJECT_DEFAULT_LENGTH;
  177. extern const BOOL FLEXIBLE_OBJECT_DEFAULT_USING_COLLISION_SPHERE;
  178. extern const BOOL FLEXIBLE_OBJECT_DEFAULT_RENDERING_COLLISION_SPHERE;
  179. class LLFlexibleObjectData : public LLNetworkData
  180. {
  181. protected:
  182. S32 mSimulateLOD; // 2^n = number of simulated sections
  183. F32 mGravity;
  184. F32 mAirFriction; // higher is more stable, but too much looks like it's underwater
  185. F32 mWindSensitivity; // interacts with tension, air friction, and gravity
  186. F32 mTension; //interacts in complex ways with other parameters
  187. LLVector3 mUserForce; // custom user-defined force vector
  188. //BOOL mUsingCollisionSphere;
  189. //BOOL mRenderingCollisionSphere;
  190. public:
  191. void setSimulateLOD(S32 lod) { mSimulateLOD = llclamp(lod, (S32)FLEXIBLE_OBJECT_MIN_SECTIONS, (S32)FLEXIBLE_OBJECT_MAX_SECTIONS); }
  192. void setGravity(F32 gravity) { mGravity = llclamp(gravity, FLEXIBLE_OBJECT_MIN_GRAVITY, FLEXIBLE_OBJECT_MAX_GRAVITY); }
  193. void setAirFriction(F32 friction) { mAirFriction = llclamp(friction, FLEXIBLE_OBJECT_MIN_AIR_FRICTION, FLEXIBLE_OBJECT_MAX_AIR_FRICTION); }
  194. void setWindSensitivity(F32 wind) { mWindSensitivity = llclamp(wind, FLEXIBLE_OBJECT_MIN_WIND_SENSITIVITY, FLEXIBLE_OBJECT_MAX_WIND_SENSITIVITY); }
  195. void setTension(F32 tension) { mTension = llclamp(tension, FLEXIBLE_OBJECT_MIN_TENSION, FLEXIBLE_OBJECT_MAX_TENSION); }
  196. void setUserForce(LLVector3 &force) { mUserForce = force; }
  197. S32 getSimulateLOD() const { return mSimulateLOD; }
  198. F32 getGravity() const { return mGravity; }
  199. F32 getAirFriction() const { return mAirFriction; }
  200. F32 getWindSensitivity() const { return mWindSensitivity; }
  201. F32 getTension() const { return mTension; }
  202. LLVector3 getUserForce() const { return mUserForce; }
  203. //------ the constructor for the structure ------------
  204. LLFlexibleObjectData();
  205. BOOL pack(LLDataPacker &dp) const;
  206. BOOL unpack(LLDataPacker &dp);
  207. bool operator==(const LLNetworkData& data) const;
  208. void copy(const LLNetworkData& data);
  209. LLSD asLLSD() const;
  210. operator LLSD() const { return asLLSD(); }
  211. bool fromLLSD(LLSD& sd);
  212. };// end of attributes structure
  213. class LLSculptParams : public LLNetworkData
  214. {
  215. protected:
  216. LLUUID mSculptTexture;
  217. U8 mSculptType;
  218. public:
  219. LLSculptParams();
  220. /*virtual*/ BOOL pack(LLDataPacker &dp) const;
  221. /*virtual*/ BOOL unpack(LLDataPacker &dp);
  222. /*virtual*/ bool operator==(const LLNetworkData& data) const;
  223. /*virtual*/ void copy(const LLNetworkData& data);
  224. LLSD asLLSD() const;
  225. operator LLSD() const { return asLLSD(); }
  226. bool fromLLSD(LLSD& sd);
  227. void setSculptTexture(const LLUUID& id) { mSculptTexture = id; }
  228. LLUUID getSculptTexture() const         { return mSculptTexture; }
  229. void setSculptType(U8 type)             { mSculptType = type; }
  230. U8 getSculptType() const                { return mSculptType; }
  231. };
  232. class LLLightImageParams : public LLNetworkData
  233. {
  234. protected:
  235. LLUUID mLightTexture;
  236. LLVector3 mParams;
  237. public:
  238. LLLightImageParams();
  239. /*virtual*/ BOOL pack(LLDataPacker &dp) const;
  240. /*virtual*/ BOOL unpack(LLDataPacker &dp);
  241. /*virtual*/ bool operator==(const LLNetworkData& data) const;
  242. /*virtual*/ void copy(const LLNetworkData& data);
  243. LLSD asLLSD() const;
  244. operator LLSD() const { return asLLSD(); }
  245. bool fromLLSD(LLSD& sd);
  246. void setLightTexture(const LLUUID& id) { mLightTexture = id; }
  247. LLUUID getLightTexture() const         { return mLightTexture; }
  248. void setParams(const LLVector3& params) { mParams = params; }
  249. LLVector3 getParams() const    { return mParams; }
  250. };
  251. class LLPrimitive : public LLXform
  252. {
  253. public:
  254. // HACK for removing LLPrimitive's dependency on gVolumeMgr global.
  255. // If a different LLVolumeManager is instantiated and set early enough
  256. // then the LLPrimitive class will use it instead of gVolumeMgr.
  257. static LLVolumeMgr* getVolumeManager() { return sVolumeManager; }
  258. static void setVolumeManager( LLVolumeMgr* volume_manager);
  259. static bool cleanupVolumeManager();
  260. // these flags influence how the RigidBody representation is built
  261. static const U32 PRIM_FLAG_PHANTOM  = 0x1 << 0;
  262. static const U32 PRIM_FLAG_VOLUME_DETECT  = 0x1 << 1;
  263. static const U32 PRIM_FLAG_DYNAMIC  = 0x1 << 2;
  264. static const U32 PRIM_FLAG_AVATAR  = 0x1 << 3;
  265. static const U32 PRIM_FLAG_SCULPT  = 0x1 << 4;
  266. // not used yet, but soon
  267. static const U32 PRIM_FLAG_COLLISION_CALLBACK  = 0x1 << 5;
  268. static const U32 PRIM_FLAG_CONVEX  = 0x1 << 6;
  269. static const U32 PRIM_FLAG_DEFAULT_VOLUME = 0x1 << 7;
  270. static const U32 PRIM_FLAG_SITTING = 0x1 << 8;
  271. static const U32 PRIM_FLAG_SITTING_ON_GROUND = 0x1 << 9; // Set along with PRIM_FLAG_SITTING
  272. LLPrimitive();
  273. virtual ~LLPrimitive();
  274. void clearTextureList();
  275. static LLPrimitive *createPrimitive(LLPCode p_code);
  276. void init_primitive(LLPCode p_code);
  277. void setPCode(const LLPCode pcode);
  278. const LLVolume *getVolumeConst() const { return mVolumep; } // HACK for Windoze confusion about ostream operator in LLVolume
  279. LLVolume *getVolume() const { return mVolumep; }
  280. virtual BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
  281. // Modify texture entry properties
  282. inline BOOL validTE(const U8 te_num) const;
  283. LLTextureEntry* getTE(const U8 te_num) const;
  284. virtual void setNumTEs(const U8 num_tes);
  285. virtual void setAllTETextures(const LLUUID &tex_id);
  286. virtual void setTE(const U8 index, const LLTextureEntry& te);
  287. virtual S32 setTEColor(const U8 te, const LLColor4 &color);
  288. virtual S32 setTEColor(const U8 te, const LLColor3 &color);
  289. virtual S32 setTEAlpha(const U8 te, const F32 alpha);
  290. virtual S32 setTETexture(const U8 te, const LLUUID &tex_id);
  291. virtual S32 setTEScale (const U8 te, const F32 s, const F32 t);
  292. virtual S32 setTEScaleS(const U8 te, const F32 s);
  293. virtual S32 setTEScaleT(const U8 te, const F32 t);
  294. virtual S32 setTEOffset (const U8 te, const F32 s, const F32 t);
  295. virtual S32 setTEOffsetS(const U8 te, const F32 s);
  296. virtual S32 setTEOffsetT(const U8 te, const F32 t);
  297. virtual S32 setTERotation(const U8 te, const F32 r);
  298. virtual S32 setTEBumpShinyFullbright(const U8 te, const U8 bump);
  299. virtual S32 setTEBumpShiny(const U8 te, const U8 bump);
  300. virtual S32 setTEMediaTexGen(const U8 te, const U8 media);
  301. virtual S32 setTEBumpmap(const U8 te, const U8 bump);
  302. virtual S32 setTETexGen(const U8 te, const U8 texgen);
  303. virtual S32 setTEShiny(const U8 te, const U8 shiny);
  304. virtual S32 setTEFullbright(const U8 te, const U8 fullbright);
  305. virtual S32 setTEMediaFlags(const U8 te, const U8 flags);
  306. virtual S32 setTEGlow(const U8 te, const F32 glow);
  307. virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed
  308. void copyTEs(const LLPrimitive *primitive);
  309. S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;
  310. S32 unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 data_size, U8 face_count, EMsgVariableType type);
  311. BOOL packTEMessage(LLMessageSystem *mesgsys) const;
  312. BOOL packTEMessage(LLDataPacker &dp) const;
  313. S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name);
  314. S32 unpackTEMessage(LLMessageSystem *mesgsys, char *block_name, const S32 block_num); // Variable num of blocks
  315. BOOL unpackTEMessage(LLDataPacker &dp);
  316. #ifdef CHECK_FOR_FINITE
  317. inline void setPosition(const LLVector3& pos);
  318. inline void setPosition(const F32 x, const F32 y, const F32 z);
  319. inline void addPosition(const LLVector3& pos);
  320. inline void setAngularVelocity(const LLVector3& avel);
  321. inline void setAngularVelocity(const F32 x, const F32 y, const F32 z);
  322. inline void setVelocity(const LLVector3& vel);
  323. inline void setVelocity(const F32 x, const F32 y, const F32 z);
  324. inline void setVelocityX(const F32 x);
  325. inline void setVelocityY(const F32 y);
  326. inline void setVelocityZ(const F32 z);
  327. inline void addVelocity(const LLVector3& vel);
  328. inline void setAcceleration(const LLVector3& accel);
  329. inline void setAcceleration(const F32 x, const F32 y, const F32 z);
  330. #else
  331. // Don't override the base LLXForm operators.
  332. // Special case for setPosition.  If not check-for-finite, fall through to LLXform method.
  333. // void setPosition(F32 x, F32 y, F32 z)
  334. // void setPosition(LLVector3)
  335. void  setAngularVelocity(const LLVector3& avel) { mAngularVelocity = avel; }
  336. void  setAngularVelocity(const F32 x, const F32 y, const F32 z) { mAngularVelocity.setVec(x,y,z); }
  337. void  setVelocity(const LLVector3& vel) { mVelocity = vel; }
  338. void  setVelocity(const F32 x, const F32 y, const F32 z) { mVelocity.setVec(x,y,z); }
  339. void  setVelocityX(const F32 x) { mVelocity.mV[VX] = x; }
  340. void  setVelocityY(const F32 y) { mVelocity.mV[VY] = y; }
  341. void  setVelocityZ(const F32 z) { mVelocity.mV[VZ] = z; }
  342. void  addVelocity(const LLVector3& vel) { mVelocity += vel; }
  343. void  setAcceleration(const LLVector3& accel) { mAcceleration = accel; }
  344. void  setAcceleration(const F32 x, const F32 y, const F32 z) { mAcceleration.setVec(x,y,z); }
  345. #endif
  346. LLPCode getPCode() const { return mPrimitiveCode; }
  347. std::string getPCodeString() const { return pCodeToString(mPrimitiveCode); }
  348. const LLVector3& getAngularVelocity() const { return mAngularVelocity; }
  349. const LLVector3& getVelocity() const { return mVelocity; }
  350. const LLVector3& getAcceleration() const { return mAcceleration; }
  351. U8 getNumTEs() const { return mTextureList.size(); }
  352. U8 getExpectedNumTEs() const;
  353. U8 getMaterial() const { return mMaterial; }
  354. void setVolumeType(const U8 code);
  355. U8 getVolumeType();
  356. // clears existing textures
  357. // copies the contents of other_list into mEntryList
  358. void copyTextureList(const LLPrimTextureList& other_list);
  359. // clears existing textures
  360. // takes the contents of other_list and clears other_list
  361. void takeTextureList(LLPrimTextureList& other_list);
  362. inline BOOL isAvatar() const;
  363. inline BOOL isSittingAvatar() const;
  364. inline BOOL isSittingAvatarOnGround() const;
  365. void setFlags(U32 flags) { mMiscFlags = flags; }
  366. void addFlags(U32 flags) { mMiscFlags |= flags; }
  367. void removeFlags(U32 flags) { mMiscFlags &= ~flags; }
  368. U32 getFlags() const { return mMiscFlags; }
  369. static std::string pCodeToString(const LLPCode pcode);
  370. static LLPCode legacyToPCode(const U8 legacy);
  371. static U8 pCodeToLegacy(const LLPCode pcode);
  372. static bool getTESTAxes(const U8 face, U32* s_axis, U32* t_axis);
  373. inline static BOOL isPrimitive(const LLPCode pcode);
  374. inline static BOOL isApp(const LLPCode pcode);
  375. protected:
  376. LLPCode mPrimitiveCode; // Primitive code
  377. LLVector3 mVelocity; // how fast are we moving?
  378. LLVector3 mAcceleration; // are we under constant acceleration?
  379. LLVector3 mAngularVelocity; // angular velocity
  380. LLPointer<LLVolume> mVolumep;
  381. LLPrimTextureList mTextureList; // list of texture GUIDs, scales, offsets
  382. U8 mMaterial; // Material code
  383. U8 mNumTEs; // # of faces on the primitve
  384. U32  mMiscFlags; // home for misc bools
  385. static LLVolumeMgr* sVolumeManager;
  386. };
  387. inline BOOL LLPrimitive::isAvatar() const
  388. {
  389. return ( LL_PCODE_LEGACY_AVATAR == mPrimitiveCode ) ? TRUE : FALSE;
  390. }
  391. inline BOOL LLPrimitive::isSittingAvatar() const
  392. {
  393. // this is only used server-side
  394. return ( LL_PCODE_LEGACY_AVATAR == mPrimitiveCode 
  395.  &&  ((getFlags() & (PRIM_FLAG_SITTING | PRIM_FLAG_SITTING_ON_GROUND)) != 0) ) ? TRUE : FALSE;
  396. }
  397. inline BOOL LLPrimitive::isSittingAvatarOnGround() const
  398. {
  399. // this is only used server-side
  400. return ( LL_PCODE_LEGACY_AVATAR == mPrimitiveCode 
  401.  &&  ((getFlags() & PRIM_FLAG_SITTING_ON_GROUND) != 0) ) ? TRUE : FALSE;
  402. }
  403. // static
  404. inline BOOL LLPrimitive::isPrimitive(const LLPCode pcode)
  405. {
  406. LLPCode base_type = pcode & LL_PCODE_BASE_MASK;
  407. if (base_type && (base_type < LL_PCODE_APP))
  408. {
  409. return TRUE;
  410. }
  411. return FALSE;
  412. }
  413. // static
  414. inline BOOL LLPrimitive::isApp(const LLPCode pcode)
  415. {
  416. LLPCode base_type = pcode & LL_PCODE_BASE_MASK;
  417. return (base_type == LL_PCODE_APP);
  418. }
  419. #ifdef CHECK_FOR_FINITE
  420. // Special case for setPosition.  If not check-for-finite, fall through to LLXform method.
  421. void LLPrimitive::setPosition(const F32 x, const F32 y, const F32 z)
  422. {
  423. if (llfinite(x) && llfinite(y) && llfinite(z))
  424. {
  425. LLXform::setPosition(x, y, z);
  426. }
  427. else
  428. {
  429. llerrs << "Non Finite in LLPrimitive::setPosition(x,y,z) for " << pCodeToString(mPrimitiveCode) << llendl;
  430. }
  431. }
  432. // Special case for setPosition.  If not check-for-finite, fall through to LLXform method.
  433. void LLPrimitive::setPosition(const LLVector3& pos)
  434. {
  435. if (pos.isFinite())
  436. {
  437. LLXform::setPosition(pos);
  438. }
  439. else
  440. {
  441. llerrs << "Non Finite in LLPrimitive::setPosition(LLVector3) for " << pCodeToString(mPrimitiveCode) << llendl;
  442. }
  443. }
  444. void LLPrimitive::setAngularVelocity(const LLVector3& avel)
  445. if (avel.isFinite())
  446. {
  447. mAngularVelocity = avel;
  448. }
  449. else
  450. {
  451. llerror("Non Finite in LLPrimitive::setAngularVelocity", 0);
  452. }
  453. }
  454. void LLPrimitive::setAngularVelocity(const F32 x, const F32 y, const F32 z)
  455. if (llfinite(x) && llfinite(y) && llfinite(z))
  456. {
  457. mAngularVelocity.setVec(x,y,z);
  458. }
  459. else
  460. {
  461. llerror("Non Finite in LLPrimitive::setAngularVelocity", 0);
  462. }
  463. }
  464. void LLPrimitive::setVelocity(const LLVector3& vel)
  465. if (vel.isFinite())
  466. {
  467. mVelocity = vel; 
  468. }
  469. else
  470. {
  471. llerrs << "Non Finite in LLPrimitive::setVelocity(LLVector3) for " << pCodeToString(mPrimitiveCode) << llendl;
  472. }
  473. }
  474. void LLPrimitive::setVelocity(const F32 x, const F32 y, const F32 z)
  475. if (llfinite(x) && llfinite(y) && llfinite(z))
  476. {
  477. mVelocity.setVec(x,y,z); 
  478. }
  479. else
  480. {
  481. llerrs << "Non Finite in LLPrimitive::setVelocity(F32,F32,F32) for " << pCodeToString(mPrimitiveCode) << llendl;
  482. }
  483. }
  484. void LLPrimitive::setVelocityX(const F32 x)
  485. if (llfinite(x))
  486. {
  487. mVelocity.mV[VX] = x;
  488. }
  489. else
  490. {
  491. llerror("Non Finite in LLPrimitive::setVelocityX", 0);
  492. }
  493. }
  494. void LLPrimitive::setVelocityY(const F32 y)
  495. if (llfinite(y))
  496. {
  497. mVelocity.mV[VY] = y;
  498. }
  499. else
  500. {
  501. llerror("Non Finite in LLPrimitive::setVelocityY", 0);
  502. }
  503. }
  504. void LLPrimitive::setVelocityZ(const F32 z)
  505. if (llfinite(z))
  506. {
  507. mVelocity.mV[VZ] = z;
  508. }
  509. else
  510. {
  511. llerror("Non Finite in LLPrimitive::setVelocityZ", 0);
  512. }
  513. }
  514. void LLPrimitive::addVelocity(const LLVector3& vel)
  515. if (vel.isFinite())
  516. {
  517. mVelocity += vel;
  518. }
  519. else
  520. {
  521. llerror("Non Finite in LLPrimitive::addVelocity", 0);
  522. }
  523. }
  524. void LLPrimitive::setAcceleration(const LLVector3& accel)
  525. if (accel.isFinite())
  526. {
  527. mAcceleration = accel; 
  528. }
  529. else
  530. {
  531. llerrs << "Non Finite in LLPrimitive::setAcceleration(LLVector3) for " << pCodeToString(mPrimitiveCode) << llendl;
  532. }
  533. }
  534. void LLPrimitive::setAcceleration(const F32 x, const F32 y, const F32 z)
  535. if (llfinite(x) && llfinite(y) && llfinite(z))
  536. {
  537. mAcceleration.setVec(x,y,z); 
  538. }
  539. else
  540. {
  541. llerrs << "Non Finite in LLPrimitive::setAcceleration(F32,F32,F32) for " << pCodeToString(mPrimitiveCode) << llendl;
  542. }
  543. }
  544. #endif // CHECK_FOR_FINITE
  545. inline BOOL LLPrimitive::validTE(const U8 te_num) const
  546. {
  547. return (mNumTEs && te_num < mNumTEs);
  548. }
  549. #endif