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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvolumemessage.cpp
  3.  * @brief LLVolumeMessage 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. #include "linden_common.h"
  33. #include "message.h"
  34. #include "llvolumemessage.h"
  35. #include "lldatapacker.h"
  36. //============================================================================
  37. // LLVolumeMessage is just a wrapper class; all members are static
  38. //============================================================================
  39. bool LLVolumeMessage::packProfileParams(
  40. const LLProfileParams* params,
  41. LLMessageSystem *mesgsys)
  42. {
  43. // Default to cylinder
  44. static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U16(0), U16(0), U16(0));
  45. if (!params)
  46. params = &defaultparams;
  47. U8 tempU8;
  48. U16 tempU16;
  49. tempU8 = params->getCurveType();
  50. mesgsys->addU8Fast(_PREHASH_ProfileCurve, tempU8);
  51. tempU16 = (U16) llround( params->getBegin() / CUT_QUANTA);
  52. mesgsys->addU16Fast(_PREHASH_ProfileBegin, tempU16);
  53. tempU16 = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA);
  54. mesgsys->addU16Fast(_PREHASH_ProfileEnd, tempU16);
  55. tempU16 = (U16) llround(params->getHollow() / HOLLOW_QUANTA);
  56. mesgsys->addU16Fast(_PREHASH_ProfileHollow, tempU16);
  57. return true;
  58. }
  59. bool LLVolumeMessage::packProfileParams(
  60. const LLProfileParams* params,
  61. LLDataPacker &dp)
  62. {
  63. // Default to cylinder
  64. static LLProfileParams defaultparams(LL_PCODE_PROFILE_CIRCLE, U16(0), U16(0), U16(0));
  65. if (!params)
  66. params = &defaultparams;
  67. U8 tempU8;
  68. U16 tempU16;
  69. tempU8 = params->getCurveType();
  70. dp.packU8(tempU8, "Curve");
  71. tempU16 = (U16) llround( params->getBegin() / CUT_QUANTA);
  72. dp.packU16(tempU16, "Begin");
  73. tempU16 = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA);
  74. dp.packU16(tempU16, "End");
  75. tempU16 = (U16) llround(params->getHollow() / HOLLOW_QUANTA);
  76. dp.packU16(tempU16, "Hollow");
  77. return true;
  78. }
  79. bool LLVolumeMessage::unpackProfileParams(
  80. LLProfileParams* params,
  81. LLMessageSystem* mesgsys,
  82. char* block_name,
  83. S32 block_num)
  84. {
  85. bool ok = true;
  86. U8 temp_u8;
  87. U16 temp_u16;
  88. F32 temp_f32;
  89. mesgsys->getU8Fast(block_name, _PREHASH_ProfileCurve, temp_u8, block_num);
  90. params->setCurveType(temp_u8);
  91. mesgsys->getU16Fast(block_name, _PREHASH_ProfileBegin, temp_u16, block_num);
  92. temp_f32 = temp_u16 * CUT_QUANTA;
  93. if (temp_f32 > 1.f)
  94. {
  95. llwarns << "Profile begin out of range: " << temp_f32
  96. << ". Clamping to 0.0." << llendl;
  97. temp_f32 = 0.f;
  98. ok = false;
  99. }
  100. params->setBegin(temp_f32);
  101. mesgsys->getU16Fast(block_name, _PREHASH_ProfileEnd, temp_u16, block_num);
  102. temp_f32 = temp_u16 * CUT_QUANTA;
  103. if (temp_f32 > 1.f)
  104. {
  105. llwarns << "Profile end out of range: " << 1.f - temp_f32
  106. << ". Clamping to 1.0." << llendl;
  107. temp_f32 = 1.f;
  108. ok = false;
  109. }
  110. params->setEnd(1.f - temp_f32);
  111. mesgsys->getU16Fast(block_name, _PREHASH_ProfileHollow, temp_u16, block_num);
  112. temp_f32 = temp_u16 * HOLLOW_QUANTA;
  113. if (temp_f32 > 1.f)
  114. {
  115. llwarns << "Profile hollow out of range: " << temp_f32
  116. << ". Clamping to 0.0." << llendl;
  117. temp_f32 = 0.f;
  118. ok = false;
  119. }
  120. params->setHollow(temp_f32);
  121. /*
  122. llinfos << "Unpacking Profile Block " << block_num << llendl;
  123. llinfos << "Curve:     " << (U32)getCurve() << llendl;
  124. llinfos << "Begin:     " << getBegin() << llendl;
  125. llinfos << "End:     " << getEnd() << llendl;
  126. llinfos << "Hollow:     " << getHollow() << llendl;
  127. */
  128. return ok;
  129. }
  130. bool LLVolumeMessage::unpackProfileParams(
  131. LLProfileParams* params,
  132. LLDataPacker &dp)
  133. {
  134. bool ok = true;
  135. U8 temp_u8;
  136. U16 temp_u16;
  137. F32 temp_f32;
  138. dp.unpackU8(temp_u8, "Curve");
  139. params->setCurveType(temp_u8);
  140. dp.unpackU16(temp_u16, "Begin");
  141. temp_f32 = temp_u16 * CUT_QUANTA;
  142. if (temp_f32 > 1.f)
  143. {
  144. llwarns << "Profile begin out of range: " << temp_f32 << llendl;
  145. llwarns << "Clamping to 0.0" << llendl;
  146. temp_f32 = 0.f;
  147. ok = false;
  148. }
  149. params->setBegin(temp_f32);
  150. dp.unpackU16(temp_u16, "End");
  151. temp_f32 = temp_u16 * CUT_QUANTA;
  152. if (temp_f32 > 1.f)
  153. {
  154. llwarns << "Profile end out of range: " << 1.f - temp_f32 << llendl;
  155. llwarns << "Clamping to 1.0" << llendl;
  156. temp_f32 = 1.f;
  157. ok = false;
  158. }
  159. params->setEnd(1.f - temp_f32);
  160. dp.unpackU16(temp_u16, "Hollow");
  161. temp_f32 = temp_u16 * HOLLOW_QUANTA;
  162. if (temp_f32 > 1.f)
  163. {
  164. llwarns << "Profile hollow out of range: " << temp_f32 << llendl;
  165. llwarns << "Clamping to 0.0" << llendl;
  166. temp_f32 = 0.f;
  167. ok = false;
  168. }
  169. params->setHollow(temp_f32);
  170. return ok;
  171. }
  172. //============================================================================
  173. // Quantization:
  174. // For cut begin, range is 0 to 1, quanta is 0.005, 0 maps to 0
  175. // For cut end, range is 0 to 1, quanta is 0.005, 1 maps to 0
  176. // For scale, range is 0 to 1, quanta is 0.01, 0 maps to 0, 1 maps to 100
  177. // For shear, range is -0.5 to 0.5, quanta is 0.01, 0 maps to 0
  178. // For taper, range is -1 to 1, quanta is 0.01, 0 maps to 0
  179. bool LLVolumeMessage::packPathParams(
  180. const LLPathParams* params,
  181. LLMessageSystem *mesgsys)
  182. {
  183. // Default to cylinder with no cut, top same size as bottom, no shear, no twist
  184. static LLPathParams defaultparams(LL_PCODE_PATH_LINE, U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), 0);
  185. if (!params)
  186. params = &defaultparams;
  187. U8 curve = params->getCurveType();
  188. mesgsys->addU8Fast(_PREHASH_PathCurve, curve);
  189. U16 begin = (U16) llround(params->getBegin() / CUT_QUANTA);
  190. mesgsys->addU16Fast(_PREHASH_PathBegin, begin);
  191. U16 end = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA);
  192. mesgsys->addU16Fast(_PREHASH_PathEnd, end);
  193. // Avoid truncation problem with direct F32->U8 cast.
  194. // (e.g., (U8) (0.50 / 0.01) = (U8) 49.9999999 = 49 not 50.
  195. U8 pack_scale_x = 200 - (U8) llround(params->getScaleX() / SCALE_QUANTA);
  196. mesgsys->addU8Fast(_PREHASH_PathScaleX, pack_scale_x );
  197. U8 pack_scale_y = 200 - (U8) llround(params->getScaleY() / SCALE_QUANTA);
  198. mesgsys->addU8Fast(_PREHASH_PathScaleY, pack_scale_y );
  199. U8 pack_shear_x = (U8) llround(params->getShearX() / SHEAR_QUANTA);
  200. mesgsys->addU8Fast(_PREHASH_PathShearX, pack_shear_x );
  201. U8 pack_shear_y = (U8) llround(params->getShearY() / SHEAR_QUANTA);
  202. mesgsys->addU8Fast(_PREHASH_PathShearY, pack_shear_y );
  203. S8 twist = (S8) llround(params->getTwist() / SCALE_QUANTA);
  204. mesgsys->addS8Fast(_PREHASH_PathTwist, twist);
  205. S8 twist_begin = (S8) llround(params->getTwistBegin() / SCALE_QUANTA);
  206. mesgsys->addS8Fast(_PREHASH_PathTwistBegin, twist_begin);
  207. S8 radius_offset = (S8) llround(params->getRadiusOffset() / SCALE_QUANTA);
  208. mesgsys->addS8Fast(_PREHASH_PathRadiusOffset, radius_offset);
  209. S8 taper_x = (S8) llround(params->getTaperX() / TAPER_QUANTA);
  210. mesgsys->addS8Fast(_PREHASH_PathTaperX, taper_x);
  211. S8 taper_y = (S8) llround(params->getTaperY() / TAPER_QUANTA);
  212. mesgsys->addS8Fast(_PREHASH_PathTaperY, taper_y);
  213. U8 revolutions = (U8) llround( (params->getRevolutions() - 1.0f) / REV_QUANTA);
  214. mesgsys->addU8Fast(_PREHASH_PathRevolutions, revolutions);
  215. S8 skew = (S8) llround(params->getSkew() / SCALE_QUANTA);
  216. mesgsys->addS8Fast(_PREHASH_PathSkew, skew);
  217. return true;
  218. }
  219. bool LLVolumeMessage::packPathParams(
  220. const LLPathParams* params,
  221. LLDataPacker &dp)
  222. {
  223. // Default to cylinder with no cut, top same size as bottom, no shear, no twist
  224. static LLPathParams defaultparams(LL_PCODE_PATH_LINE, U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), U8(0), 0);
  225. if (!params)
  226. params = &defaultparams;
  227. U8 curve = params->getCurveType();
  228. dp.packU8(curve, "Curve");
  229. U16 begin = (U16) llround(params->getBegin() / CUT_QUANTA);
  230. dp.packU16(begin, "Begin");
  231. U16 end = 50000 - (U16) llround(params->getEnd() / CUT_QUANTA);
  232. dp.packU16(end, "End");
  233. // Avoid truncation problem with direct F32->U8 cast.
  234. // (e.g., (U8) (0.50 / 0.01) = (U8) 49.9999999 = 49 not 50.
  235. U8 pack_scale_x = 200 - (U8) llround(params->getScaleX() / SCALE_QUANTA);
  236. dp.packU8(pack_scale_x, "ScaleX");
  237. U8 pack_scale_y = 200 - (U8) llround(params->getScaleY() / SCALE_QUANTA);
  238. dp.packU8(pack_scale_y, "ScaleY");
  239. S8 pack_shear_x = (S8) llround(params->getShearX() / SHEAR_QUANTA);
  240. dp.packU8(*(U8 *)&pack_shear_x, "ShearX");
  241. S8 pack_shear_y = (S8) llround(params->getShearY() / SHEAR_QUANTA);
  242. dp.packU8(*(U8 *)&pack_shear_y, "ShearY");
  243. S8 twist = (S8) llround(params->getTwist() / SCALE_QUANTA);
  244. dp.packU8(*(U8 *)&twist, "Twist");
  245. S8 twist_begin = (S8) llround(params->getTwistBegin() / SCALE_QUANTA);
  246. dp.packU8(*(U8 *)&twist_begin, "TwistBegin");
  247. S8 radius_offset = (S8) llround(params->getRadiusOffset() / SCALE_QUANTA);
  248. dp.packU8(*(U8 *)&radius_offset, "RadiusOffset");
  249. S8 taper_x = (S8) llround(params->getTaperX() / TAPER_QUANTA);
  250. dp.packU8(*(U8 *)&taper_x, "TaperX");
  251. S8 taper_y = (S8) llround(params->getTaperY() / TAPER_QUANTA);
  252. dp.packU8(*(U8 *)&taper_y, "TaperY");
  253. U8 revolutions = (U8) llround( (params->getRevolutions() - 1.0f) / REV_QUANTA);
  254. dp.packU8(*(U8 *)&revolutions, "Revolutions");
  255. S8 skew = (S8) llround(params->getSkew() / SCALE_QUANTA);
  256. dp.packU8(*(U8 *)&skew, "Skew");
  257. return true;
  258. }
  259. bool LLVolumeMessage::unpackPathParams(
  260. LLPathParams* params,
  261. LLMessageSystem* mesgsys,
  262. char* block_name,
  263. S32 block_num)
  264. {
  265. U8 curve;
  266. mesgsys->getU8Fast(block_name, _PREHASH_PathCurve, curve, block_num);
  267. params->setCurveType(curve);
  268. U16 begin;
  269. mesgsys->getU16Fast(block_name, _PREHASH_PathBegin, begin, block_num);
  270. params->setBegin((F32)(begin * CUT_QUANTA));
  271. U16 end;
  272. mesgsys->getU16Fast(block_name, _PREHASH_PathEnd, end, block_num);
  273. params->setEnd((F32)((50000 - end) * CUT_QUANTA));
  274. U8 pack_scale_x, pack_scale_y;
  275. mesgsys->getU8Fast(block_name, _PREHASH_PathScaleX, pack_scale_x, block_num);
  276. mesgsys->getU8Fast(block_name, _PREHASH_PathScaleY, pack_scale_y, block_num);
  277. F32 x = (F32) (200 - pack_scale_x) * SCALE_QUANTA;
  278. F32 y = (F32) (200 - pack_scale_y) * SCALE_QUANTA;
  279. params->setScale( x, y );
  280. S8 shear_x_quant, shear_y_quant;
  281. mesgsys->getS8Fast(block_name, _PREHASH_PathShearX, shear_x_quant, block_num);
  282. mesgsys->getS8Fast(block_name, _PREHASH_PathShearY, shear_y_quant, block_num);
  283. F32 shear_x = (F32) shear_x_quant * SHEAR_QUANTA;
  284. F32 shear_y = (F32) shear_y_quant * SHEAR_QUANTA;
  285. params->setShear( shear_x, shear_y );
  286. S8 twist;
  287. mesgsys->getS8Fast(block_name, _PREHASH_PathTwist, twist, block_num );
  288. params->setTwist((F32)(twist * SCALE_QUANTA));
  289. S8 twist_begin;
  290. mesgsys->getS8Fast(block_name, _PREHASH_PathTwistBegin, twist_begin, block_num );
  291. params->setTwistBegin((F32)(twist_begin * SCALE_QUANTA));
  292. S8 radius_offset;
  293. mesgsys->getS8Fast(block_name, _PREHASH_PathRadiusOffset, radius_offset, block_num );
  294. params->setRadiusOffset((F32)(radius_offset * SCALE_QUANTA));
  295. S8 taper_x_quant, taper_y_quant;
  296. mesgsys->getS8Fast(block_name, _PREHASH_PathTaperX, taper_x_quant, block_num );
  297. mesgsys->getS8Fast(block_name, _PREHASH_PathTaperY, taper_y_quant, block_num );
  298. F32 taper_x = (F32)(taper_x_quant * TAPER_QUANTA);
  299. F32 taper_y = (F32)(taper_y_quant * TAPER_QUANTA);
  300. params->setTaper( taper_x, taper_y );
  301. U8 revolutions;
  302. mesgsys->getU8Fast(block_name, _PREHASH_PathRevolutions, revolutions, block_num );
  303. params->setRevolutions((F32)(revolutions * REV_QUANTA + 1.0f));
  304. S8 skew;
  305. mesgsys->getS8Fast(block_name, _PREHASH_PathSkew, skew, block_num );
  306. params->setSkew((F32)(skew * SCALE_QUANTA));
  307. /*
  308. llinfos << "Unpacking Path Block " << block_num << llendl;
  309. llinfos << "Curve:     " << (U32)params->getCurve() << llendl;
  310. llinfos << "Begin:     " << params->getBegin() << llendl;
  311. llinfos << "End:     " << params->getEnd() << llendl;
  312. llinfos << "Scale:     " << params->getScale() << llendl;
  313. llinfos << "Twist:     " << params->getTwist() << llendl;
  314. */
  315. return true;
  316. }
  317. bool LLVolumeMessage::unpackPathParams(LLPathParams* params, LLDataPacker &dp)
  318. {
  319. U8 value;
  320. S8 svalue;
  321. U16 temp_u16;
  322. dp.unpackU8(value, "Curve");
  323. params->setCurveType( value );
  324. dp.unpackU16(temp_u16, "Begin");
  325. params->setBegin((F32)(temp_u16 * CUT_QUANTA));
  326. dp.unpackU16(temp_u16, "End");
  327. params->setEnd((F32)((50000 - temp_u16) * CUT_QUANTA));
  328. dp.unpackU8(value, "ScaleX");
  329. F32 x = (F32) (200 - value) * SCALE_QUANTA;
  330. dp.unpackU8(value, "ScaleY");
  331. F32 y = (F32) (200 - value) * SCALE_QUANTA;
  332. params->setScale( x, y );
  333. dp.unpackU8(value, "ShearX");
  334. svalue = *(S8 *)&value;
  335. F32 shear_x = (F32) svalue * SHEAR_QUANTA;
  336. dp.unpackU8(value, "ShearY");
  337. svalue = *(S8 *)&value;
  338. F32 shear_y = (F32) svalue * SHEAR_QUANTA;
  339. params->setShear( shear_x, shear_y );
  340. dp.unpackU8(value, "Twist");
  341. svalue = *(S8 *)&value;
  342. params->setTwist((F32)(svalue * SCALE_QUANTA));
  343. dp.unpackU8(value, "TwistBegin");
  344. svalue = *(S8 *)&value;
  345. params->setTwistBegin((F32)(svalue * SCALE_QUANTA));
  346. dp.unpackU8(value, "RadiusOffset");
  347. svalue = *(S8 *)&value;
  348. params->setRadiusOffset((F32)(svalue * SCALE_QUANTA));
  349. dp.unpackU8(value, "TaperX");
  350. svalue = *(S8 *)&value;
  351. params->setTaperX((F32)(svalue * TAPER_QUANTA));
  352. dp.unpackU8(value, "TaperY");
  353. svalue = *(S8 *)&value;
  354. params->setTaperY((F32)(svalue * TAPER_QUANTA));
  355. dp.unpackU8(value, "Revolutions");
  356. params->setRevolutions((F32)(value * REV_QUANTA + 1.0f));
  357. dp.unpackU8(value, "Skew");
  358. svalue = *(S8 *)&value;
  359. params->setSkew((F32)(svalue * SCALE_QUANTA));
  360. return true;
  361. }
  362. //============================================================================
  363. // static
  364. bool LLVolumeMessage::constrainVolumeParams(LLVolumeParams& params)
  365. {
  366. U32 bad = 0;
  367. // This is called immediately after an unpack. feed the raw data
  368. // through the checked setters to constraint it to a valid set of
  369. // volume params.
  370. bad |= params.setType(params.getProfileParams().getCurveType(),
  371.  params.getPathParams().getCurveType()) ? 0 : 1;
  372. bad |= params.setBeginAndEndS(params.getProfileParams().getBegin(),
  373.   params.getProfileParams().getEnd()) ? 0 : 2;
  374. bad |= params.setBeginAndEndT(params.getPathParams().getBegin(),
  375.   params.getPathParams().getEnd()) ? 0 : 4;
  376. bad |= params.setHollow(params.getProfileParams().getHollow()) ? 0 : 8;
  377. bad |= params.setTwistBegin(params.getPathParams().getTwistBegin()) ? 0 : 0x10;
  378. bad |= params.setTwistEnd(params.getPathParams().getTwistEnd()) ? 0 : 0x20;
  379. bad |= params.setRatio(params.getPathParams().getScaleX(),
  380.    params.getPathParams().getScaleY()) ? 0 : 0x40;
  381. bad |= params.setShear(params.getPathParams().getShearX(),
  382.    params.getPathParams().getShearY()) ? 0 : 0x80;
  383. bad |= params.setTaper(params.getPathParams().getTaperX(),
  384.    params.getPathParams().getTaperY()) ? 0 : 0x100;
  385. bad |= params.setRevolutions(params.getPathParams().getRevolutions()) ? 0 : 0x200;
  386. bad |= params.setRadiusOffset(params.getPathParams().getRadiusOffset()) ? 0 : 0x400;
  387. bad |= params.setSkew(params.getPathParams().getSkew()) ? 0 : 0x800;
  388. if(bad)
  389. {
  390. llwarns << "LLVolumeMessage::constrainVolumeParams() - "
  391. << "forced to constrain incoming volume params: "
  392. << llformat("0x%04x",bad) << llendl;
  393. }
  394. return bad ? false : true;
  395. }
  396. bool LLVolumeMessage::packVolumeParams(const LLVolumeParams* params, LLMessageSystem *mesgsys)
  397. {
  398. // llinfos << "pack volume" << llendl;
  399. if (params)
  400. {
  401. packPathParams(&params->getPathParams(), mesgsys);
  402. packProfileParams(&params->getProfileParams(), mesgsys);
  403. }
  404. else
  405. {
  406. packPathParams(0, mesgsys);
  407. packProfileParams(0, mesgsys);
  408. }
  409. return true;
  410. }
  411. bool LLVolumeMessage::packVolumeParams(const LLVolumeParams* params, LLDataPacker &dp)
  412. {
  413. // llinfos << "pack volume" << llendl;
  414. if (params)
  415. {
  416. packPathParams(&params->getPathParams(), dp);
  417. packProfileParams(&params->getProfileParams(), dp);
  418. }
  419. else
  420. {
  421. packPathParams(0, dp);
  422. packProfileParams(0, dp);
  423. }
  424. return true;
  425. }
  426. bool LLVolumeMessage::unpackVolumeParams(
  427. LLVolumeParams* params,
  428. LLMessageSystem* mesgsys,
  429. char* block_name,
  430. S32 block_num)
  431. {
  432. bool ok = true;
  433. ok &= unpackPathParams(
  434. &params->getPathParams(),
  435. mesgsys,
  436. block_name,
  437. block_num);
  438. ok &= unpackProfileParams(
  439. &params->getProfileParams(),
  440. mesgsys,
  441. block_name,
  442. block_num);
  443. ok &= constrainVolumeParams(*params);
  444. return ok;
  445. }
  446. bool LLVolumeMessage::unpackVolumeParams(
  447. LLVolumeParams* params,
  448. LLDataPacker &dp)
  449. {
  450. bool ok = true;
  451. ok &= unpackPathParams(&params->getPathParams(), dp);
  452. ok &= unpackProfileParams(&params->getProfileParams(), dp);
  453. ok &= constrainVolumeParams(*params);
  454. return ok;
  455. }
  456. //============================================================================