summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave SIMmONs <simon@lindenlab.com>2011-03-17 16:22:54 -0700
committerDave SIMmONs <simon@lindenlab.com>2011-03-17 16:22:54 -0700
commit1c34f5caff0f074e983a8ef4d89fd08f1210f526 (patch)
tree58d6439ae47c6fa4b34a7b3ef5a7d13632364c6f
parent62214c96d465650f814194215b6b8f39ae38873a (diff)
ER-612: Add LLEventAPI access to LLAgent auto pilot. Follow-on work to allow blocking of flying during autopilot. Reviewed by Kelly.
-rw-r--r--indra/newview/llagent.cpp21
-rw-r--r--indra/newview/llagent.h4
-rw-r--r--indra/newview/llagentlistener.cpp66
3 files changed, 60 insertions, 31 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 9025982310..75acd1a0be 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -198,6 +198,7 @@ LLAgent::LLAgent() :
mAutoPilot(FALSE),
mAutoPilotFlyOnStop(FALSE),
+ mAutoPilotAllowFlying(TRUE),
mAutoPilotTargetGlobal(),
mAutoPilotStopDistance(1.f),
mAutoPilotUseRotation(FALSE),
@@ -1207,7 +1208,7 @@ BOOL LLAgent::getBusy() const
//-----------------------------------------------------------------------------
// startAutoPilotGlobal()
//-----------------------------------------------------------------------------
-void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold)
+void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold, BOOL allow_flying)
{
if (!isAgentAvatarValid())
{
@@ -1224,6 +1225,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
mAutoPilotCallbackData = callback_data;
mAutoPilotRotationThreshold = rot_threshold;
mAutoPilotBehaviorName = behavior_name;
+ mAutoPilotAllowFlying = allow_flying;
LLVector3d delta_pos( target_global );
delta_pos -= getPositionGlobal();
@@ -1251,14 +1253,23 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
}
}
- mAutoPilotFlyOnStop = getFlying();
+ if (mAutoPilotAllowFlying)
+ {
+ mAutoPilotFlyOnStop = getFlying();
+ }
+ else
+ {
+ mAutoPilotFlyOnStop = FALSE;
+ }
- if (distance > 30.0)
+ if (distance > 30.0 && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
- if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
+ if ( distance > 1.f &&
+ mAutoPilotAllowFlying &&
+ heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
@@ -1394,7 +1405,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (!isAgentAvatarValid()) return;
- if (gAgentAvatarp->mInAir)
+ if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 0fc77bd3a1..a45f55f27a 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -479,7 +479,8 @@ public:
const std::string& behavior_name = std::string(),
const LLQuaternion *target_rotation = NULL,
void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL,
- F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
+ F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
+ BOOL allow_flying = TRUE);
void startFollowPilot(const LLUUID &leader_id);
void stopAutoPilot(BOOL user_cancel = FALSE);
void setAutoPilotTargetGlobal(const LLVector3d &target_global);
@@ -488,6 +489,7 @@ public:
private:
BOOL mAutoPilot;
BOOL mAutoPilotFlyOnStop;
+ BOOL mAutoPilotAllowFlying;
LLVector3d mAutoPilotTargetGlobal;
F32 mAutoPilotStopDistance;
BOOL mAutoPilotUseRotation;
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 8476c4847a..6b12853547 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -184,10 +184,13 @@ void LLAgentListener::getAxes(const LLSD& event) const
quat.getEulerAngles(&roll, &pitch, &yaw);
// The official query API for LLQuaternion's [x, y, z, w] values is its
// public member mQ...
- sendReply(LLSDMap
- ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)))
- ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
- event);
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ sendReply(reply, event);
}
@@ -196,12 +199,17 @@ void LLAgentListener::getPosition(const LLSD& event) const
F32 roll, pitch, yaw;
LLQuaternion quat(mAgent.getQuat());
quat.getEulerAngles(&roll, &pitch, &yaw);
- sendReply(LLSDMap
- ("region", ll_sd_from_vector3(mAgent.getPositionAgent()))
- ("global", ll_sd_from_vector3d(mAgent.getPositionGlobal()))
- ("quat", ll_sd_from_quaternion(quat))
- ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
- event);
+
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
+ reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
+
+ sendReply(reply, event);
}
@@ -220,9 +228,15 @@ void LLAgentListener::startAutoPilot(LLSD const & event) const
{
rotation_threshold = event["rotation_threshold"].asReal();
}
- if (event.has("fly"))
+
+ BOOL allow_flying = TRUE;
+ if (event.has("allow_flying"))
{
- mAgent.setFlying(event["fly"].asBoolean());
+ allow_flying = (BOOL) event["allow_flying"].asBoolean();
+ if (!allow_flying)
+ {
+ mAgent.setFlying(FALSE);
+ }
}
mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event["target_global"]),
@@ -230,23 +244,25 @@ void LLAgentListener::startAutoPilot(LLSD const & event) const
target_rotation,
NULL, NULL,
event["stop_distance"].asReal(),
- rotation_threshold);
+ rotation_threshold,
+ allow_flying);
}
void LLAgentListener::getAutoPilot(const LLSD& event) const
{
- sendReply(LLSDMap
- ("enabled", (LLSD::Boolean) mAgent.getAutoPilot())
- ("target_global", ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal()))
- ("leader_id", mAgent.getAutoPilotLeaderID())
- ("stop_distance", mAgent.getAutoPilotStopDistance())
- ("target_distance", mAgent.getAutoPilotTargetDist())
- ("use_rotation", (LLSD::Boolean) mAgent.getAutoPilotUseRotation())
- ("target_facing", ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing()))
- ("rotation_threshold", mAgent.getAutoPilotRotationThreshold())
- ("behavior_name", mAgent.getAutoPilotBehaviorName()),
- ("fly", (LLSD::Boolean) mAgent.getFlying()),
- event);
+ LLSD reply = LLSD::emptyMap();
+ reply["enabled"] = (LLSD::Boolean) mAgent.getAutoPilot();
+ reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
+ reply["leader_id"] = mAgent.getAutoPilotLeaderID();
+ reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
+ reply["target_distance"] = mAgent.getAutoPilotTargetDist();
+ reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
+ reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
+ reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
+ reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
+ reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
+
+ sendReply(reply, event);
}
void LLAgentListener::startFollowPilot(LLSD const & event) const