diff options
author | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
commit | 420b91db29485df39fd6e724e782c449158811cb (patch) | |
tree | b471a94563af914d3ed3edd3e856d21cb1b69945 /indra/newview/llagentpilot.cpp |
Print done when done.
Diffstat (limited to 'indra/newview/llagentpilot.cpp')
-rw-r--r-- | indra/newview/llagentpilot.cpp | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/indra/newview/llagentpilot.cpp b/indra/newview/llagentpilot.cpp new file mode 100644 index 0000000000..2a6353fe2e --- /dev/null +++ b/indra/newview/llagentpilot.cpp @@ -0,0 +1,250 @@ +/** + * @file llagentpilot.cpp + * @brief LLAgentPilot class implementation + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "llviewerprecompiledheaders.h" + +#include <iostream> +#include <fstream> +#include <iomanip> + +#include "llagentpilot.h" +#include "llagent.h" +#include "llframestats.h" +#include "viewer.h" +#include "llviewercontrol.h" + +LLAgentPilot gAgentPilot; + +BOOL LLAgentPilot::sLoop = TRUE; + +LLAgentPilot::LLAgentPilot() +{ + mRecording = FALSE; + mPlaying = FALSE; + mStarted = FALSE; + mNumRuns = -1; +} + +LLAgentPilot::~LLAgentPilot() +{ +} + +void LLAgentPilot::load(const char *filename) +{ + llifstream file; + + file.open(filename); + + if (!file) + { + llinfos << "Couldn't open " << filename << ", aborting agentpilot load!" << llendl; + return; + } + else + { + llinfos << "Opening pilot file " << filename << llendl; + } + + S32 num_actions; + + file >> num_actions; + + S32 i; + for (i = 0; i < num_actions; i++) + { + S32 action_type; + Action new_action; + file >> new_action.mTime >> action_type; + file >> new_action.mTarget.mdV[VX] >> new_action.mTarget.mdV[VY] >> new_action.mTarget.mdV[VZ]; + new_action.mType = (EActionType)action_type; + mActions.put(new_action); + } + + file.close(); +} + +void LLAgentPilot::save(const char *filename) +{ + llofstream file; + file.open(filename); + + if (!file) + { + llinfos << "Couldn't open " << filename << ", aborting agentpilot save!" << llendl; + } + + file << mActions.count() << '\n'; + + S32 i; + for (i = 0; i < mActions.count(); i++) + { + file << mActions[i].mTime << "\t" << mActions[i].mType << "\t"; + file << std::setprecision(32) << mActions[i].mTarget.mdV[VX] << "\t" << mActions[i].mTarget.mdV[VY] << "\t" << mActions[i].mTarget.mdV[VZ] << '\n'; + } + + file.close(); +} + +void LLAgentPilot::startRecord() +{ + mActions.reset(); + mTimer.reset(); + addAction(STRAIGHT); + mRecording = TRUE; +} + +void LLAgentPilot::stopRecord() +{ + gAgentPilot.addAction(STRAIGHT); + gAgentPilot.save(gSavedSettings.getString("StatsPilotFile").c_str()); + mRecording = FALSE; +} + +void LLAgentPilot::addAction(enum EActionType action_type) +{ + llinfos << "Adding waypoint: " << gAgent.getPositionGlobal() << llendl; + Action action; + action.mType = action_type; + action.mTarget = gAgent.getPositionGlobal(); + action.mTime = mTimer.getElapsedTimeF32(); + mLastRecordTime = (F32)action.mTime; + mActions.put(action); +} + +void LLAgentPilot::startPlayback() +{ + if (!mPlaying) + { + mPlaying = TRUE; + mCurrentAction = 0; + mTimer.reset(); + + if (mActions.count()) + { + llinfos << "Starting playback, moving to waypoint 0" << llendl; + gAgent.startAutoPilotGlobal(mActions[0].mTarget); + mStarted = FALSE; + } + else + { + llinfos << "No autopilot data, cancelling!" << llendl; + mPlaying = FALSE; + } + } +} + +void LLAgentPilot::stopPlayback() +{ + if (mPlaying) + { + mPlaying = FALSE; + mCurrentAction = 0; + mTimer.reset(); + gAgent.stopAutoPilot(); + } +} + +void LLAgentPilot::updateTarget() +{ + if (mPlaying) + { + if (mCurrentAction < mActions.count()) + { + if (0 == mCurrentAction) + { + if (gAgent.getAutoPilot()) + { + // Wait until we get to the first location before starting. + return; + } + else + { + if (!mStarted) + { + llinfos << "At start, beginning playback" << llendl; + mTimer.reset(); + LLFrameStats::startLogging(NULL); + mStarted = TRUE; + } + } + } + if (mTimer.getElapsedTimeF32() > mActions[mCurrentAction].mTime) + { + //gAgent.stopAutoPilot(); + mCurrentAction++; + + if (mCurrentAction < mActions.count()) + { + gAgent.startAutoPilotGlobal(mActions[mCurrentAction].mTarget); + } + else + { + stopPlayback(); + LLFrameStats::stopLogging(NULL); + mNumRuns--; + if (sLoop) + { + if ((mNumRuns < 0) || (mNumRuns > 0)) + { + llinfos << "Looping, restarting playback" << llendl; + startPlayback(); + } + else if (mQuitAfterRuns) + { + llinfos << "Done with all runs, quitting viewer!" << llendl; + app_force_quit(NULL); + } + else + { + llinfos << "Done with all runs, disabling pilot" << llendl; + stopPlayback(); + } + } + } + } + } + else + { + stopPlayback(); + } + } + else if (mRecording) + { + if (mTimer.getElapsedTimeF32() - mLastRecordTime > 1.f) + { + addAction(STRAIGHT); + } + } +} + +// static +void LLAgentPilot::startRecord(void *) +{ + gAgentPilot.startRecord(); +} + +void LLAgentPilot::saveRecord(void *) +{ + gAgentPilot.stopRecord(); +} + +void LLAgentPilot::addWaypoint(void *) +{ + gAgentPilot.addAction(STRAIGHT); +} + +void LLAgentPilot::startPlayback(void *) +{ + gAgentPilot.mNumRuns = -1; + gAgentPilot.startPlayback(); +} + +void LLAgentPilot::stopPlayback(void *) +{ + gAgentPilot.stopPlayback(); +} |