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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llagentpilot.cpp
  3.  * @brief LLAgentPilot class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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 "llviewerprecompiledheaders.h"
  33. #include <iostream>
  34. #include <fstream>
  35. #include <iomanip>
  36. #include "llagentpilot.h"
  37. #include "llagent.h"
  38. #include "llappviewer.h"
  39. #include "llviewercontrol.h"
  40. LLAgentPilot gAgentPilot;
  41. BOOL LLAgentPilot::sLoop = TRUE;
  42. BOOL LLAgentPilot::sReplaySession = FALSE;
  43. LLAgentPilot::LLAgentPilot() :
  44. mNumRuns(-1),
  45. mQuitAfterRuns(FALSE),
  46. mRecording(FALSE),
  47. mLastRecordTime(0.f),
  48. mStarted(FALSE),
  49. mPlaying(FALSE),
  50. mCurrentAction(0)
  51. {
  52. }
  53. LLAgentPilot::~LLAgentPilot()
  54. {
  55. }
  56. void LLAgentPilot::load(const std::string& filename)
  57. {
  58. if(filename.empty())
  59. {
  60. return;
  61. }
  62. llifstream file(filename);
  63. if (!file)
  64. {
  65. lldebugs << "Couldn't open " << filename
  66. << ", aborting agentpilot load!" << llendl;
  67. return;
  68. }
  69. else
  70. {
  71. llinfos << "Opening pilot file " << filename << llendl;
  72. }
  73. S32 num_actions;
  74. file >> num_actions;
  75. for (S32 i = 0; i < num_actions; i++)
  76. {
  77. S32 action_type;
  78. Action new_action;
  79. file >> new_action.mTime >> action_type;
  80. file >> new_action.mTarget.mdV[VX] >> new_action.mTarget.mdV[VY] >> new_action.mTarget.mdV[VZ];
  81. new_action.mType = (EActionType)action_type;
  82. mActions.put(new_action);
  83. }
  84. file.close();
  85. }
  86. void LLAgentPilot::save(const std::string& filename)
  87. {
  88. llofstream file;
  89. file.open(filename);
  90. if (!file)
  91. {
  92. llinfos << "Couldn't open " << filename << ", aborting agentpilot save!" << llendl;
  93. }
  94. file << mActions.count() << 'n';
  95. S32 i;
  96. for (i = 0; i < mActions.count(); i++)
  97. {
  98. file << mActions[i].mTime << "t" << mActions[i].mType << "t";
  99. file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "t" << mActions[i].mTarget.mdV[VY] << "t" << mActions[i].mTarget.mdV[VZ] << 'n';
  100. }
  101. file.close();
  102. }
  103. void LLAgentPilot::startRecord()
  104. {
  105. mActions.reset();
  106. mTimer.reset();
  107. addAction(STRAIGHT);
  108. mRecording = TRUE;
  109. }
  110. void LLAgentPilot::stopRecord()
  111. {
  112. gAgentPilot.addAction(STRAIGHT);
  113. gAgentPilot.save(gSavedSettings.getString("StatsPilotFile"));
  114. mRecording = FALSE;
  115. }
  116. void LLAgentPilot::addAction(enum EActionType action_type)
  117. {
  118. llinfos << "Adding waypoint: " << gAgent.getPositionGlobal() << llendl;
  119. Action action;
  120. action.mType = action_type;
  121. action.mTarget = gAgent.getPositionGlobal();
  122. action.mTime = mTimer.getElapsedTimeF32();
  123. mLastRecordTime = (F32)action.mTime;
  124. mActions.put(action);
  125. }
  126. void LLAgentPilot::startPlayback()
  127. {
  128. if (!mPlaying)
  129. {
  130. mPlaying = TRUE;
  131. mCurrentAction = 0;
  132. mTimer.reset();
  133. if (mActions.count())
  134. {
  135. llinfos << "Starting playback, moving to waypoint 0" << llendl;
  136. gAgent.startAutoPilotGlobal(mActions[0].mTarget);
  137. mStarted = FALSE;
  138. }
  139. else
  140. {
  141. llinfos << "No autopilot data, cancelling!" << llendl;
  142. mPlaying = FALSE;
  143. }
  144. }
  145. }
  146. void LLAgentPilot::stopPlayback()
  147. {
  148. if (mPlaying)
  149. {
  150. mPlaying = FALSE;
  151. mCurrentAction = 0;
  152. mTimer.reset();
  153. gAgent.stopAutoPilot();
  154. }
  155. if (sReplaySession)
  156. {
  157. LLAppViewer::instance()->forceQuit();
  158. }
  159. }
  160. void LLAgentPilot::updateTarget()
  161. {
  162. if (mPlaying)
  163. {
  164. if (mCurrentAction < mActions.count())
  165. {
  166. if (0 == mCurrentAction)
  167. {
  168. if (gAgent.getAutoPilot())
  169. {
  170. // Wait until we get to the first location before starting.
  171. return;
  172. }
  173. else
  174. {
  175. if (!mStarted)
  176. {
  177. llinfos << "At start, beginning playback" << llendl;
  178. mTimer.reset();
  179. mStarted = TRUE;
  180. }
  181. }
  182. }
  183. if (mTimer.getElapsedTimeF32() > mActions[mCurrentAction].mTime)
  184. {
  185. //gAgent.stopAutoPilot();
  186. mCurrentAction++;
  187. if (mCurrentAction < mActions.count())
  188. {
  189. gAgent.startAutoPilotGlobal(mActions[mCurrentAction].mTarget);
  190. }
  191. else
  192. {
  193. stopPlayback();
  194. mNumRuns--;
  195. if (sLoop)
  196. {
  197. if ((mNumRuns < 0) || (mNumRuns > 0))
  198. {
  199. llinfos << "Looping, restarting playback" << llendl;
  200. startPlayback();
  201. }
  202. else if (mQuitAfterRuns)
  203. {
  204. llinfos << "Done with all runs, quitting viewer!" << llendl;
  205. LLAppViewer::instance()->forceQuit();
  206. }
  207. else
  208. {
  209. llinfos << "Done with all runs, disabling pilot" << llendl;
  210. stopPlayback();
  211. }
  212. }
  213. }
  214. }
  215. }
  216. else
  217. {
  218. stopPlayback();
  219. }
  220. }
  221. else if (mRecording)
  222. {
  223. if (mTimer.getElapsedTimeF32() - mLastRecordTime > 1.f)
  224. {
  225. addAction(STRAIGHT);
  226. }
  227. }
  228. }
  229. // static
  230. void LLAgentPilot::startRecord(void *)
  231. {
  232. gAgentPilot.startRecord();
  233. }
  234. void LLAgentPilot::saveRecord(void *)
  235. {
  236. gAgentPilot.stopRecord();
  237. }
  238. void LLAgentPilot::addWaypoint(void *)
  239. {
  240. gAgentPilot.addAction(STRAIGHT);
  241. }
  242. void LLAgentPilot::startPlayback(void *)
  243. {
  244. gAgentPilot.mNumRuns = -1;
  245. gAgentPilot.startPlayback();
  246. }
  247. void LLAgentPilot::stopPlayback(void *)
  248. {
  249. gAgentPilot.stopPlayback();
  250. }