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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmultigesture.cpp
  3.  * @brief Gestures that are asset-based and can have multiple steps.
  4.  *
  5.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2004-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 <algorithm>
  34. #include "stdio.h"
  35. #include "llmultigesture.h"
  36. #include "llerror.h"
  37. #include "lldatapacker.h"
  38. #include "llstl.h"
  39. const S32 GESTURE_VERSION = 2;
  40. //---------------------------------------------------------------------------
  41. // LLMultiGesture
  42. //---------------------------------------------------------------------------
  43. LLMultiGesture::LLMultiGesture()
  44. : mKey(),
  45. mMask(),
  46. mName(),
  47. mTrigger(),
  48. mReplaceText(),
  49. mSteps(),
  50. mPlaying(FALSE),
  51. mCurrentStep(0),
  52. mDoneCallback(NULL),
  53. mCallbackData(NULL)
  54. {
  55. reset();
  56. }
  57. LLMultiGesture::~LLMultiGesture()
  58. {
  59. std::for_each(mSteps.begin(), mSteps.end(), DeletePointer());
  60. }
  61. void LLMultiGesture::reset()
  62. {
  63. mPlaying = FALSE;
  64. mCurrentStep = 0;
  65. mWaitTimer.reset();
  66. mWaitingTimer = FALSE;
  67. mWaitingAnimations = FALSE;
  68. mWaitingAtEnd = FALSE;
  69. mRequestedAnimIDs.clear();
  70. mPlayingAnimIDs.clear();
  71. }
  72. S32 LLMultiGesture::getMaxSerialSize() const
  73. {
  74. S32 max_size = 0;
  75. // ascii format, being very conservative about possible
  76. // label lengths.
  77. max_size += 64; // version S32
  78. max_size += 64; // key U8
  79. max_size += 64; // mask U32
  80. max_size += 256; // trigger string
  81. max_size += 256; // replace string
  82. max_size += 64; // step count S32
  83. std::vector<LLGestureStep*>::const_iterator it;
  84. for (it = mSteps.begin(); it != mSteps.end(); ++it)
  85. {
  86. LLGestureStep* step = *it;
  87. max_size += 64; // type S32
  88. max_size += step->getMaxSerialSize();
  89. }
  90. /* binary format
  91. max_size += sizeof(S32); // version
  92. max_size += sizeof(mKey);
  93. max_size += sizeof(mMask);
  94. max_size += mTrigger.length() + 1; // for null
  95. max_size += sizeof(S32); // step count
  96. std::vector<LLGestureStep*>::const_iterator it;
  97. for (it = mSteps.begin(); it != mSteps.end(); ++it)
  98. {
  99. LLGestureStep* step = *it;
  100. max_size += sizeof(S32); // type
  101. max_size += step->getMaxSerialSize();
  102. }
  103. */
  104. return max_size;
  105. }
  106. BOOL LLMultiGesture::serialize(LLDataPacker& dp) const
  107. {
  108. dp.packS32(GESTURE_VERSION, "version");
  109. dp.packU8(mKey, "key");
  110. dp.packU32(mMask, "mask");
  111. dp.packString(mTrigger, "trigger");
  112. dp.packString(mReplaceText, "replace");
  113. S32 count = (S32)mSteps.size();
  114. dp.packS32(count, "step_count");
  115. S32 i;
  116. for (i = 0; i < count; ++i)
  117. {
  118. LLGestureStep* step = mSteps[i];
  119. dp.packS32(step->getType(), "step_type");
  120. BOOL ok = step->serialize(dp);
  121. if (!ok)
  122. {
  123. return FALSE;
  124. }
  125. }
  126. return TRUE;
  127. }
  128. BOOL LLMultiGesture::deserialize(LLDataPacker& dp)
  129. {
  130. S32 version;
  131. dp.unpackS32(version, "version");
  132. if (version != GESTURE_VERSION)
  133. {
  134. llwarns << "Bad LLMultiGesture version " << version
  135. << " should be " << GESTURE_VERSION
  136. << llendl;
  137. return FALSE;
  138. }
  139. dp.unpackU8(mKey, "key");
  140. dp.unpackU32(mMask, "mask");
  141. dp.unpackString(mTrigger, "trigger");
  142. dp.unpackString(mReplaceText, "replace");
  143. S32 count;
  144. dp.unpackS32(count, "step_count");
  145. if (count < 0)
  146. {
  147. llwarns << "Bad LLMultiGesture step count " << count << llendl;
  148. return FALSE;
  149. }
  150. S32 i;
  151. for (i = 0; i < count; ++i)
  152. {
  153. S32 type;
  154. dp.unpackS32(type, "step_type");
  155. EStepType step_type = (EStepType)type;
  156. switch(step_type)
  157. {
  158. case STEP_ANIMATION:
  159. {
  160. LLGestureStepAnimation* step = new LLGestureStepAnimation();
  161. BOOL ok = step->deserialize(dp);
  162. if (!ok) return FALSE;
  163. mSteps.push_back(step);
  164. break;
  165. }
  166. case STEP_SOUND:
  167. {
  168. LLGestureStepSound* step = new LLGestureStepSound();
  169. BOOL ok = step->deserialize(dp);
  170. if (!ok) return FALSE;
  171. mSteps.push_back(step);
  172. break;
  173. }
  174. case STEP_CHAT:
  175. {
  176. LLGestureStepChat* step = new LLGestureStepChat();
  177. BOOL ok = step->deserialize(dp);
  178. if (!ok) return FALSE;
  179. mSteps.push_back(step);
  180. break;
  181. }
  182. case STEP_WAIT:
  183. {
  184. LLGestureStepWait* step = new LLGestureStepWait();
  185. BOOL ok = step->deserialize(dp);
  186. if (!ok) return FALSE;
  187. mSteps.push_back(step);
  188. break;
  189. }
  190. default:
  191. {
  192. llwarns << "Bad LLMultiGesture step type " << type << llendl;
  193. return FALSE;
  194. }
  195. }
  196. }
  197. return TRUE;
  198. }
  199. void LLMultiGesture::dump()
  200. {
  201. llinfos << "key " << S32(mKey) << " mask " << U32(mMask) 
  202. << " trigger " << mTrigger
  203. << " replace " << mReplaceText
  204. << llendl;
  205. U32 i;
  206. for (i = 0; i < mSteps.size(); ++i)
  207. {
  208. LLGestureStep* step = mSteps[i];
  209. step->dump();
  210. }
  211. }
  212. //---------------------------------------------------------------------------
  213. // LLGestureStepAnimation
  214. //---------------------------------------------------------------------------
  215. LLGestureStepAnimation::LLGestureStepAnimation()
  216. : LLGestureStep(),
  217. mAnimName("None"), 
  218. mAnimAssetID(),
  219. mFlags(0x0)
  220. { }
  221. LLGestureStepAnimation::~LLGestureStepAnimation()
  222. { }
  223. S32 LLGestureStepAnimation::getMaxSerialSize() const
  224. {
  225. S32 max_size = 0;
  226. // ascii
  227. max_size += 256; // anim name
  228. max_size += 64; // anim asset id
  229. max_size += 64; // flags
  230. /* binary
  231. max_size += mAnimName.length() + 1;
  232. max_size += sizeof(mAnimAssetID);
  233. max_size += sizeof(mFlags);
  234. */
  235. return max_size;
  236. }
  237. BOOL LLGestureStepAnimation::serialize(LLDataPacker& dp) const
  238. {
  239. dp.packString(mAnimName, "anim_name");
  240. dp.packUUID(mAnimAssetID, "asset_id");
  241. dp.packU32(mFlags, "flags");
  242. return TRUE;
  243. }
  244. BOOL LLGestureStepAnimation::deserialize(LLDataPacker& dp)
  245. {
  246. dp.unpackString(mAnimName, "anim_name");
  247. // Apparently an earlier version of the gesture code added r to the end
  248. // of the animation names.  Get rid of it.  JC
  249. if (!mAnimName.empty() && mAnimName[mAnimName.length() - 1] == 'r')
  250. {
  251. // chop the last character
  252. mAnimName.resize(mAnimName.length() - 1);
  253. }
  254. dp.unpackUUID(mAnimAssetID, "asset_id");
  255. dp.unpackU32(mFlags, "flags");
  256. return TRUE;
  257. }
  258. // *TODO: Translate
  259. std::vector<std::string> LLGestureStepAnimation::getLabel() const 
  260. {
  261. std::vector<std::string> strings;
  262. // std::string label;
  263. if (mFlags & ANIM_FLAG_STOP)
  264. {
  265. strings.push_back( "AnimFlagStop");
  266. // label = "Stop Animation: ";
  267. }
  268. else
  269. {
  270. strings.push_back( "AnimFlagStart");
  271. // label = "Start Animation: "; 
  272. }
  273. strings.push_back( mAnimName);
  274. // label += mAnimName;
  275. return strings;
  276. }
  277. void LLGestureStepAnimation::dump()
  278. {
  279. llinfos << "step animation " << mAnimName
  280. << " id " << mAnimAssetID
  281. << " flags " << mFlags
  282. << llendl;
  283. }
  284. //---------------------------------------------------------------------------
  285. // LLGestureStepSound
  286. //---------------------------------------------------------------------------
  287. LLGestureStepSound::LLGestureStepSound()
  288. : LLGestureStep(),
  289. mSoundName("None"),
  290. mSoundAssetID(),
  291. mFlags(0x0)
  292. { }
  293. LLGestureStepSound::~LLGestureStepSound()
  294. { }
  295. S32 LLGestureStepSound::getMaxSerialSize() const
  296. {
  297. S32 max_size = 0;
  298. max_size += 256; // sound name
  299. max_size += 64; // sound asset id
  300. max_size += 64; // flags
  301. /* binary
  302. max_size += mSoundName.length() + 1;
  303. max_size += sizeof(mSoundAssetID);
  304. max_size += sizeof(mFlags);
  305. */
  306. return max_size;
  307. }
  308. BOOL LLGestureStepSound::serialize(LLDataPacker& dp) const
  309. {
  310. dp.packString(mSoundName, "sound_name");
  311. dp.packUUID(mSoundAssetID, "asset_id");
  312. dp.packU32(mFlags, "flags");
  313. return TRUE;
  314. }
  315. BOOL LLGestureStepSound::deserialize(LLDataPacker& dp)
  316. {
  317. dp.unpackString(mSoundName, "sound_name");
  318. dp.unpackUUID(mSoundAssetID, "asset_id");
  319. dp.unpackU32(mFlags, "flags");
  320. return TRUE;
  321. }
  322. // *TODO: Translate
  323. std::vector<std::string> LLGestureStepSound::getLabel() const
  324. {
  325. std::vector<std::string> strings;
  326. strings.push_back( "Sound");
  327. strings.push_back( mSoundName);
  328. // std::string label("Sound: ");
  329. // label += mSoundName;
  330. return strings;
  331. }
  332. void LLGestureStepSound::dump()
  333. {
  334. llinfos << "step sound " << mSoundName
  335. << " id " << mSoundAssetID
  336. << " flags " << mFlags
  337. << llendl;
  338. }
  339. //---------------------------------------------------------------------------
  340. // LLGestureStepChat
  341. //---------------------------------------------------------------------------
  342. LLGestureStepChat::LLGestureStepChat()
  343. : LLGestureStep(),
  344. mChatText(),
  345. mFlags(0x0)
  346. { }
  347. LLGestureStepChat::~LLGestureStepChat()
  348. { }
  349. S32 LLGestureStepChat::getMaxSerialSize() const
  350. {
  351. S32 max_size = 0;
  352. max_size += 256; // chat text
  353. max_size += 64; // flags
  354. /* binary
  355. max_size += mChatText.length() + 1;
  356. max_size += sizeof(mFlags);
  357. */
  358. return max_size;
  359. }
  360. BOOL LLGestureStepChat::serialize(LLDataPacker& dp) const
  361. {
  362. dp.packString(mChatText, "chat_text");
  363. dp.packU32(mFlags, "flags");
  364. return TRUE;
  365. }
  366. BOOL LLGestureStepChat::deserialize(LLDataPacker& dp)
  367. {
  368. dp.unpackString(mChatText, "chat_text");
  369. dp.unpackU32(mFlags, "flags");
  370. return TRUE;
  371. }
  372. // *TODO: Translate
  373. std::vector<std::string> LLGestureStepChat::getLabel() const
  374. {
  375. std::vector<std::string> strings;
  376. strings.push_back("Chat");
  377. strings.push_back(mChatText);
  378. return strings;
  379. }
  380. void LLGestureStepChat::dump()
  381. {
  382. llinfos << "step chat " << mChatText
  383. << " flags " << mFlags
  384. << llendl;
  385. }
  386. //---------------------------------------------------------------------------
  387. // LLGestureStepWait
  388. //---------------------------------------------------------------------------
  389. LLGestureStepWait::LLGestureStepWait()
  390. : LLGestureStep(),
  391. mWaitSeconds(0.f),
  392. mFlags(0x0)
  393. { }
  394. LLGestureStepWait::~LLGestureStepWait()
  395. { }
  396. S32 LLGestureStepWait::getMaxSerialSize() const
  397. {
  398. S32 max_size = 0;
  399. max_size += 64; // wait seconds
  400. max_size += 64; // flags
  401. /* binary
  402. max_size += sizeof(mWaitSeconds);
  403. max_size += sizeof(mFlags);
  404. */
  405. return max_size;
  406. }
  407. BOOL LLGestureStepWait::serialize(LLDataPacker& dp) const
  408. {
  409. dp.packF32(mWaitSeconds, "wait_seconds");
  410. dp.packU32(mFlags, "flags");
  411. return TRUE;
  412. }
  413. BOOL LLGestureStepWait::deserialize(LLDataPacker& dp)
  414. {
  415. dp.unpackF32(mWaitSeconds, "wait_seconds");
  416. dp.unpackU32(mFlags, "flags");
  417. return TRUE;
  418. }
  419. // *TODO: Translate
  420. std::vector<std::string> LLGestureStepWait::getLabel() const
  421. {
  422. std::vector<std::string> strings;
  423. strings.push_back( "Wait" );
  424. // std::string label("--- Wait: ");
  425. if (mFlags & WAIT_FLAG_TIME)
  426. {
  427. char buffer[64]; /* Flawfinder: ignore */
  428. snprintf(buffer, sizeof(buffer), "%.1f seconds", (double)mWaitSeconds); /* Flawfinder: ignore */
  429. strings.push_back(buffer);
  430. // label += buffer;
  431. }
  432. else if (mFlags & WAIT_FLAG_ALL_ANIM)
  433. {
  434. strings.push_back("until animations are done");
  435. // label += "until animations are done";
  436. }
  437. return strings;
  438. }
  439. void LLGestureStepWait::dump()
  440. {
  441. llinfos << "step wait " << mWaitSeconds
  442. << " flags " << mFlags
  443. << llendl;
  444. }