From 6865f1c67d8f4b6fa44ddd9f3040a29e9e180950 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Sat, 19 Apr 2008 21:01:26 +0000 Subject: Thank you kindly krtaylor for a patch to solve: Linked objects won't scale together properly, only the root object scales. This happens with scaling both up and down or inputting numbers in the edit dialog. --- OpenSim/Region/Environment/Scenes/InnerScene.cs | 11 ++++++ OpenSim/Region/Environment/Scenes/Scene.cs | 1 + .../Region/Environment/Scenes/SceneObjectGroup.cs | 44 +++++++++++++++++++++- 3 files changed, 55 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index ea4283f..8894db0 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -890,6 +890,17 @@ namespace OpenSim.Region.Environment.Scenes } } } + public void UpdatePrimGroupScale(uint localID, LLVector3 scale, IClientAPI remoteClient) + { + SceneObjectGroup group = GetGroupByPrim(localID); + if (group != null) + { + if (PermissionsMngr.CanEditObjectPosition(remoteClient.AgentId, group.UUID)) + { + group.GroupResize(scale, localID); + } + } + } /// /// This handles the nifty little tool tip that you get when you drag your mouse over an object diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index b81b2d4..c5ed958 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1513,6 +1513,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnUpdatePrimGroupMouseRotation += m_innerScene.UpdatePrimRotation; client.OnUpdatePrimSingleRotation += m_innerScene.UpdatePrimSingleRotation; client.OnUpdatePrimScale += m_innerScene.UpdatePrimScale; + client.OnUpdatePrimGroupScale += m_innerScene.UpdatePrimGroupScale; client.OnUpdateExtraParams += m_innerScene.UpdateExtraParam; client.OnUpdatePrimShape += m_innerScene.UpdatePrimShape; client.OnRequestMapBlocks += RequestMapBlocks; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 3a9e52a..1f38e4f 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1520,7 +1520,7 @@ namespace OpenSim.Region.Environment.Scenes new PhysicsVector(scale.X, scale.Y, scale.Z); m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); } - if (part.UUID != m_rootPart.UUID) + //if (part.UUID != m_rootPart.UUID) ScheduleGroupForFullUpdate(); //if (part.UUID == m_rootPart.UUID) @@ -1534,6 +1534,48 @@ namespace OpenSim.Region.Environment.Scenes //} } } + public void GroupResize(LLVector3 scale, uint localID) + { + SceneObjectPart part = GetChildPart(localID); + if (part != null) + { + 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) + { + foreach (SceneObjectPart obPart in m_parts.Values) + { + if (obPart.UUID != m_rootPart.UUID) + { + + LLVector3 currentpos = new LLVector3(obPart.OffsetPosition); + currentpos.X *= x; + currentpos.Y *= y; + currentpos.Z *= z; + LLVector3 newSize = new LLVector3(obPart.Scale); + newSize.X *= x; + newSize.Y *= y; + newSize.Z *= z; + obPart.Resize(newSize); + obPart.UpdateOffSet(currentpos); + } + } + } + + if (part.PhysActor != null) + { + part.PhysActor.Size = + new PhysicsVector(scale.X, scale.Y, scale.Z); + m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); + } + + + ScheduleGroupForTerseUpdate(); + } + } #endregion -- cgit v1.1