Fixed rotation editing of individual prims in a group. I think positioning and rotations should now be correct (for both groups and on editing individuals of a group). Resizing still needs work.

Sugilite
MW 2007-07-05 19:19:39 +00:00
parent 8bdbdf48c7
commit 70d8731aa2
3 changed files with 70 additions and 11 deletions

View File

@ -46,12 +46,17 @@ namespace OpenSim.Region.Environment.Scenes
public EntityBase m_Parent; public EntityBase m_Parent;
#region Properties #region Properties
/// <summary>
/// If rootprim will return world position
/// otherwise will return local offset from rootprim
/// </summary>
public override LLVector3 Pos public override LLVector3 Pos
{ {
get get
{ {
if (isRootPrim) if (isRootPrim)
{ {
//if we are rootprim then our offset should be zero
return this.m_pos + m_Parent.Pos; return this.m_pos + m_Parent.Pos;
} }
else else
@ -77,7 +82,9 @@ namespace OpenSim.Region.Environment.Scenes
if (!this.isRootPrim) if (!this.isRootPrim)
{ {
Primitive parentPrim = (Primitive)this.m_Parent; Primitive parentPrim = (Primitive)this.m_Parent;
return this.m_pos + parentPrim.WorldPos; Axiom.Math.Vector3 offsetPos = new Vector3(this.m_pos.X, this.m_pos.Y, this.m_pos.Z);
offsetPos = parentPrim.rotation * offsetPos;
return parentPrim.WorldPos + new LLVector3(offsetPos.x, offsetPos.y, offsetPos.z);
} }
else else
{ {
@ -112,6 +119,17 @@ namespace OpenSim.Region.Environment.Scenes
#endregion #endregion
#region Constructors #region Constructors
/// <summary>
///
/// </summary>
/// <param name="regionHandle"></param>
/// <param name="world"></param>
/// <param name="addPacket"></param>
/// <param name="ownerID"></param>
/// <param name="localID"></param>
/// <param name="isRoot"></param>
/// <param name="parent"></param>
/// <param name="rootObject"></param>
public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject) public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject)
{ {
m_regionHandle = regionHandle; m_regionHandle = regionHandle;
@ -227,12 +245,13 @@ namespace OpenSim.Region.Environment.Scenes
Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z); Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
axPos = this.m_Parent.rotation.Inverse() * axPos; axPos = this.m_Parent.rotation.Inverse() * axPos;
this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
this.rotation = this.rotation * this.m_Parent.rotation.Inverse(); Axiom.Math.Quaternion oldRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z);
this.rotation = this.m_Parent.rotation.Inverse() * this.rotation;
this.updateFlag = 1; this.updateFlag = 1;
foreach (Primitive child in children) foreach (Primitive child in children)
{ {
child.SetRootParent(rootParent, newParent, oldPos); child.SetRootParent(rootParent, newParent, oldPos, oldRot);
} }
children.Clear(); children.Clear();
@ -243,10 +262,14 @@ namespace OpenSim.Region.Environment.Scenes
/// ///
/// </summary> /// </summary>
/// <param name="newRoot"></param> /// <param name="newRoot"></param>
public void SetRootParent(SceneObject newRoot , Primitive newParent, LLVector3 oldParentPosition) public void SetRootParent(SceneObject newRoot , Primitive newParent, LLVector3 oldParentPosition, Axiom.Math.Quaternion oldParentRotation)
{ {
LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z); LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z);
Axiom.Math.Vector3 axOldPos = new Vector3(oldPos.X, oldPos.Y, oldPos.Z);
axOldPos = oldParentRotation * axOldPos;
oldPos = new LLVector3(axOldPos.x, axOldPos.y, axOldPos.z);
oldPos += oldParentPosition; oldPos += oldParentPosition;
Axiom.Math.Quaternion oldRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z);
this.isRootPrim = false; this.isRootPrim = false;
this.m_Parent = newParent; this.m_Parent = newParent;
this.ParentID = newParent.LocalId; this.ParentID = newParent.LocalId;
@ -257,15 +280,20 @@ namespace OpenSim.Region.Environment.Scenes
Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z); Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
axPos = this.m_Parent.rotation.Inverse() * axPos; axPos = this.m_Parent.rotation.Inverse() * axPos;
this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
this.rotation = this.rotation * this.m_Parent.rotation.Inverse(); this.rotation = oldParentRotation * this.rotation;
this.rotation = this.m_Parent.rotation.Inverse()* this.rotation ;
this.updateFlag = 1; this.updateFlag = 1;
foreach (Primitive child in children) foreach (Primitive child in children)
{ {
child.SetRootParent(newRoot, newParent, oldPos); child.SetRootParent(newRoot, newParent, oldPos, oldRot);
} }
children.Clear(); children.Clear();
} }
/// <summary>
///
/// </summary>
/// <param name="offset"></param>
public void AddOffsetToChildren(LLVector3 offset) public void AddOffsetToChildren(LLVector3 offset)
{ {
foreach (Primitive prim in this.children) foreach (Primitive prim in this.children)
@ -275,6 +303,10 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
/// <summary>
///
/// </summary>
/// <param name="prim"></param>
public void AddToChildrenList(Primitive prim) public void AddToChildrenList(Primitive prim)
{ {
this.children.Add(prim); this.children.Add(prim);
@ -282,6 +314,10 @@ namespace OpenSim.Region.Environment.Scenes
#endregion #endregion
#region Resizing/Scale #region Resizing/Scale
/// <summary>
///
/// </summary>
/// <param name="scale"></param>
public void ResizeGoup(LLVector3 scale) public void ResizeGoup(LLVector3 scale)
{ {
LLVector3 offset = (scale - this.m_Shape.Scale); LLVector3 offset = (scale - this.m_Shape.Scale);
@ -317,9 +353,13 @@ namespace OpenSim.Region.Environment.Scenes
this.updateFlag = 2; this.updateFlag = 2;
} }
/// <summary>
///
/// </summary>
/// <param name="pos"></param>
public void UpdateSinglePosition(LLVector3 pos) public void UpdateSinglePosition(LLVector3 pos)
{ {
//Console.WriteLine("updating single prim position"); // Console.WriteLine("updating single prim position");
if (this.isRootPrim) if (this.isRootPrim)
{ {
LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
@ -350,14 +390,23 @@ namespace OpenSim.Region.Environment.Scenes
#endregion #endregion
#region Rotation #region Rotation
/// <summary>
///
/// </summary>
/// <param name="rot"></param>
public void UpdateRotation(LLQuaternion rot) public void UpdateRotation(LLQuaternion rot)
{ {
this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
this.updateFlag = 2; this.updateFlag = 2;
} }
/// <summary>
///
/// </summary>
/// <param name="rot"></param>
public void UpdateSingleRotation(LLQuaternion rot) public void UpdateSingleRotation(LLQuaternion rot)
{ {
//Console.WriteLine("updating single prim rotation");
Axiom.Math.Quaternion axRot = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); Axiom.Math.Quaternion axRot = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
Axiom.Math.Quaternion oldParentRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); Axiom.Math.Quaternion oldParentRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z);
this.rotation = axRot; this.rotation = axRot;
@ -367,13 +416,18 @@ namespace OpenSim.Region.Environment.Scenes
axPos = oldParentRot * axPos; axPos = oldParentRot * axPos;
axPos = axRot.Inverse() * axPos; axPos = axRot.Inverse() * axPos;
prim.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); prim.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
prim.rotation = prim.rotation * oldParentRot; prim.rotation = oldParentRot * prim.rotation ;
prim.rotation = prim.rotation * axRot.Inverse(); prim.rotation = axRot.Inverse()* prim.rotation;
prim.updateFlag = 2; prim.updateFlag = 2;
} }
this.updateFlag = 2; this.updateFlag = 2;
} }
/// <summary>
///
/// </summary>
/// <param name="pos"></param>
/// <param name="rot"></param>
public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot) public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot)
{ {
this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z); this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
@ -384,6 +438,10 @@ namespace OpenSim.Region.Environment.Scenes
#endregion #endregion
#region Shape #region Shape
/// <summary>
///
/// </summary>
/// <param name="shapeBlock"></param>
public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
{ {
this.m_Shape.PathBegin = shapeBlock.PathBegin; this.m_Shape.PathBegin = shapeBlock.PathBegin;

View File

@ -454,6 +454,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
public void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient) public void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient)
{ {
//Console.WriteLine("trying to update single prim rotation");
Primitive prim = null; Primitive prim = null;
foreach (EntityBase ent in Entities.Values) foreach (EntityBase ent in Entities.Values)
{ {