replace objects scale clamp by a more readable clamp. Simplify GroupResize and let rescale factors < 1 also be checked for size limits, Set new scales directly not checking them again.
parent
8ed17f745d
commit
28d4afbe3a
|
@ -3795,156 +3795,101 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, scale);
|
// "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, scale);
|
||||||
|
|
||||||
|
if (Scene == null)
|
||||||
|
return;
|
||||||
|
|
||||||
PhysicsActor pa = m_rootPart.PhysActor;
|
PhysicsActor pa = m_rootPart.PhysActor;
|
||||||
|
|
||||||
if (Scene != null)
|
float minsize = Scene.m_minNonphys;
|
||||||
{
|
float maxsize = Scene.m_maxNonphys;
|
||||||
scale.X = Math.Max(Scene.m_minNonphys, Math.Min(Scene.m_maxNonphys, scale.X));
|
|
||||||
scale.Y = Math.Max(Scene.m_minNonphys, Math.Min(Scene.m_maxNonphys, scale.Y));
|
|
||||||
scale.Z = Math.Max(Scene.m_minNonphys, Math.Min(Scene.m_maxNonphys, scale.Z));
|
|
||||||
|
|
||||||
if (pa != null && pa.IsPhysical)
|
if (pa != null && pa.IsPhysical)
|
||||||
{
|
{
|
||||||
scale.X = Math.Max(Scene.m_minPhys, Math.Min(Scene.m_maxPhys, scale.X));
|
minsize = Scene.m_minPhys;
|
||||||
scale.Y = Math.Max(Scene.m_minPhys, Math.Min(Scene.m_maxPhys, scale.Y));
|
maxsize = Scene.m_maxPhys;
|
||||||
scale.Z = Math.Max(Scene.m_minPhys, Math.Min(Scene.m_maxPhys, scale.Z));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scale.X = Util.Clamp(scale.X, minsize, maxsize);
|
||||||
|
scale.Y = Util.Clamp(scale.Y, minsize, maxsize);
|
||||||
|
scale.Z = Util.Clamp(scale.Z, minsize, maxsize);
|
||||||
|
|
||||||
|
// requested scaling factors
|
||||||
float x = (scale.X / RootPart.Scale.X);
|
float x = (scale.X / RootPart.Scale.X);
|
||||||
float y = (scale.Y / RootPart.Scale.Y);
|
float y = (scale.Y / RootPart.Scale.Y);
|
||||||
float z = (scale.Z / RootPart.Scale.Z);
|
float z = (scale.Z / RootPart.Scale.Z);
|
||||||
|
|
||||||
SceneObjectPart[] parts = m_parts.GetArray();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
|
|
||||||
if (Scene != null & (x > 1.0f || y > 1.0f || z > 1.0f))
|
// fix scaling factors so parts don't violate dimensions
|
||||||
|
for(int i = 0;i < parts.Length;i++)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < parts.Length; i++)
|
SceneObjectPart obPart = parts[i];
|
||||||
|
if(obPart.UUID != m_rootPart.UUID)
|
||||||
{
|
{
|
||||||
SceneObjectPart obPart = parts[i];
|
Vector3 oldSize = new Vector3(obPart.Scale);
|
||||||
if (obPart.UUID != m_rootPart.UUID)
|
|
||||||
|
float f = 1.0f;
|
||||||
|
float a = 1.0f;
|
||||||
|
|
||||||
|
if(oldSize.X * x > maxsize)
|
||||||
{
|
{
|
||||||
Vector3 oldSize = new Vector3(obPart.Scale);
|
f = maxsize / oldSize.X;
|
||||||
|
a = f / x;
|
||||||
|
x *= a;
|
||||||
|
y *= a;
|
||||||
|
z *= a;
|
||||||
|
}
|
||||||
|
else if(oldSize.X * x < minsize)
|
||||||
|
{
|
||||||
|
f = minsize / oldSize.X;
|
||||||
|
a = f / x;
|
||||||
|
x *= a;
|
||||||
|
y *= a;
|
||||||
|
z *= a;
|
||||||
|
}
|
||||||
|
|
||||||
float f = 1.0f;
|
if(oldSize.Y * y > maxsize)
|
||||||
float a = 1.0f;
|
{
|
||||||
|
f = maxsize / oldSize.Y;
|
||||||
|
a = f / y;
|
||||||
|
x *= a;
|
||||||
|
y *= a;
|
||||||
|
z *= a;
|
||||||
|
}
|
||||||
|
else if(oldSize.Y * y < minsize)
|
||||||
|
{
|
||||||
|
f = minsize / oldSize.Y;
|
||||||
|
a = f / y;
|
||||||
|
x *= a;
|
||||||
|
y *= a;
|
||||||
|
z *= a;
|
||||||
|
}
|
||||||
|
|
||||||
if (pa != null && pa.IsPhysical)
|
if(oldSize.Z * z > maxsize)
|
||||||
{
|
{
|
||||||
if (oldSize.X * x > Scene.m_maxPhys)
|
f = maxsize / oldSize.Z;
|
||||||
{
|
a = f / z;
|
||||||
f = m_scene.m_maxPhys / oldSize.X;
|
x *= a;
|
||||||
a = f / x;
|
y *= a;
|
||||||
x *= a;
|
z *= a;
|
||||||
y *= a;
|
}
|
||||||
z *= a;
|
else if(oldSize.Z * z < minsize)
|
||||||
}
|
{
|
||||||
else if (oldSize.X * x < Scene.m_minPhys)
|
f = minsize / oldSize.Z;
|
||||||
{
|
a = f / z;
|
||||||
f = m_scene.m_minPhys / oldSize.X;
|
x *= a;
|
||||||
a = f / x;
|
y *= a;
|
||||||
x *= a;
|
z *= a;
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldSize.Y * y > Scene.m_maxPhys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_maxPhys / oldSize.Y;
|
|
||||||
a = f / y;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
else if (oldSize.Y * y < Scene.m_minPhys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_minPhys / oldSize.Y;
|
|
||||||
a = f / y;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldSize.Z * z > Scene.m_maxPhys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_maxPhys / oldSize.Z;
|
|
||||||
a = f / z;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
else if (oldSize.Z * z < Scene.m_minPhys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_minPhys / oldSize.Z;
|
|
||||||
a = f / z;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (oldSize.X * x > Scene.m_maxNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_maxNonphys / oldSize.X;
|
|
||||||
a = f / x;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
else if (oldSize.X * x < Scene.m_minNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_minNonphys / oldSize.X;
|
|
||||||
a = f / x;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldSize.Y * y > Scene.m_maxNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_maxNonphys / oldSize.Y;
|
|
||||||
a = f / y;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
else if (oldSize.Y * y < Scene.m_minNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_minNonphys / oldSize.Y;
|
|
||||||
a = f / y;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldSize.Z * z > Scene.m_maxNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_maxNonphys / oldSize.Z;
|
|
||||||
a = f / z;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
else if (oldSize.Z * z < Scene.m_minNonphys)
|
|
||||||
{
|
|
||||||
f = m_scene.m_minNonphys / oldSize.Z;
|
|
||||||
a = f / z;
|
|
||||||
x *= a;
|
|
||||||
y *= a;
|
|
||||||
z *= a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 prevScale = RootPart.Scale;
|
Vector3 rootScale = RootPart.Scale;
|
||||||
prevScale.X *= x;
|
rootScale.X *= x;
|
||||||
prevScale.Y *= y;
|
rootScale.Y *= y;
|
||||||
prevScale.Z *= z;
|
rootScale.Z *= z;
|
||||||
|
|
||||||
RootPart.Resize(prevScale);
|
RootPart.Scale = rootScale;
|
||||||
|
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -3962,7 +3907,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
newSize.Y *= y;
|
newSize.Y *= y;
|
||||||
newSize.Z *= z;
|
newSize.Z *= z;
|
||||||
|
|
||||||
obPart.Resize(newSize);
|
obPart.Scale = newSize;
|
||||||
obPart.UpdateOffSet(currentpos);
|
obPart.UpdateOffSet(currentpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3073,18 +3073,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (ParentGroup.Scene != null)
|
if (ParentGroup.Scene != null)
|
||||||
{
|
{
|
||||||
scale.X = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.X));
|
float minsize = ParentGroup.Scene.m_minNonphys;
|
||||||
scale.Y = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.Y));
|
float maxsize = ParentGroup.Scene.m_maxNonphys;
|
||||||
scale.Z = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.Z));
|
|
||||||
|
|
||||||
if (pa != null && pa.IsPhysical)
|
if (pa != null && pa.IsPhysical)
|
||||||
{
|
{
|
||||||
scale.X = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.X));
|
minsize = ParentGroup.Scene.m_minPhys;
|
||||||
scale.Y = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.Y));
|
maxsize = ParentGroup.Scene.m_maxPhys;
|
||||||
scale.Z = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.Z));
|
}
|
||||||
}
|
scale.X = Util.Clamp(scale.X, minsize, maxsize);
|
||||||
|
scale.Y = Util.Clamp(scale.Y, minsize, maxsize);
|
||||||
|
scale.Z = Util.Clamp(scale.Z, minsize, maxsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale);
|
// m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale);
|
||||||
|
|
||||||
Scale = scale;
|
Scale = scale;
|
||||||
|
|
Loading…
Reference in New Issue