public void GroupResize(Vector3 scale, uint localID)
{
SceneObjectPart part = (SceneObjectPart) GetChildPart(localID);
if (part != null)
{
CheckSculptAndLoad();
//Grab the mesh again if it is a sculpty/mesh as we remove it after the first mesh is built
part.IgnoreUndoUpdate = true;
IOpenRegionSettingsModule WSModule = Scene.RequestModuleInterface<IOpenRegionSettingsModule>();
if (WSModule != null)
{
if (WSModule.MinimumPrimScale != -1)
{
if (scale.X < WSModule.MinimumPrimScale)
scale.X = WSModule.MinimumPrimScale;
if (scale.Y < WSModule.MinimumPrimScale)
scale.Y = WSModule.MinimumPrimScale;
if (scale.Z < WSModule.MinimumPrimScale)
scale.Z = WSModule.MinimumPrimScale;
}
if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical &&
WSModule.MaximumPhysPrimScale != -1)
{
if (scale.X > WSModule.MaximumPhysPrimScale)
scale.X = WSModule.MaximumPhysPrimScale;
if (scale.Y > WSModule.MaximumPhysPrimScale)
scale.Y = WSModule.MaximumPhysPrimScale;
if (scale.Z > WSModule.MaximumPhysPrimScale)
scale.Z = WSModule.MaximumPhysPrimScale;
}
if (WSModule.MaximumPrimScale != -1)
{
if (scale.X > WSModule.MaximumPrimScale)
scale.X = WSModule.MaximumPrimScale;
if (scale.Y > WSModule.MaximumPrimScale)
scale.Y = WSModule.MaximumPrimScale;
if (scale.Z > WSModule.MaximumPrimScale)
scale.Z = WSModule.MaximumPrimScale;
}
}
float x = (scale.X/part.Scale.X);
float y = (scale.Y/part.Scale.Y);
float z = (scale.Z/part.Scale.Z);
if (x == 1.0f && y == 1.0f && z == 1.0f)
return;
foreach (SceneObjectPart obPart in m_partsList)
{
obPart.StoreUndoState();
}
//On some linked objects this hangs (maybe deadlock), do we need this?
//part.PhysActor.BlockPhysicalReconstruction = true;
RebuildPhysicalRepresentation(true, () =>
{
Vector3 prevScale = part.Scale;
prevScale.X *= x;
prevScale.Y *= y;
prevScale.Z *= z;
part.Resize(prevScale);
foreach (SceneObjectPart obPart in m_partsList.Where(obPart => obPart.UUID != m_rootPart.UUID))
{
obPart.IgnoreUndoUpdate = true;
Vector3 currentpos = new Vector3(obPart.OffsetPosition);
currentpos.X *= x;
currentpos.Y *= y;
currentpos.Z *= z;
Vector3 newSize = new Vector3(obPart.Scale);
newSize.X *= x;
newSize.Y *= y;
newSize.Z *= z;
obPart.Resize(newSize);
obPart.UpdateOffSet(currentpos);
obPart.IgnoreUndoUpdate = false;
}
part.IgnoreUndoUpdate = false;
m_rootPart.IgnoreUndoUpdate = false;
HasGroupChanged = true;
ScheduleGroupTerseUpdate();
m_ValidgrpOOB = false;
});
}
}