PageRenderTime 32ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/llmessage/partsyspacket.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 1297 lines | 864 code | 230 blank | 203 comment | 174 complexity | 1b03ab231ff3b2d1dfbe6edc792f8eb5 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file partsyspacket.cpp
  3. * @brief Object for packing particle system initialization parameters
  4. * before sending them over the network.
  5. *
  6. * $LicenseInfo:firstyear=2000&license=viewerlgpl$
  7. * Second Life Viewer Source Code
  8. * Copyright (C) 2010, Linden Research, Inc.
  9. *
  10. * This library is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU Lesser General Public
  12. * License as published by the Free Software Foundation;
  13. * version 2.1 of the License only.
  14. *
  15. * This library is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * Lesser General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Lesser General Public
  21. * License along with this library; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  23. *
  24. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  25. * $/LicenseInfo$
  26. */
  27. #include "linden_common.h"
  28. #include "partsyspacket.h"
  29. #include "imageids.h"
  30. // this function is global
  31. void gSetInitDataDefaults(LLPartInitData *setMe)
  32. {
  33. U32 i;
  34. //for(i = 0; i < 18; i++)
  35. //{
  36. // setMe->k[i] = 0.0f;
  37. //}
  38. //setMe->kill_p[0] = setMe->kill_p[1] = setMe->kill_p[2] = 0.0f;
  39. //setMe->kill_p[3] = -0.2f; // time parameter, die when t= 5.0f
  40. //setMe->kill_p[4] = 1.0f;
  41. //setMe->kill_p[5] = -0.5f; // or radius == 2 (contracting)
  42. //setMe->bounce_p[0] = setMe->bounce_p[1] =
  43. // setMe->bounce_p[2] = setMe->bounce_p[3] = 0.0f;
  44. //setMe->bounce_p[4] = 1.0f;
  45. setMe->bounce_b = 1.0f;
  46. // i just changed the meaning of bounce_b
  47. // its now the attenuation from revlecting your velocity across the normal
  48. // set by bounce_p
  49. //setMe->pos_ranges[0] = setMe->pos_ranges[2] = setMe->pos_ranges[4] = -1.0f;
  50. //setMe->pos_ranges[1] = setMe->pos_ranges[3] = setMe->pos_ranges[5] = 1.0f;
  51. //setMe->vel_ranges[0] = setMe->vel_ranges[2] = setMe->vel_ranges[4] = -1.0f;
  52. //setMe->vel_ranges[1] = setMe->vel_ranges[3] = setMe->vel_ranges[5] = 1.0f;
  53. for(i = 0; i < 3; i++)
  54. {
  55. setMe->diffEqAlpha[i] = 0.0f;
  56. setMe->diffEqScale[i] = 0.0f;
  57. }
  58. setMe->scale_range[0] = 1.00f;
  59. setMe->scale_range[1] = 5.00f;
  60. setMe->scale_range[2] = setMe->scale_range[3] = 0.0f;
  61. setMe->alpha_range[0] = setMe->alpha_range[1] = 1.0f;
  62. setMe->alpha_range[2] = setMe->alpha_range[3] = 0.0f;
  63. setMe->vel_offset[0] = 0.0f;
  64. setMe->vel_offset[1] = 0.0f;
  65. setMe->vel_offset[2] = 0.0f;
  66. // start dropping particles when I'm more then one sim away
  67. setMe->mDistBeginFadeout = 256.0f;
  68. setMe->mDistEndFadeout = 1.414f * 512.0f;
  69. // stop displaying particles when I'm more then two sim diagonals away
  70. setMe->mImageUuid = IMG_SHOT;
  71. for(i = 0; i < 8; i++)
  72. {
  73. setMe->mFlags[i] = 0x00;
  74. }
  75. setMe->createMe = TRUE;
  76. setMe->maxParticles = 25;
  77. setMe->initialParticles = 25;
  78. //These defaults are for an explosion - a short lived set of debris affected by gravity.
  79. //Action flags default to PART_SYS_AFFECTED_BY_WIND + PART_SYS_AFFECTED_BY_GRAVITY + PART_SYS_DISTANCE_DEATH
  80. setMe->mFlags[PART_SYS_ACTION_BYTE] = PART_SYS_AFFECTED_BY_WIND | PART_SYS_AFFECTED_BY_GRAVITY | PART_SYS_DISTANCE_DEATH;
  81. setMe->mFlags[PART_SYS_KILL_BYTE] = PART_SYS_DISTANCE_DEATH + PART_SYS_TIME_DEATH;
  82. setMe->killPlaneNormal[0] = 0.0f;setMe->killPlaneNormal[1] = 0.0f;setMe->killPlaneNormal[2] = 1.0f; //Straight up
  83. setMe->killPlaneZ = 0.0f; //get local ground z as an approximation if turn on PART_SYS_KILL_PLANE
  84. setMe->bouncePlaneNormal[0] = 0.0f;setMe->bouncePlaneNormal[1] = 0.0f;setMe->bouncePlaneNormal[2] = 1.0f; //Straight up
  85. setMe->bouncePlaneZ = 0.0f; //get local ground z as an approximation if turn on PART_SYS_BOUNCE
  86. setMe->spawnRange = 1.0f;
  87. setMe->spawnFrequency = 0.0f; //Create the instant one dies
  88. setMe->spawnFreqencyRange = 0.0f;
  89. setMe->spawnDirection[0] = 0.0f;setMe->spawnDirection[1] = 0.0f;setMe->spawnDirection[2] = 1.0f; //Straight up
  90. setMe->spawnDirectionRange = 1.0f; //global scattering
  91. setMe->spawnVelocity = 0.75f;
  92. setMe->spawnVelocityRange = 0.25f; //velocity +/- 0.25
  93. setMe->speedLimit = 1.0f;
  94. setMe->windWeight = 0.5f; //0.0f means looks like a heavy object (if gravity is on), 1.0f means light and fluffy
  95. setMe->currentGravity[0] = 0.0f;setMe->currentGravity[1] = 0.0f;setMe->currentGravity[2] = -9.81f;
  96. //This has to be constant to allow for compression
  97. setMe->gravityWeight = 0.5f; //0.0f means boyed by air, 1.0f means it's a lead weight
  98. setMe->globalLifetime = 0.0f; //Arbitrary, but default is no global die, so doesn't matter
  99. setMe->individualLifetime = 5.0f;
  100. setMe->individualLifetimeRange = 1.0f; //Particles last 5 secs +/- 1
  101. setMe->alphaDecay = 1.0f; //normal alpha fadeout
  102. setMe->scaleDecay = 0.0f; //no scale decay
  103. setMe->distanceDeath = 10.0f; //die if hit unit radius
  104. setMe->dampMotionFactor = 0.0f;
  105. setMe->windDiffusionFactor[0] = 0.0f;
  106. setMe->windDiffusionFactor[1] = 0.0f;
  107. setMe->windDiffusionFactor[2] = 0.0f;
  108. }
  109. LLPartSysCompressedPacket::LLPartSysCompressedPacket()
  110. {
  111. // default constructor for mDefaults called implicitly/automatically here
  112. for(int i = 0; i < MAX_PART_SYS_PACKET_SIZE; i++)
  113. {
  114. mData[i] = '\0';
  115. }
  116. mNumBytes = 0;
  117. gSetInitDataDefaults(&mDefaults);
  118. }
  119. LLPartSysCompressedPacket::~LLPartSysCompressedPacket()
  120. {
  121. // no dynamic data is stored by this class, do nothing.
  122. }
  123. void LLPartSysCompressedPacket::writeFlagByte(LLPartInitData *in)
  124. {
  125. mData[0] = mData[1] = mData[2] = '\0';
  126. U32 i;
  127. //for(i = 1; i < 18; i++) {
  128. // if(in->k[i] != mDefaults.k[i])
  129. // {
  130. // mData[0] |= PART_SYS_K_MASK;
  131. // break;
  132. // }
  133. //}
  134. if(in->killPlaneZ != mDefaults.killPlaneZ ||
  135. in->killPlaneNormal[0] != mDefaults.killPlaneNormal[0] ||
  136. in->killPlaneNormal[1] != mDefaults.killPlaneNormal[1] ||
  137. in->killPlaneNormal[2] != mDefaults.killPlaneNormal[2] ||
  138. in->distanceDeath != mDefaults.distanceDeath)
  139. {
  140. mData[0] |= PART_SYS_KILL_P_MASK;
  141. }
  142. if(in->bouncePlaneZ != mDefaults.bouncePlaneZ ||
  143. in->bouncePlaneNormal[0] != mDefaults.bouncePlaneNormal[0] ||
  144. in->bouncePlaneNormal[1] != mDefaults.bouncePlaneNormal[1] ||
  145. in->bouncePlaneNormal[2] != mDefaults.bouncePlaneNormal[2])
  146. {
  147. mData[0] |= PART_SYS_BOUNCE_P_MASK;
  148. }
  149. if(in->bounce_b != mDefaults.bounce_b)
  150. {
  151. mData[0] |= PART_SYS_BOUNCE_B_MASK;
  152. }
  153. //if(in->pos_ranges[0] != mDefaults.pos_ranges[0] || in->pos_ranges[1] != mDefaults.pos_ranges[1] ||
  154. // in->pos_ranges[2] != mDefaults.pos_ranges[2] || in->pos_ranges[3] != mDefaults.pos_ranges[3] ||
  155. // in->pos_ranges[4] != mDefaults.pos_ranges[4] || in->pos_ranges[5] != mDefaults.pos_ranges[5])
  156. //{
  157. // mData[0] |= PART_SYS_POS_RANGES_MASK;
  158. //}
  159. //if(in->vel_ranges[0] != mDefaults.vel_ranges[0] || in->vel_ranges[1] != mDefaults.vel_ranges[1] ||
  160. // in->vel_ranges[2] != mDefaults.vel_ranges[2] || in->vel_ranges[3] != mDefaults.vel_ranges[3] ||
  161. // in->vel_ranges[4] != mDefaults.vel_ranges[4] || in->vel_ranges[5] != mDefaults.vel_ranges[5])
  162. //{
  163. // mData[0] |= PART_SYS_VEL_RANGES_MASK;
  164. //}
  165. if(in->diffEqAlpha[0] != mDefaults.diffEqAlpha[0] ||
  166. in->diffEqAlpha[1] != mDefaults.diffEqAlpha[1] ||
  167. in->diffEqAlpha[2] != mDefaults.diffEqAlpha[2] ||
  168. in->diffEqScale[0] != mDefaults.diffEqScale[0] ||
  169. in->diffEqScale[1] != mDefaults.diffEqScale[1] ||
  170. in->diffEqScale[2] != mDefaults.diffEqScale[2])
  171. {
  172. mData[0] |= PART_SYS_ALPHA_SCALE_DIFF_MASK;
  173. }
  174. if(in->scale_range[0] != mDefaults.scale_range[0] ||
  175. in->scale_range[1] != mDefaults.scale_range[1] ||
  176. in->scale_range[2] != mDefaults.scale_range[2] ||
  177. in->scale_range[3] != mDefaults.scale_range[3])
  178. {
  179. mData[0] |= PART_SYS_SCALE_RANGE_MASK;
  180. }
  181. if(in->alpha_range[0] != mDefaults.alpha_range[0] ||
  182. in->alpha_range[1] != mDefaults.alpha_range[1] ||
  183. in->alpha_range[2] != mDefaults.alpha_range[2] ||
  184. in->alpha_range[3] != mDefaults.alpha_range[3])
  185. {
  186. mData[2] |= PART_SYS_BYTE_3_ALPHA_MASK;
  187. }
  188. if(in->vel_offset[0] != mDefaults.vel_offset[0] ||
  189. in->vel_offset[1] != mDefaults.vel_offset[1] ||
  190. in->vel_offset[2] != mDefaults.vel_offset[2])
  191. {
  192. mData[0] |= PART_SYS_VEL_OFFSET_MASK;
  193. }
  194. if(in->mImageUuid != mDefaults.mImageUuid)
  195. {
  196. mData[0] |= PART_SYS_M_IMAGE_UUID_MASK;
  197. }
  198. for( i = 0; i < 8; i++)
  199. {
  200. if(in->mFlags[i])
  201. {
  202. mData[1] |= 1<<i;
  203. // llprintline("Flag \"%x\" gets byte \"%x\"\n", i<<i, in->mFlags[i]);
  204. }
  205. }
  206. if(in->spawnRange != mDefaults.spawnRange ||
  207. in->spawnFrequency != mDefaults.spawnFrequency ||
  208. in->spawnFreqencyRange != mDefaults.spawnFreqencyRange ||
  209. in->spawnDirection[0] != mDefaults.spawnDirection[0] ||
  210. in->spawnDirection[1] != mDefaults.spawnDirection[1] ||
  211. in->spawnDirection[2] != mDefaults.spawnDirection[2] ||
  212. in->spawnDirectionRange != mDefaults.spawnDirectionRange ||
  213. in->spawnVelocity != mDefaults.spawnVelocity ||
  214. in->spawnVelocityRange != mDefaults.spawnVelocityRange)
  215. {
  216. mData[3] |= PART_SYS_BYTE_SPAWN_MASK;
  217. }
  218. if(in->windWeight != mDefaults.windWeight ||
  219. in->currentGravity[0] != mDefaults.currentGravity[0] ||
  220. in->currentGravity[1] != mDefaults.currentGravity[1] ||
  221. in->currentGravity[2] != mDefaults.currentGravity[2] ||
  222. in->gravityWeight != mDefaults.gravityWeight)
  223. {
  224. mData[3] |= PART_SYS_BYTE_ENVIRONMENT_MASK;
  225. }
  226. if(in->globalLifetime != mDefaults.globalLifetime ||
  227. in->individualLifetime != mDefaults.individualLifetime ||
  228. in->individualLifetimeRange != mDefaults.individualLifetimeRange)
  229. {
  230. mData[3] |= PART_SYS_BYTE_LIFESPAN_MASK;
  231. }
  232. if(in->speedLimit != mDefaults.speedLimit ||
  233. in->alphaDecay != mDefaults.alphaDecay ||
  234. in->scaleDecay != mDefaults.scaleDecay ||
  235. in->dampMotionFactor != mDefaults.dampMotionFactor)
  236. {
  237. mData[3] |= PART_SYS_BYTE_DECAY_DAMP_MASK;
  238. }
  239. if(in->windDiffusionFactor[0] != mDefaults.windDiffusionFactor[0] ||
  240. in->windDiffusionFactor[1] != mDefaults.windDiffusionFactor[1] ||
  241. in->windDiffusionFactor[2] != mDefaults.windDiffusionFactor[2])
  242. {
  243. mData[3] |= PART_SYS_BYTE_WIND_DIFF_MASK;
  244. }
  245. }
  246. F32 floatFromTwoBytes(S8 bMant, S8 bExp)
  247. {
  248. F32 result = bMant;
  249. while(bExp > 0)
  250. {
  251. result *= 2.0f;
  252. bExp--;
  253. }
  254. while(bExp < 0)
  255. {
  256. result *= 0.5f;
  257. bExp++;
  258. }
  259. return result;
  260. }
  261. void twoBytesFromFloat(F32 fIn, S8 &bMant, S8 &bExp)
  262. {
  263. bExp = 0;
  264. if(fIn > 127.0f)
  265. {
  266. fIn = 127.0f;
  267. }
  268. if(fIn < -127.0f)
  269. {
  270. fIn = -127.0f;
  271. }
  272. while(fIn < 64 && fIn > -64 && bExp > -127)
  273. {
  274. fIn *= 2.0f;
  275. bExp--;
  276. }
  277. while((fIn > 128 || fIn < -128) && bExp < 127)
  278. {
  279. fIn *= 0.5f;
  280. bExp++;
  281. }
  282. bMant = (S8)fIn;
  283. }
  284. /*
  285. U32 LLPartSysCompressedPacket::writeK(LLPartInitData *in, U32 startByte)
  286. {
  287. U32 i, kFlag, i_mod_eight;
  288. S8 bMant, bExp;
  289. kFlag = startByte;
  290. startByte += 3; // 3 bytes contain enough room for 18 flag bits
  291. mData[kFlag] = 0x00;
  292. // llprintline("In the writeK\n");
  293. i_mod_eight = 0;
  294. for(i = 0; i < 18; i++)
  295. {
  296. if(in->k[i] != mDefaults.k[i])
  297. {
  298. mData[kFlag] |= 1<<i_mod_eight;
  299. twoBytesFromFloat(in->k[i], bMant, bExp);
  300. mData[startByte++] = bMant;
  301. mData[startByte++] = bExp;
  302. }
  303. i_mod_eight++;
  304. while(i_mod_eight >= 8)
  305. {
  306. kFlag++;
  307. i_mod_eight -= 8;
  308. }
  309. }
  310. return startByte;
  311. }*/
  312. U32 LLPartSysCompressedPacket::writeKill_p(LLPartInitData *in, U32 startByte)
  313. {
  314. S8 bMant, bExp;
  315. twoBytesFromFloat(in->killPlaneNormal[0], bMant, bExp);
  316. mData[startByte++] = bMant;
  317. mData[startByte++] = bExp;
  318. twoBytesFromFloat(in->killPlaneNormal[1], bMant, bExp);
  319. mData[startByte++] = bMant;
  320. mData[startByte++] = bExp;
  321. twoBytesFromFloat(in->killPlaneNormal[2], bMant, bExp);
  322. mData[startByte++] = bMant;
  323. mData[startByte++] = bExp;
  324. twoBytesFromFloat(in->killPlaneZ, bMant, bExp);
  325. mData[startByte++] = bMant;
  326. mData[startByte++] = bExp;
  327. twoBytesFromFloat(in->distanceDeath, bMant, bExp);
  328. mData[startByte++] = bMant;
  329. mData[startByte++] = bExp;
  330. return startByte;
  331. }
  332. U32 LLPartSysCompressedPacket::writeBounce_p(LLPartInitData *in, U32 startByte)
  333. {
  334. S8 bMant, bExp;
  335. twoBytesFromFloat(in->bouncePlaneNormal[0], bMant, bExp);
  336. mData[startByte++] = bMant;
  337. mData[startByte++] = bExp;
  338. twoBytesFromFloat(in->bouncePlaneNormal[1], bMant, bExp);
  339. mData[startByte++] = bMant;
  340. mData[startByte++] = bExp;
  341. twoBytesFromFloat(in->bouncePlaneNormal[2], bMant, bExp);
  342. mData[startByte++] = bMant;
  343. mData[startByte++] = bExp;
  344. twoBytesFromFloat(in->bouncePlaneZ, bMant, bExp);
  345. mData[startByte++] = bMant;
  346. mData[startByte++] = bExp;
  347. return startByte;
  348. }
  349. U32 LLPartSysCompressedPacket::writeBounce_b(LLPartInitData *in, U32 startByte)
  350. {
  351. S8 bMant, bExp;
  352. twoBytesFromFloat(in->bounce_b, bMant, bExp);
  353. mData[startByte++] = bMant;
  354. mData[startByte++] = bExp;
  355. return startByte;
  356. }
  357. //U32 LLPartSysCompressedPacket::writePos_ranges(LLPartInitData *in, U32 startByte)
  358. //{
  359. // S8 tmp;
  360. // int i;
  361. // for(i = 0; i < 6; i++)
  362. // {
  363. // tmp = (S8) in->pos_ranges[i]; // float to int conversion (keep the sign)
  364. // mData[startByte++] = (U8)tmp; // signed to unsigned typecast
  365. // }
  366. // return startByte;
  367. //}
  368. //U32 LLPartSysCompressedPacket::writeVel_ranges(LLPartInitData *in, U32 startByte)
  369. //{
  370. // S8 tmp;
  371. // int i;
  372. // for(i = 0; i < 6; i++)
  373. // {
  374. // tmp = (S8) in->vel_ranges[i]; // float to int conversion (keep the sign)
  375. // mData[startByte++] = (U8)tmp; // signed to unsigned typecast
  376. // }
  377. // return startByte;
  378. //}
  379. U32 LLPartSysCompressedPacket::writeAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte)
  380. {
  381. S8 bExp, bMant;
  382. int i;
  383. for(i = 0; i < 3; i++)
  384. {
  385. twoBytesFromFloat(in->diffEqAlpha[i], bMant, bExp);
  386. mData[startByte++] = bMant;
  387. mData[startByte++] = bExp;
  388. }
  389. for(i = 0; i < 3; i++)
  390. {
  391. twoBytesFromFloat(in->diffEqScale[i], bMant, bExp);
  392. mData[startByte++] = bMant;
  393. mData[startByte++] = bExp;
  394. }
  395. return startByte;
  396. }
  397. U32 LLPartSysCompressedPacket::writeScale_range(LLPartInitData *in, U32 startByte)
  398. {
  399. S8 bExp, bMant;
  400. int i;
  401. for(i = 0; i < 4; i++)
  402. {
  403. twoBytesFromFloat(in->scale_range[i], bMant, bExp);
  404. mData[startByte++] = bMant;
  405. mData[startByte++] = bExp;
  406. }
  407. return startByte;
  408. }
  409. U32 LLPartSysCompressedPacket::writeAlpha_range(LLPartInitData *in, U32 startByte)
  410. {
  411. S8 bExp, bMant;
  412. int i;
  413. for(i = 0; i < 4; i++)
  414. {
  415. twoBytesFromFloat(in->alpha_range[i], bMant, bExp);
  416. mData[startByte++] = bMant;
  417. mData[startByte++] = bExp;
  418. }
  419. return startByte;
  420. }
  421. U32 LLPartSysCompressedPacket::writeVelocityOffset(LLPartInitData *in, U32 startByte)
  422. {
  423. S8 bExp, bMant;
  424. int i;
  425. for(i = 0; i < 3; i++)
  426. {
  427. twoBytesFromFloat(in->vel_offset[i], bMant, bExp);
  428. mData[startByte++] = bMant;
  429. mData[startByte++] = bExp;
  430. }
  431. return startByte;
  432. }
  433. U32 LLPartSysCompressedPacket::writeUUID(LLPartInitData *in, U32 startByte)
  434. {
  435. U8 * bufPtr = mData + startByte;
  436. if(in->mImageUuid == IMG_SHOT) {
  437. mData[startByte++] = 0x01;
  438. return startByte;
  439. }
  440. if(in->mImageUuid == IMG_SPARK) {
  441. mData[startByte++] = 0x02;
  442. return startByte;
  443. }
  444. if(in->mImageUuid == IMG_BIG_EXPLOSION_1) {
  445. mData[startByte++] = 0x03;
  446. return startByte;
  447. }
  448. if(in->mImageUuid == IMG_BIG_EXPLOSION_2) {
  449. mData[startByte++] = 0x04;
  450. return startByte;
  451. }
  452. if(in->mImageUuid == IMG_SMOKE_POOF) {
  453. mData[startByte++] = 0x05;
  454. return startByte;
  455. }
  456. if(in->mImageUuid == IMG_FIRE) {
  457. mData[startByte++] = 0x06;
  458. return startByte;
  459. }
  460. if(in->mImageUuid == IMG_EXPLOSION) {
  461. mData[startByte++] = 0x07;
  462. return startByte;
  463. }
  464. if(in->mImageUuid == IMG_EXPLOSION_2) {
  465. mData[startByte++] = 0x08;
  466. return startByte;
  467. }
  468. if(in->mImageUuid == IMG_EXPLOSION_3) {
  469. mData[startByte++] = 0x09;
  470. return startByte;
  471. }
  472. if(in->mImageUuid == IMG_EXPLOSION_4) {
  473. mData[startByte++] = 0x0A;
  474. return startByte;
  475. }
  476. mData[startByte++] = 0x00; // flag for "read whole UUID"
  477. memcpy(bufPtr, in->mImageUuid.mData, 16); /* Flawfinder: ignore */
  478. return (startByte+16);
  479. }
  480. U32 LLPartSysCompressedPacket::writeSpawn(LLPartInitData *in, U32 startByte)
  481. {
  482. S8 bExp, bMant;
  483. int i;
  484. twoBytesFromFloat(in->spawnRange, bMant, bExp);
  485. mData[startByte++] = bMant;
  486. mData[startByte++] = bExp;
  487. twoBytesFromFloat(in->spawnFrequency, bMant, bExp);
  488. mData[startByte++] = bMant;
  489. mData[startByte++] = bExp;
  490. twoBytesFromFloat(in->spawnFreqencyRange, bMant, bExp);
  491. mData[startByte++] = bMant;
  492. mData[startByte++] = bExp;
  493. for(i = 0; i < 3; i++)
  494. {
  495. twoBytesFromFloat(in->spawnDirection[i], bMant, bExp);
  496. mData[startByte++] = bMant;
  497. mData[startByte++] = bExp;
  498. }
  499. twoBytesFromFloat(in->spawnDirectionRange, bMant, bExp);
  500. mData[startByte++] = bMant;
  501. mData[startByte++] = bExp;
  502. twoBytesFromFloat(in->spawnVelocity, bMant, bExp);
  503. mData[startByte++] = bMant;
  504. mData[startByte++] = bExp;
  505. twoBytesFromFloat(in->spawnVelocityRange, bMant, bExp);
  506. mData[startByte++] = bMant;
  507. mData[startByte++] = bExp;
  508. return startByte;
  509. }
  510. U32 LLPartSysCompressedPacket::writeEnvironment(LLPartInitData *in, U32 startByte)
  511. {
  512. S8 bExp, bMant;
  513. int i;
  514. twoBytesFromFloat(in->windWeight, bMant, bExp);
  515. mData[startByte++] = bMant;
  516. mData[startByte++] = bExp;
  517. for(i = 0; i < 3; i++)
  518. {
  519. twoBytesFromFloat(in->currentGravity[i], bMant, bExp);
  520. mData[startByte++] = bMant;
  521. mData[startByte++] = bExp;
  522. }
  523. twoBytesFromFloat(in->gravityWeight, bMant, bExp);
  524. mData[startByte++] = bMant;
  525. mData[startByte++] = bExp;
  526. return startByte;
  527. }
  528. U32 LLPartSysCompressedPacket::writeLifespan(LLPartInitData *in, U32 startByte)
  529. {
  530. S8 bExp, bMant;
  531. twoBytesFromFloat(in->globalLifetime, bMant, bExp);
  532. mData[startByte++] = bMant;
  533. mData[startByte++] = bExp;
  534. twoBytesFromFloat(in->individualLifetime, bMant, bExp);
  535. mData[startByte++] = bMant;
  536. mData[startByte++] = bExp;
  537. twoBytesFromFloat(in->individualLifetimeRange, bMant, bExp);
  538. mData[startByte++] = bMant;
  539. mData[startByte++] = bExp;
  540. return startByte;
  541. }
  542. U32 LLPartSysCompressedPacket::writeDecayDamp(LLPartInitData *in, U32 startByte)
  543. {
  544. S8 bExp, bMant;
  545. twoBytesFromFloat(in->speedLimit, bMant, bExp);
  546. mData[startByte++] = bMant;
  547. mData[startByte++] = bExp;
  548. twoBytesFromFloat(in->alphaDecay, bMant, bExp);
  549. mData[startByte++] = bMant;
  550. mData[startByte++] = bExp;
  551. twoBytesFromFloat(in->scaleDecay, bMant, bExp);
  552. mData[startByte++] = bMant;
  553. mData[startByte++] = bExp;
  554. twoBytesFromFloat(in->dampMotionFactor, bMant, bExp);
  555. mData[startByte++] = bMant;
  556. mData[startByte++] = bExp;
  557. return startByte;
  558. }
  559. U32 LLPartSysCompressedPacket::writeWindDiffusionFactor(LLPartInitData *in, U32 startByte)
  560. {
  561. S8 bExp, bMant;
  562. twoBytesFromFloat(in->windDiffusionFactor[0], bMant, bExp);
  563. mData[startByte++] = bMant;
  564. mData[startByte++] = bExp;
  565. twoBytesFromFloat(in->windDiffusionFactor[1], bMant, bExp);
  566. mData[startByte++] = bMant;
  567. mData[startByte++] = bExp;
  568. twoBytesFromFloat(in->windDiffusionFactor[2], bMant, bExp);
  569. mData[startByte++] = bMant;
  570. mData[startByte++] = bExp;
  571. return startByte;
  572. }
  573. /*
  574. U32 LLPartSysCompressedPacket::readK(LLPartInitData *in, U32 startByte)
  575. {
  576. U32 i, i_mod_eight, kFlag;
  577. S8 bMant, bExp; // 1 bytes mantissa and exponent for a float
  578. kFlag = startByte;
  579. startByte += 3; // 3 bytes has enough room for 18 bits
  580. i_mod_eight = 0;
  581. for(i = 0; i < 18; i++)
  582. {
  583. if(mData[kFlag]&(1<<i_mod_eight))
  584. {
  585. bMant = mData[startByte++];
  586. bExp = mData[startByte++];
  587. in->k[i] = floatFromTwoBytes(bMant, bExp); // much tighter platform-independent
  588. // way to ship floats
  589. }
  590. i_mod_eight++;
  591. if(i_mod_eight >= 8)
  592. {
  593. i_mod_eight -= 8;
  594. kFlag++;
  595. }
  596. }
  597. return startByte;
  598. }
  599. */
  600. U32 LLPartSysCompressedPacket::readKill_p(LLPartInitData *in, U32 startByte)
  601. {
  602. S8 bMant, bExp;
  603. bMant = mData[startByte++];
  604. bExp = mData[startByte++];
  605. in->killPlaneNormal[0] = floatFromTwoBytes(bMant, bExp);
  606. bMant = mData[startByte++];
  607. bExp = mData[startByte++];
  608. in->killPlaneNormal[1] = floatFromTwoBytes(bMant, bExp);
  609. bMant = mData[startByte++];
  610. bExp = mData[startByte++];
  611. in->killPlaneNormal[2] = floatFromTwoBytes(bMant, bExp);
  612. bMant = mData[startByte++];
  613. bExp = mData[startByte++];
  614. in->killPlaneZ = floatFromTwoBytes(bMant, bExp);
  615. bMant = mData[startByte++];
  616. bExp = mData[startByte++];
  617. in->distanceDeath = floatFromTwoBytes(bMant, bExp);
  618. return startByte;
  619. }
  620. U32 LLPartSysCompressedPacket::readBounce_p(LLPartInitData *in, U32 startByte)
  621. {
  622. S8 bMant, bExp;
  623. bMant = mData[startByte++];
  624. bExp = mData[startByte++];
  625. in->bouncePlaneNormal[0] = floatFromTwoBytes(bMant, bExp);
  626. bMant = mData[startByte++];
  627. bExp = mData[startByte++];
  628. in->bouncePlaneNormal[1] = floatFromTwoBytes(bMant, bExp);
  629. bMant = mData[startByte++];
  630. bExp = mData[startByte++];
  631. in->bouncePlaneNormal[2] = floatFromTwoBytes(bMant, bExp);
  632. bMant = mData[startByte++];
  633. bExp = mData[startByte++];
  634. in->bouncePlaneZ = floatFromTwoBytes(bMant, bExp);
  635. return startByte;
  636. }
  637. U32 LLPartSysCompressedPacket::readBounce_b(LLPartInitData *in, U32 startByte)
  638. {
  639. S8 bMant, bExp;
  640. bMant = mData[startByte++];
  641. bExp = mData[startByte++];
  642. in->bounce_b = floatFromTwoBytes(bMant, bExp);
  643. return startByte;
  644. }
  645. //U32 LLPartSysCompressedPacket::readPos_ranges(LLPartInitData *in, U32 startByte)
  646. //{
  647. // S8 tmp;
  648. // int i;
  649. // for(i = 0; i < 6; i++)
  650. // {
  651. // tmp = (S8)mData[startByte++];
  652. // in->pos_ranges[i] = tmp;
  653. // }
  654. // return startByte;
  655. //}
  656. //U32 LLPartSysCompressedPacket::readVel_ranges(LLPartInitData *in, U32 startByte)
  657. //{
  658. // S8 tmp;
  659. // int i;
  660. // for(i = 0; i < 6; i++)
  661. // {
  662. // tmp = (S8)mData[startByte++];
  663. // in->vel_ranges[i] = tmp;
  664. // }
  665. // return startByte;
  666. //}
  667. U32 LLPartSysCompressedPacket::readAlphaScaleDiffEqn_range(LLPartInitData *in, U32 startByte)
  668. {
  669. int i;
  670. S8 bMant, bExp;
  671. for(i = 0; i < 3; i++)
  672. {
  673. bMant = mData[startByte++];
  674. bExp = mData[startByte++];
  675. in->diffEqAlpha[i] = floatFromTwoBytes(bMant, bExp);
  676. }
  677. for(i = 0; i < 3; i++)
  678. {
  679. bMant = mData[startByte++];
  680. bExp = mData[startByte++];
  681. in->diffEqScale[i] = floatFromTwoBytes(bMant, bExp);
  682. }
  683. return startByte;
  684. }
  685. U32 LLPartSysCompressedPacket::readAlpha_range(LLPartInitData *in, U32 startByte)
  686. {
  687. int i;
  688. S8 bMant, bExp;
  689. for(i = 0; i < 4; i++)
  690. {
  691. bMant = mData[startByte++];
  692. bExp = mData[startByte++];
  693. in->alpha_range[i] = floatFromTwoBytes(bMant, bExp);
  694. }
  695. return startByte;
  696. }
  697. U32 LLPartSysCompressedPacket::readScale_range(LLPartInitData *in, U32 startByte)
  698. {
  699. int i;
  700. S8 bMant, bExp;
  701. for(i = 0; i < 4; i++)
  702. {
  703. bMant = mData[startByte++];
  704. bExp = mData[startByte++];
  705. in->scale_range[i] = floatFromTwoBytes(bMant, bExp);
  706. }
  707. return startByte;
  708. }
  709. U32 LLPartSysCompressedPacket::readVelocityOffset(LLPartInitData *in, U32 startByte)
  710. {
  711. int i;
  712. S8 bMant, bExp;
  713. for(i = 0; i < 3; i++)
  714. {
  715. bMant = mData[startByte++];
  716. bExp = mData[startByte++];
  717. in->vel_offset[i] = floatFromTwoBytes(bMant, bExp);
  718. }
  719. return startByte;
  720. }
  721. U32 LLPartSysCompressedPacket::readUUID(LLPartInitData *in, U32 startByte)
  722. {
  723. U8 * bufPtr = mData + startByte;
  724. if(mData[startByte] == 0x01)
  725. {
  726. in->mImageUuid = IMG_SHOT;
  727. return startByte+1;
  728. }
  729. if(mData[startByte] == 0x02)
  730. {
  731. in->mImageUuid = IMG_SPARK;
  732. return startByte+1;
  733. }
  734. if(mData[startByte] == 0x03)
  735. {
  736. in->mImageUuid = IMG_BIG_EXPLOSION_1;
  737. return startByte+1;
  738. }
  739. if(mData[startByte] == 0x04)
  740. {
  741. in->mImageUuid = IMG_BIG_EXPLOSION_2;
  742. return startByte+1;
  743. }
  744. if(mData[startByte] == 0x05)
  745. {
  746. in->mImageUuid = IMG_SMOKE_POOF;
  747. return startByte+1;
  748. }
  749. if(mData[startByte] == 0x06)
  750. {
  751. in->mImageUuid = IMG_FIRE;
  752. return startByte+1;
  753. }
  754. if(mData[startByte] == 0x07)
  755. {
  756. in->mImageUuid = IMG_EXPLOSION;
  757. return startByte+1;
  758. }
  759. if(mData[startByte] == 0x08)
  760. {
  761. in->mImageUuid = IMG_EXPLOSION_2;
  762. return startByte+1;
  763. }
  764. if(mData[startByte] == 0x09)
  765. {
  766. in->mImageUuid = IMG_EXPLOSION_3;
  767. return startByte+1;
  768. }
  769. if(mData[startByte] == 0x0A)
  770. {
  771. in->mImageUuid = IMG_EXPLOSION_4;
  772. return startByte+1;
  773. }
  774. startByte++; // cause we actually have to read the UUID now.
  775. memcpy(in->mImageUuid.mData, bufPtr, 16); /* Flawfinder: ignore */
  776. return (startByte+16);
  777. }
  778. U32 LLPartSysCompressedPacket::readSpawn(LLPartInitData *in, U32 startByte)
  779. {
  780. S8 bMant, bExp;
  781. U32 i;
  782. bMant = mData[startByte++];
  783. bExp = mData[startByte++];
  784. in->spawnRange = floatFromTwoBytes(bMant, bExp);
  785. bMant = mData[startByte++];
  786. bExp = mData[startByte++];
  787. in->spawnFrequency = floatFromTwoBytes(bMant, bExp);
  788. bMant = mData[startByte++];
  789. bExp = mData[startByte++];
  790. in->spawnFreqencyRange = floatFromTwoBytes(bMant, bExp);
  791. for(i = 0; i < 3; i++)
  792. {
  793. bMant = mData[startByte++];
  794. bExp = mData[startByte++];
  795. in->spawnDirection[i] = floatFromTwoBytes(bMant, bExp);
  796. }
  797. bMant = mData[startByte++];
  798. bExp = mData[startByte++];
  799. in->spawnDirectionRange = floatFromTwoBytes(bMant, bExp);
  800. bMant = mData[startByte++];
  801. bExp = mData[startByte++];
  802. in->spawnVelocity = floatFromTwoBytes(bMant, bExp);
  803. bMant = mData[startByte++];
  804. bExp = mData[startByte++];
  805. in->spawnVelocityRange = floatFromTwoBytes(bMant, bExp);
  806. return startByte;
  807. }
  808. U32 LLPartSysCompressedPacket::readEnvironment(LLPartInitData *in, U32 startByte)
  809. {
  810. S8 bMant, bExp;
  811. U32 i;
  812. bMant = mData[startByte++];
  813. bExp = mData[startByte++];
  814. in->windWeight = floatFromTwoBytes(bMant, bExp);
  815. for(i = 0; i < 3; i++)
  816. {
  817. bMant = mData[startByte++];
  818. bExp = mData[startByte++];
  819. in->currentGravity[i] = floatFromTwoBytes(bMant, bExp);
  820. }
  821. bMant = mData[startByte++];
  822. bExp = mData[startByte++];
  823. in->gravityWeight = floatFromTwoBytes(bMant, bExp);
  824. return startByte;
  825. }
  826. U32 LLPartSysCompressedPacket::readLifespan(LLPartInitData *in, U32 startByte)
  827. {
  828. S8 bMant, bExp;
  829. bMant = mData[startByte++];
  830. bExp = mData[startByte++];
  831. in->globalLifetime = floatFromTwoBytes(bMant, bExp);
  832. bMant = mData[startByte++];
  833. bExp = mData[startByte++];
  834. in->individualLifetime = floatFromTwoBytes(bMant, bExp);
  835. bMant = mData[startByte++];
  836. bExp = mData[startByte++];
  837. in->individualLifetimeRange = floatFromTwoBytes(bMant, bExp);
  838. return startByte;
  839. }
  840. U32 LLPartSysCompressedPacket::readDecayDamp(LLPartInitData *in, U32 startByte)
  841. {
  842. S8 bMant, bExp;
  843. bMant = mData[startByte++];
  844. bExp = mData[startByte++];
  845. in->speedLimit = floatFromTwoBytes(bMant, bExp);
  846. bMant = mData[startByte++];
  847. bExp = mData[startByte++];
  848. in->alphaDecay = floatFromTwoBytes(bMant, bExp);
  849. bMant = mData[startByte++];
  850. bExp = mData[startByte++];
  851. in->scaleDecay = floatFromTwoBytes(bMant, bExp);
  852. bMant = mData[startByte++];
  853. bExp = mData[startByte++];
  854. in->dampMotionFactor = floatFromTwoBytes(bMant, bExp);
  855. return startByte;
  856. }
  857. U32 LLPartSysCompressedPacket::readWindDiffusionFactor(LLPartInitData *in, U32 startByte)
  858. {
  859. int i;
  860. S8 bMant, bExp;
  861. for(i = 0; i < 3; i++)
  862. {
  863. bMant = mData[startByte++];
  864. bExp = mData[startByte++];
  865. in->windDiffusionFactor[i] = floatFromTwoBytes(bMant, bExp);
  866. }
  867. return startByte;
  868. }
  869. BOOL LLPartSysCompressedPacket::fromLLPartInitData(LLPartInitData *in, U32 &bytesUsed)
  870. {
  871. writeFlagByte(in);
  872. U32 currByte = 4;
  873. // llprintline("calling \"fromLLPartInitData\"\n");
  874. //if(mData[0] & PART_SYS_K_MASK)
  875. //{
  876. // currByte = writeK(in, 3); // first 3 bytes are reserved for header data
  877. //}
  878. if(mData[0] & PART_SYS_KILL_P_MASK)
  879. {
  880. currByte = writeKill_p(in, currByte);
  881. }
  882. if(mData[0] & PART_SYS_BOUNCE_P_MASK)
  883. {
  884. currByte = writeBounce_p(in, currByte);
  885. }
  886. if(mData[0] & PART_SYS_BOUNCE_B_MASK)
  887. {
  888. currByte = writeBounce_b(in, currByte);
  889. }
  890. //if(mData[0] & PART_SYS_POS_RANGES_MASK)
  891. //{
  892. // currByte = writePos_ranges(in, currByte);
  893. //}
  894. //if(mData[0] & PART_SYS_VEL_RANGES_MASK)
  895. //{
  896. // currByte = writeVel_ranges(in, currByte);
  897. //}
  898. if(mData[0] & PART_SYS_ALPHA_SCALE_DIFF_MASK)
  899. {
  900. currByte = writeAlphaScaleDiffEqn_range(in, currByte);
  901. }
  902. if(mData[0] & PART_SYS_SCALE_RANGE_MASK)
  903. {
  904. currByte = writeScale_range(in, currByte);
  905. }
  906. if(mData[0] & PART_SYS_VEL_OFFSET_MASK)
  907. {
  908. currByte = writeVelocityOffset(in, currByte);
  909. }
  910. if(mData[0] & PART_SYS_M_IMAGE_UUID_MASK)
  911. {
  912. currByte = writeUUID(in, currByte);
  913. }
  914. if(mData[3] & PART_SYS_BYTE_SPAWN_MASK)
  915. {
  916. currByte = writeSpawn(in, currByte);
  917. }
  918. if(mData[3] & PART_SYS_BYTE_ENVIRONMENT_MASK)
  919. {
  920. currByte = writeEnvironment(in, currByte);
  921. }
  922. if(mData[3] & PART_SYS_BYTE_LIFESPAN_MASK)
  923. {
  924. currByte = writeLifespan(in, currByte);
  925. }
  926. if(mData[3] & PART_SYS_BYTE_DECAY_DAMP_MASK)
  927. {
  928. currByte = writeDecayDamp(in, currByte);
  929. }
  930. if(mData[3] & PART_SYS_BYTE_WIND_DIFF_MASK)
  931. {
  932. currByte = writeWindDiffusionFactor(in, currByte);
  933. }
  934. if(mData[2] & PART_SYS_BYTE_3_ALPHA_MASK)
  935. {
  936. currByte = writeAlpha_range(in, currByte);
  937. }
  938. mData[currByte++] = (U8)in->maxParticles;
  939. mData[currByte++] = (U8)in->initialParticles;
  940. U32 flagFlag = 1; // flag indicating which flag bytes are non-zero
  941. // yeah, I know, the name sounds funny
  942. for(U32 i = 0; i < 8; i++)
  943. {
  944. // llprintline("Flag \"%x\" gets byte \"%x\"\n", flagFlag, in->mFlags[i]);
  945. if(mData[1] & flagFlag)
  946. {
  947. mData[currByte++] = in->mFlags[i];
  948. // llprintline("and is valid...\n");
  949. }
  950. flagFlag <<= 1;
  951. }
  952. bytesUsed = mNumBytes = currByte;
  953. // llprintline("returning from \"fromLLPartInitData\" with %d bytes\n", bytesUsed);
  954. return TRUE;
  955. }
  956. BOOL LLPartSysCompressedPacket::toLLPartInitData(LLPartInitData *out, U32 *bytesUsed)
  957. {
  958. U32 currByte = 4;
  959. gSetInitDataDefaults(out);
  960. if(mData[0] & PART_SYS_KILL_P_MASK)
  961. {
  962. currByte = readKill_p(out, currByte);
  963. }
  964. if(mData[0] & PART_SYS_BOUNCE_P_MASK)
  965. {
  966. currByte = readBounce_p(out, currByte);
  967. }
  968. if(mData[0] & PART_SYS_BOUNCE_B_MASK)
  969. {
  970. currByte = readBounce_b(out, currByte);
  971. }
  972. if(mData[0] & PART_SYS_ALPHA_SCALE_DIFF_MASK)
  973. {
  974. currByte = readAlphaScaleDiffEqn_range(out, currByte);
  975. }
  976. if(mData[0] & PART_SYS_SCALE_RANGE_MASK)
  977. {
  978. currByte = readScale_range(out, currByte);
  979. }
  980. if(mData[0] & PART_SYS_VEL_OFFSET_MASK)
  981. {
  982. currByte = readVelocityOffset(out, currByte);
  983. }
  984. if(mData[0] & PART_SYS_M_IMAGE_UUID_MASK)
  985. {
  986. currByte = readUUID(out, currByte);
  987. }
  988. if(mData[3] & PART_SYS_BYTE_SPAWN_MASK)
  989. {
  990. currByte = readSpawn(out, currByte);
  991. }
  992. if(mData[3] & PART_SYS_BYTE_ENVIRONMENT_MASK)
  993. {
  994. currByte = readEnvironment(out, currByte);
  995. }
  996. if(mData[3] & PART_SYS_BYTE_LIFESPAN_MASK)
  997. {
  998. currByte = readLifespan(out, currByte);
  999. }
  1000. if(mData[3] & PART_SYS_BYTE_DECAY_DAMP_MASK)
  1001. {
  1002. currByte = readDecayDamp(out, currByte);
  1003. }
  1004. if(mData[3] & PART_SYS_BYTE_WIND_DIFF_MASK)
  1005. {
  1006. currByte = readWindDiffusionFactor(out, currByte);
  1007. }
  1008. if(mData[2] & PART_SYS_BYTE_3_ALPHA_MASK)
  1009. {
  1010. currByte = readAlpha_range(out, currByte);
  1011. }
  1012. out->maxParticles = mData[currByte++];
  1013. out->initialParticles = mData[currByte++];
  1014. U32 flagFlag = 1; // flag indicating which flag bytes are non-zero
  1015. // yeah, I know, the name sounds funny
  1016. for(U32 i = 0; i < 8; i++)
  1017. {
  1018. flagFlag = 1<<i;
  1019. if((mData[1] & flagFlag))
  1020. {
  1021. out->mFlags[i] = mData[currByte++];
  1022. }
  1023. }
  1024. *bytesUsed = currByte;
  1025. return TRUE;
  1026. }
  1027. BOOL LLPartSysCompressedPacket::fromUnsignedBytes(U8 *in, U32 bytesUsed)
  1028. {
  1029. if ((in != NULL) && (bytesUsed <= sizeof(mData)))
  1030. {
  1031. memcpy(mData, in, bytesUsed); /* Flawfinder: ignore */
  1032. mNumBytes = bytesUsed;
  1033. return TRUE;
  1034. }
  1035. else
  1036. {
  1037. llerrs << "NULL input data or number of bytes exceed mData size" << llendl;
  1038. return FALSE;
  1039. }
  1040. }
  1041. U32 LLPartSysCompressedPacket::bufferSize()
  1042. {
  1043. return mNumBytes;
  1044. }
  1045. BOOL LLPartSysCompressedPacket::toUnsignedBytes(U8 *out)
  1046. {
  1047. memcpy(out, mData, mNumBytes); /* Flawfinder: ignore */
  1048. return TRUE;
  1049. }
  1050. U8 * LLPartSysCompressedPacket::getBytePtr()
  1051. {
  1052. return mData;
  1053. }