aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs9
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs80
2 files changed, 70 insertions, 19 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 837a994..55c4fda 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -228,7 +228,12 @@ namespace OpenSim.Region.Framework.Scenes
228 public bool m_allowScriptCrossings = true; 228 public bool m_allowScriptCrossings = true;
229 229
230 /// <summary> 230 /// <summary>
231 231 /// use legacy sittarget offsets to avoid contents breaks
232 /// to compensate for SL bug
233 /// </summary>
234 public bool LegacySitOffsets = true;
235
236 /// <summary>
232 /// Can avatars cross from and to this region? 237 /// Can avatars cross from and to this region?
233 /// </summary> 238 /// </summary>
234 public bool AllowAvatarCrossing { get; set; } 239 public bool AllowAvatarCrossing { get; set; }
@@ -960,6 +965,8 @@ namespace OpenSim.Region.Framework.Scenes
960 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); 965 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
961 m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance); 966 m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
962 967
968 LegacySitOffsets = startupConfig.GetBoolean("LegacyOpenSimSitOffsets", LegacySitOffsets);
969
963 if (m_defaultDrawDistance > m_maxDrawDistance) 970 if (m_defaultDrawDistance > m_maxDrawDistance)
964 m_defaultDrawDistance = m_maxDrawDistance; 971 m_defaultDrawDistance = m_maxDrawDistance;
965 972
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c3deeaf..fd647e1 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -144,6 +144,7 @@ namespace OpenSim.Region.Framework.Scenes
144 /// issue #1716 144 /// issue #1716
145 /// </summary> 145 /// </summary>
146 public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.4f); 146 public static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.4f);
147 public bool LegacySitOffsets = true;
147 148
148 /// <summary> 149 /// <summary>
149 /// Movement updates for agents in neighboring regions are sent directly to clients. 150 /// Movement updates for agents in neighboring regions are sent directly to clients.
@@ -1003,6 +1004,7 @@ namespace OpenSim.Region.Framework.Scenes
1003 m_name = String.Format("{0} {1}", Firstname, Lastname); 1004 m_name = String.Format("{0} {1}", Firstname, Lastname);
1004 m_uuid = client.AgentId; 1005 m_uuid = client.AgentId;
1005 LocalId = m_scene.AllocateLocalId(); 1006 LocalId = m_scene.AllocateLocalId();
1007 LegacySitOffsets = m_scene.LegacySitOffsets;
1006 1008
1007 UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid); 1009 UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
1008 if (account != null) 1010 if (account != null)
@@ -3211,30 +3213,72 @@ namespace OpenSim.Region.Framework.Scenes
3211// "[SCENE PRESENCE]: Sitting {0} at sit target {1}, {2} on {3} {4}", 3213// "[SCENE PRESENCE]: Sitting {0} at sit target {1}, {2} on {3} {4}",
3212// Name, sitTargetPos, sitTargetOrient, part.Name, part.LocalId); 3214// Name, sitTargetPos, sitTargetOrient, part.Name, part.LocalId);
3213 3215
3214 //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0);
3215 //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w);
3216
3217 //Quaternion result = (sitTargetOrient * vq) * nq;
3218
3219 double x, y, z, m; 3216 double x, y, z, m;
3220 3217 Vector3 sitOffset;
3221 Quaternion r = sitTargetOrient; 3218 Quaternion r = sitTargetOrient;
3222 m = r.X * r.X + r.Y * r.Y + r.Z * r.Z + r.W * r.W;
3223 3219
3224 if (Math.Abs(1.0 - m) > 0.000001) 3220 if(LegacySitOffsets)
3225 { 3221 {
3226 m = 1.0 / Math.Sqrt(m); 3222 double m1,m2;
3227 r.X *= (float)m; 3223
3228 r.Y *= (float)m; 3224 m1 = r.X * r.X + r.Y * r.Y;
3229 r.Z *= (float)m; 3225 m2 = r.Z * r.Z + r.W * r.W;
3230 r.W *= (float)m; 3226
3227 // Rotate the vector <0, 0, 1>
3228 x = 2 * (r.X * r.Z + r.Y * r.W);
3229 y = 2 * (-r.X * r.W + r.Y * r.Z);
3230 z = m2 - m1;
3231
3232 // Set m to be the square of the norm of r.
3233 m = m1 + m2;
3234
3235 // This constant is emperically determined to be what is used in SL.
3236 // See also http://opensimulator.org/mantis/view.php?id=7096
3237 double offset = 0.05;
3238
3239 // Normally m will be ~ 1, but if someone passed a handcrafted quaternion
3240 // to llSitTarget with values so small that squaring them is rounded off
3241 // to zero, then m could be zero. The result of this floating point
3242 // round off error (causing us to skip this impossible normalization)
3243 // is only 5 cm.
3244 if (m > 0.000001)
3245 {
3246 offset /= m;
3247 }
3248
3249 Vector3 up = new Vector3((float)x, (float)y, (float)z);
3250 sitOffset = up * (float)offset;
3231 } 3251 }
3252 else
3253 {
3254 m = r.X * r.X + r.Y * r.Y + r.Z * r.Z + r.W * r.W;
3255
3256 if (Math.Abs(1.0 - m) > 0.000001)
3257 {
3258 if(m != 0)
3259 {
3260 m = 1.0 / Math.Sqrt(m);
3261 r.X *= (float)m;
3262 r.Y *= (float)m;
3263 r.Z *= (float)m;
3264 r.W *= (float)m;
3265 }
3266 else
3267 {
3268 r.X = 0.0f;
3269 r.Y = 0.0f;
3270 r.Z = 0.0f;
3271 r.W = 1.0f;
3272 m = 1.0f;
3273 }
3274 }
3232 3275
3233 x = 2 * (r.X * r.Z + r.Y * r.W); 3276 x = 2 * (r.X * r.Z + r.Y * r.W);
3234 y = 2 * (-r.X * r.W + r.Y * r.Z); 3277 y = 2 * (-r.X * r.W + r.Y * r.Z);
3235 z = -r.X * r.X - r.Y * r.Y + r.Z * r.Z + r.W * r.W; 3278 z = -r.X * r.X - r.Y * r.Y + r.Z * r.Z + r.W * r.W;
3236 Vector3 up = new Vector3((float)x, (float)y, (float)z); 3279 Vector3 up = new Vector3((float)x, (float)y, (float)z);
3237 Vector3 sitOffset = up * Appearance.AvatarHeight * 0.02638f; 3280 sitOffset = up * Appearance.AvatarHeight * 0.02638f;
3281 }
3238 3282
3239 Vector3 newPos = sitTargetPos + sitOffset + SIT_TARGET_ADJUSTMENT; 3283 Vector3 newPos = sitTargetPos + sitOffset + SIT_TARGET_ADJUSTMENT;
3240 Quaternion newRot; 3284 Quaternion newRot;