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.0.6.0-stable
parent
b6f8777dde
commit
6865f1c67d
|
@ -501,6 +501,7 @@ namespace OpenSim.Framework
|
|||
event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
|
||||
event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
|
||||
event UpdateVector OnUpdatePrimScale;
|
||||
event UpdateVector OnUpdatePrimGroupScale;
|
||||
event StatusChange OnChildAgentStatus;
|
||||
event GenericCall2 OnStopMovement;
|
||||
event Action<LLUUID> OnRemoveAvatar;
|
||||
|
|
|
@ -222,6 +222,7 @@ namespace OpenSim.Region.ClientStack
|
|||
private UpdateVector handlerUpdatePrimSinglePosition = null; //OnUpdatePrimSinglePosition;
|
||||
private UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = null; //OnUpdatePrimSingleRotation;
|
||||
private UpdateVector handlerUpdatePrimScale = null; //OnUpdatePrimScale;
|
||||
private UpdateVector handlerUpdatePrimGroupScale = null; //OnUpdateGroupScale;
|
||||
private UpdateVector handlerUpdateVector = null; //OnUpdatePrimGroupPosition;
|
||||
private UpdatePrimRotation handlerUpdatePrimRotation = null; //OnUpdatePrimGroupRotation;
|
||||
private UpdatePrimGroupRotation handlerUpdatePrimGroupRotation = null; //OnUpdatePrimGroupMouseRotation;
|
||||
|
@ -712,6 +713,7 @@ namespace OpenSim.Region.ClientStack
|
|||
public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
|
||||
public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
|
||||
public event UpdateVector OnUpdatePrimScale;
|
||||
public event UpdateVector OnUpdatePrimGroupScale;
|
||||
public event StatusChange OnChildAgentStatus;
|
||||
public event GenericCall2 OnStopMovement;
|
||||
public event Action<LLUUID> OnRemoveAvatar;
|
||||
|
@ -2590,6 +2592,7 @@ namespace OpenSim.Region.ClientStack
|
|||
case 5:
|
||||
|
||||
LLVector3 scale1 = new LLVector3(block.Data, 12);
|
||||
LLVector3 pos11 = new LLVector3(block.Data, 0);
|
||||
|
||||
handlerUpdatePrimScale = OnUpdatePrimScale;
|
||||
if (handlerUpdatePrimScale != null)
|
||||
|
@ -2597,6 +2600,13 @@ namespace OpenSim.Region.ClientStack
|
|||
|
||||
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
|
||||
handlerUpdatePrimScale(localId, scale1, this);
|
||||
|
||||
|
||||
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
|
||||
if (handlerUpdatePrimSinglePosition != null)
|
||||
{
|
||||
handlerUpdatePrimSinglePosition(localId, pos11, this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
|
@ -2661,27 +2671,35 @@ namespace OpenSim.Region.ClientStack
|
|||
LLVector3 scale5 = new LLVector3(block.Data, 12);
|
||||
LLVector3 pos5 = new LLVector3(block.Data, 0);
|
||||
|
||||
handlerUpdatePrimScale = OnUpdatePrimScale;
|
||||
if (handlerUpdatePrimScale != null)
|
||||
handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
|
||||
if (handlerUpdatePrimGroupScale != null)
|
||||
{
|
||||
|
||||
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z );
|
||||
handlerUpdatePrimScale(localId, scale5, this);
|
||||
handlerUpdatePrimGroupScale(localId, scale5, this);
|
||||
handlerUpdateVector = OnUpdatePrimGroupPosition;
|
||||
|
||||
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
|
||||
if (handlerUpdatePrimSinglePosition != null)
|
||||
if (handlerUpdateVector != null)
|
||||
{
|
||||
handlerUpdatePrimSinglePosition(localId, pos5, this);
|
||||
|
||||
handlerUpdateVector(localId, pos5, this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 21:
|
||||
LLVector3 scale6 = new LLVector3(block.Data, 12);
|
||||
LLVector3 pos6 = new LLVector3(block.Data, 0);
|
||||
|
||||
handlerUpdatePrimScale = OnUpdatePrimScale;
|
||||
if (handlerUpdatePrimScale != null)
|
||||
{
|
||||
// Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
|
||||
handlerUpdatePrimScale(localId, scale6, this);
|
||||
handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
|
||||
if (handlerUpdatePrimSinglePosition != null)
|
||||
{
|
||||
handlerUpdatePrimSinglePosition(localId, pos6, this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This handles the nifty little tool tip that you get when you drag your mouse over an object
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -109,6 +109,7 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
|
||||
public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
|
||||
public event UpdateVector OnUpdatePrimScale;
|
||||
public event UpdateVector OnUpdatePrimGroupScale;
|
||||
public event StatusChange OnChildAgentStatus;
|
||||
public event GenericCall2 OnStopMovement;
|
||||
public event Action<LLUUID> OnRemoveAvatar;
|
||||
|
|
Loading…
Reference in New Issue