aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs27
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs28
3 files changed, 46 insertions, 15 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 40ebed1..bb76717 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -11631,8 +11631,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11631 11631
11632 udata.scale = new Vector3(block.Data, 0); 11632 udata.scale = new Vector3(block.Data, 0);
11633 11633
11634 // udata.change = ObjectChangeType.groupS; 11634 udata.change = ObjectChangeType.groupS;
11635 udata.change = ObjectChangeType.primS; // to conform to current SL
11636 updatehandler(localId, udata, this); 11635 updatehandler(localId, udata, this);
11637 11636
11638 break; 11637 break;
@@ -11643,8 +11642,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11643 udata.position = new Vector3(block.Data, 0); 11642 udata.position = new Vector3(block.Data, 0);
11644 udata.scale = new Vector3(block.Data, 12); 11643 udata.scale = new Vector3(block.Data, 12);
11645 11644
11646 // udata.change = ObjectChangeType.groupPS; 11645 udata.change = ObjectChangeType.groupPS;
11647 udata.change = ObjectChangeType.primPS; // to conform to current SL
11648 updatehandler(localId, udata, this); 11646 updatehandler(localId, udata, this);
11649 break; 11647 break;
11650 11648
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 982913a..debb164 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1276,9 +1276,36 @@ namespace OpenSim.Region.Framework.Scenes
1276 { 1276 {
1277 if (m_parentScene.Permissions.CanEditObject(grp.UUID, remoteClient.AgentId)) 1277 if (m_parentScene.Permissions.CanEditObject(grp.UUID, remoteClient.AgentId))
1278 { 1278 {
1279 // These two are exceptions SL makes in the interpretation
1280 // of the change flags. Must check them here because otherwise
1281 // the group flag (see below) would be lost
1282 if (data.change == ObjectChangeType.groupS)
1283 data.change = ObjectChangeType.primS;
1284 if (data.change == ObjectChangeType.groupPS)
1285 data.change = ObjectChangeType.primPS;
1279 part.StoreUndoState(data.change); // lets test only saving what we changed 1286 part.StoreUndoState(data.change); // lets test only saving what we changed
1280 grp.doChangeObject(part, (ObjectChangeData)data); 1287 grp.doChangeObject(part, (ObjectChangeData)data);
1281 } 1288 }
1289 else
1290 {
1291 // Is this any kind of group operation?
1292 if ((data.change & ObjectChangeType.Group) != 0)
1293 {
1294 // Is a move and/or rotation requested?
1295 if ((data.change & (ObjectChangeType.Position | ObjectChangeType.Rotation)) != 0)
1296 {
1297 // Are we allowed to move it?
1298 if (m_parentScene.Permissions.CanMoveObject(grp.UUID, remoteClient.AgentId))
1299 {
1300 // Strip all but move and rotation from request
1301 data.change &= (ObjectChangeType.Group | ObjectChangeType.Position | ObjectChangeType.Rotation);
1302
1303 part.StoreUndoState(data.change);
1304 grp.doChangeObject(part, (ObjectChangeData)data);
1305 }
1306 }
1307 }
1308 }
1282 } 1309 }
1283 } 1310 }
1284 } 1311 }
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
index 9fefc4e..8f2feba 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEDynamics.cs
@@ -118,6 +118,7 @@ namespace OpenSim.Region.Physics.OdePlugin
118 118
119 // auxiliar 119 // auxiliar
120 private float m_lmEfect = 0; // current linear motor eficiency 120 private float m_lmEfect = 0; // current linear motor eficiency
121 private float m_lmDecay = 1.0f;
121 private float m_amEfect = 0; // current angular motor eficiency 122 private float m_amEfect = 0; // current angular motor eficiency
122 private float m_ffactor = 1.0f; 123 private float m_ffactor = 1.0f;
123 124
@@ -155,6 +156,7 @@ namespace OpenSim.Region.Physics.OdePlugin
155 156
156 m_linearMotorDecayTimescale = vd.m_linearMotorDecayTimescale; 157 m_linearMotorDecayTimescale = vd.m_linearMotorDecayTimescale;
157 if (m_linearMotorDecayTimescale < m_timestep) m_linearMotorDecayTimescale = m_timestep; 158 if (m_linearMotorDecayTimescale < m_timestep) m_linearMotorDecayTimescale = m_timestep;
159 m_linearMotorDecayTimescale += 0.2f;
158 m_linearMotorDecayTimescale *= m_invtimestep; 160 m_linearMotorDecayTimescale *= m_invtimestep;
159 161
160 m_linearMotorTimescale = vd.m_linearMotorTimescale; 162 m_linearMotorTimescale = vd.m_linearMotorTimescale;
@@ -208,6 +210,7 @@ namespace OpenSim.Region.Physics.OdePlugin
208 m_referenceFrame = vd.m_referenceFrame; 210 m_referenceFrame = vd.m_referenceFrame;
209 211
210 m_lmEfect = 0; 212 m_lmEfect = 0;
213 m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale);
211 m_amEfect = 0; 214 m_amEfect = 0;
212 m_ffactor = 1.0f; 215 m_ffactor = 1.0f;
213 } 216 }
@@ -279,7 +282,7 @@ namespace OpenSim.Region.Physics.OdePlugin
279 case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE: 282 case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE:
280 if (pValue < m_timestep) pValue = m_timestep; 283 if (pValue < m_timestep) pValue = m_timestep;
281 else if (pValue > 120) pValue = 120; 284 else if (pValue > 120) pValue = 120;
282 m_linearMotorDecayTimescale = pValue * m_invtimestep; 285 m_linearMotorDecayTimescale = (0.2f +pValue) * m_invtimestep;
283 break; 286 break;
284 case Vehicle.LINEAR_MOTOR_TIMESCALE: 287 case Vehicle.LINEAR_MOTOR_TIMESCALE:
285 if (pValue < m_timestep) pValue = m_timestep; 288 if (pValue < m_timestep) pValue = m_timestep;
@@ -318,9 +321,10 @@ namespace OpenSim.Region.Physics.OdePlugin
318 case Vehicle.LINEAR_MOTOR_DIRECTION: 321 case Vehicle.LINEAR_MOTOR_DIRECTION:
319 m_linearMotorDirection = new Vector3(pValue, pValue, pValue); 322 m_linearMotorDirection = new Vector3(pValue, pValue, pValue);
320 len = m_linearMotorDirection.Length(); 323 len = m_linearMotorDirection.Length();
321 if (len > 30.0f) 324 if (len > 100.0f)
322 m_linearMotorDirection *= (30.0f / len); 325 m_linearMotorDirection *= (100.0f / len);
323 m_lmEfect = 1.0f; // turn it on 326 m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
327 m_lmEfect = 1.0f / m_linearMotorTimescale; // turn it on
324 m_ffactor = 0.01f; 328 m_ffactor = 0.01f;
325 if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body) 329 if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
326 && !rootPrim.m_isSelected && !rootPrim.m_disabled) 330 && !rootPrim.m_isSelected && !rootPrim.m_disabled)
@@ -368,9 +372,10 @@ namespace OpenSim.Region.Physics.OdePlugin
368 case Vehicle.LINEAR_MOTOR_DIRECTION: 372 case Vehicle.LINEAR_MOTOR_DIRECTION:
369 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); 373 m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z);
370 len = m_linearMotorDirection.Length(); 374 len = m_linearMotorDirection.Length();
371 if (len > 30.0f) 375 if (len > 100.0f)
372 m_linearMotorDirection *= (30.0f / len); 376 m_linearMotorDirection *= (100.0f / len);
373 m_lmEfect = 1.0f; // turn it on 377 m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
378 m_lmEfect = 1.0f / m_linearMotorTimescale; // turn it on
374 m_ffactor = 0.01f; 379 m_ffactor = 0.01f;
375 if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body) 380 if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
376 && !rootPrim.m_isSelected && !rootPrim.m_disabled) 381 && !rootPrim.m_isSelected && !rootPrim.m_disabled)
@@ -603,12 +608,13 @@ namespace OpenSim.Region.Physics.OdePlugin
603// VehicleFlag.HOVER_GLOBAL_HEIGHT); 608// VehicleFlag.HOVER_GLOBAL_HEIGHT);
604 break; 609 break;
605 } 610 }
606 611 m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale);
607 }//end SetDefaultsForType 612 }//end SetDefaultsForType
608 613
609 internal void Stop() 614 internal void Stop()
610 { 615 {
611 m_lmEfect = 0; 616 m_lmEfect = 0;
617 m_lmDecay = 1.0f;
612 m_amEfect = 0; 618 m_amEfect = 0;
613 m_ffactor = 1f; 619 m_ffactor = 1f;
614 } 620 }
@@ -739,10 +745,10 @@ namespace OpenSim.Region.Physics.OdePlugin
739 Vector3 curLocalAngVel = curAngVel * irotq; // current angular velocity in local 745 Vector3 curLocalAngVel = curAngVel * irotq; // current angular velocity in local
740 746
741 // linear motor 747 // linear motor
742 if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000) 748 if (m_lmEfect > 0.001 && m_linearMotorTimescale < 1000)
743 { 749 {
744 tmpV = m_linearMotorDirection - curLocalVel; // velocity error 750 tmpV = m_linearMotorDirection - curLocalVel; // velocity error
745 tmpV *= m_lmEfect / m_linearMotorTimescale; // error to correct in this timestep 751 tmpV *= m_lmEfect; // error to correct in this timestep
746 tmpV *= rotq; // to world 752 tmpV *= rotq; // to world
747 753
748 if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0) 754 if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
@@ -760,7 +766,7 @@ namespace OpenSim.Region.Physics.OdePlugin
760 force.Y += tmpV.Y; 766 force.Y += tmpV.Y;
761 force.Z += tmpV.Z; 767 force.Z += tmpV.Z;
762 } 768 }
763 m_lmEfect *= (1.0f - 1.0f / m_linearMotorDecayTimescale); 769 m_lmEfect *= m_lmDecay;
764 770
765 m_ffactor = 0.01f + 1e-4f * curVel.LengthSquared(); 771 m_ffactor = 0.01f + 1e-4f * curVel.LengthSquared();
766 } 772 }