diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index ebefdce31e..eafb882980 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -2012,6 +2012,15 @@ namespace OpenSim.Region.Environment.Scenes
// If we have children
lock (m_parts)
{
+ foreach (SceneObjectPart parts in m_parts.Values)
+ {
+ if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0)
+ {
+ data[47] = 0; // Reset physics
+ break;
+ }
+ }
+
if (m_parts.Count > 1)
{
foreach (SceneObjectPart parts in m_parts.Values)
@@ -2100,12 +2109,28 @@ namespace OpenSim.Region.Environment.Scenes
///
public void Resize(LLVector3 scale, uint localID)
{
+ if(scale.X > 65536.0f)
+ scale.X = 65536.0f;
+ if(scale.Y > 65536.0f)
+ scale.Y = 65536.0f;
+ if(scale.Z > 65536.0f)
+ scale.Z = 65536.0f;
+
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
part.Resize(scale);
if (part.PhysActor != null)
{
+ if(part.PhysActor.IsPhysical)
+ {
+ if(scale.X > 10.0f)
+ scale.X = 10.0f;
+ if(scale.Y > 10.0f)
+ scale.Y = 10.0f;
+ if(scale.Z > 10.0f)
+ scale.Z = 10.0f;
+ }
part.PhysActor.Size =
new PhysicsVector(scale.X, scale.Y, scale.Z);
m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
@@ -2132,10 +2157,102 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
+ if(scale.X > 65536.0f)
+ scale.X = 65536.0f;
+ if(scale.Y > 65536.0f)
+ scale.Y = 65536.0f;
+ if(scale.Z > 65536.0f)
+ scale.Z = 65536.0f;
+ if(part.PhysActor != null && part.PhysActor.IsPhysical)
+ {
+ if(scale.X > 10.0f)
+ scale.X = 10.0f;
+ if(scale.Y > 10.0f)
+ scale.Y = 10.0f;
+ if(scale.Z > 10.0f)
+ scale.Z = 10.0f;
+ }
float x = (scale.X / part.Scale.X);
float y = (scale.Y / part.Scale.Y);
float z = (scale.Z / part.Scale.Z);
- part.Resize(scale);
+
+ lock (m_parts)
+ {
+ if(x > 1.0f || y > 1.0f || z > 1.0f)
+ {
+ foreach (SceneObjectPart obPart in m_parts.Values)
+ {
+ if (obPart.UUID != m_rootPart.UUID)
+ {
+ LLVector3 oldSize = new LLVector3(obPart.Scale);
+
+ float f = 1.0f;
+ float a = 1.0f;
+
+ if(part.PhysActor != null && part.PhysActor.IsPhysical)
+ {
+ if(oldSize.X*x > 10.0f)
+ {
+ f = 10.0f / oldSize.X;
+ a = f / x;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if(oldSize.Y*y > 10.0f)
+ {
+ f = 10.0f / oldSize.Y;
+ a = f / y;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if(oldSize.Z*z > 10.0f)
+ {
+ f = 10.0f / oldSize.Z;
+ a = f / z;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ }
+ else
+ {
+ if(oldSize.X*x > 65536.0f)
+ {
+ f = 65536.0f / oldSize.X;
+ a = f / x;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if(oldSize.Y*y > 65536.0f)
+ {
+ f = 65536.0f / oldSize.Y;
+ a = f / y;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if(oldSize.Z*z > 65536.0f)
+ {
+ f = 65536.0f / oldSize.Z;
+ a = f / z;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ LLVector3 prevScale = part.Scale;
+ prevScale.X *= x;
+ prevScale.Y *= y;
+ prevScale.Z *= z;
+ part.Resize(prevScale);
lock (m_parts)
{
@@ -2160,7 +2277,7 @@ namespace OpenSim.Region.Environment.Scenes
if (part.PhysActor != null)
{
part.PhysActor.Size =
- new PhysicsVector(scale.X, scale.Y, scale.Z);
+ new PhysicsVector(prevScale.X, prevScale.Y, prevScale.Z);
m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
}
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index 2b986be64f..2538246ca7 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -831,7 +831,24 @@ namespace OpenSim.Region.ScriptEngine.Common
if ((status & BuiltIn_Commands_BaseClass.STATUS_PHYSICS) == BuiltIn_Commands_BaseClass.STATUS_PHYSICS)
{
if (value == 1)
+ {
+ SceneObjectGroup group = m_host.ParentGroup;
+ if(group == null)
+ return;
+ bool allow = true;
+ foreach(SceneObjectPart part in group.Children.Values)
+ {
+ if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0)
+ {
+ allow = false;
+ break;
+ }
+ }
+
+ if(!allow)
+ return;
m_host.ScriptSetPhysicsStatus(true);
+ }
else
m_host.ScriptSetPhysicsStatus(false);
@@ -948,6 +965,25 @@ namespace OpenSim.Region.ScriptEngine.Common
private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale)
{
// TODO: this needs to trigger a persistance save as well
+
+ if(part == null || part.ParentGroup == null || part.ParentGroup.RootPart == null)
+ return;
+
+ if(part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical)
+ {
+ if(scale.x > 10.0)
+ scale.x = 10.0;
+ if(scale.y > 10.0)
+ scale.y = 10.0;
+ if(scale.z > 10.0)
+ scale.z = 10.0;
+ }
+ if(scale.x > 65536.0)
+ scale.x = 65536.0;
+ if(scale.y > 65536.0)
+ scale.y = 65536.0;
+ if(scale.z > 65536.0)
+ scale.z = 65536.0;
LLVector3 tmp = part.Scale;
tmp.X = (float)scale.x;
tmp.Y = (float)scale.y;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 57f91415e0..4bf3e936c9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -671,7 +671,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((status & ScriptBaseClass.STATUS_PHYSICS) == ScriptBaseClass.STATUS_PHYSICS)
{
if (value == 1)
+ {
+ SceneObjectGroup group = m_host.ParentGroup;
+ if(group == null)
+ return;
+ bool allow = true;
+ foreach(SceneObjectPart part in group.Children.Values)
+ {
+ if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0)
+ {
+ allow = false;
+ break;
+ }
+ }
+
+ if(!allow)
+ return;
m_host.ScriptSetPhysicsStatus(true);
+ }
else
m_host.ScriptSetPhysicsStatus(false);
}
@@ -802,6 +819,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale)
{
// TODO: this needs to trigger a persistance save as well
+
+ if(part == null || part.ParentGroup == null || part.ParentGroup.RootPart == null)
+ return;
+
+ if(part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical)
+ {
+ if(scale.x > 10.0)
+ scale.x = 10.0;
+ if(scale.y > 10.0)
+ scale.y = 10.0;
+ if(scale.z > 10.0)
+ scale.z = 10.0;
+ }
+ if(scale.x > 65536.0)
+ scale.x = 65536.0;
+ if(scale.y > 65536.0)
+ scale.y = 65536.0;
+ if(scale.z > 65536.0)
+ scale.z = 65536.0;
LLVector3 tmp = part.Scale;
tmp.X = (float)scale.x;
tmp.Y = (float)scale.y;
diff --git a/prebuild.xml b/prebuild.xml
index 0d3332ddcc..d9d84740d4 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1543,6 +1543,7 @@
+
@@ -1825,6 +1826,7 @@
+