From 643a02ec60151e1a501d1b260592695b90be6233 Mon Sep 17 00:00:00 2001
From: MW
Date: Wed, 18 Jul 2007 18:12:16 +0000
Subject: More testing some ideas, to find best method for SceneObject
Primitive classes.
---
OpenSim/Region/ClientStack/ClientView.API.cs | 101 +------
.../ClientStack/ClientView.ProcessPackets.cs | 1 +
.../Environment/Scenes/AllNewSceneObjectGroup2.cs | 299 +++++++++++++++++++++
.../Environment/Scenes/AllNewSceneObjectPart2.cs | 211 +++++++++++++++
4 files changed, 512 insertions(+), 100 deletions(-)
create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup2.cs
create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart2.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs
index 044ad68..54ddd97 100644
--- a/OpenSim/Region/ClientStack/ClientView.API.cs
+++ b/OpenSim/Region/ClientStack/ClientView.API.cs
@@ -719,56 +719,7 @@ namespace OpenSim.Region.ClientStack
this.OutPacket(attach);
}
- ///
- /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
- /// or big changes to a existing primitive.
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags)
- {
- ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
- outPacket.RegionData.RegionHandle = regionHandle;
- outPacket.RegionData.TimeDilation = timeDilation;
- outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
- outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
- outPacket.ObjectData[0].ID = localID;
- outPacket.ObjectData[0].FullID = primData.FullID;
- byte[] pb = pos.GetBytes();
- Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
- byte[] rot = rotation.GetBytes();
- Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 48, rot.Length);
- OutPacket(outPacket);
- }
-
- ///
- /// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
- /// or big changes to a existing primitive.
- /// Uses default rotation
- ///
- ///
- ///
- public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID, uint flags)
- {
- ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
- outPacket.RegionData.RegionHandle = regionHandle;
- outPacket.RegionData.TimeDilation = timeDilation;
- outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
- outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
- outPacket.ObjectData[0].ID = localID;
- outPacket.ObjectData[0].FullID = primData.FullID;
- byte[] pb = pos.GetBytes();
- Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
-
- OutPacket(outPacket);
- }
-
-
+
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID)
{
ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
@@ -978,22 +929,6 @@ namespace OpenSim.Region.ClientStack
return dat;
}
-
- ///
- /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
- ///
- ///
- ///
- protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimData primData, LLUUID textureID, uint flags)
- {
- ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
- this.SetDefaultPrimPacketValues(objupdate);
- objupdate.UpdateFlags = flags;
- this.SetPrimPacketShapeData(objupdate, primData, textureID);
-
- return objupdate;
- }
-
///
/// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
///
@@ -1009,40 +944,6 @@ namespace OpenSim.Region.ClientStack
return objupdate;
}
-
- ///
- /// Copy the data from a PrimData object to a ObjectUpdatePacket
- ///
- ///
- ///
- protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimData primData, LLUUID textureID)
- {
- LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID);
- objectData.TextureEntry = ntex.ToBytes();
- objectData.OwnerID = primData.OwnerID;
- objectData.ParentID = primData.ParentID;
- objectData.PCode = primData.PCode;
- objectData.PathBegin = primData.PathBegin;
- objectData.PathEnd = primData.PathEnd;
- objectData.PathScaleX = primData.PathScaleX;
- objectData.PathScaleY = primData.PathScaleY;
- objectData.PathShearX = primData.PathShearX;
- objectData.PathShearY = primData.PathShearY;
- objectData.PathSkew = primData.PathSkew;
- objectData.ProfileBegin = primData.ProfileBegin;
- objectData.ProfileEnd = primData.ProfileEnd;
- objectData.Scale = primData.Scale;
- objectData.PathCurve = primData.PathCurve;
- objectData.ProfileCurve = primData.ProfileCurve;
- objectData.ProfileHollow = primData.ProfileHollow;
- objectData.PathRadiusOffset = primData.PathRadiusOffset;
- objectData.PathRevolutions = primData.PathRevolutions;
- objectData.PathTaperX = primData.PathTaperX;
- objectData.PathTaperY = primData.PathTaperY;
- objectData.PathTwist = primData.PathTwist;
- objectData.PathTwistBegin = primData.PathTwistBegin;
- }
-
protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData)
{
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
index dd0a6c8..338471e 100644
--- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
+++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs
@@ -218,6 +218,7 @@ namespace OpenSim.Region.ClientStack
if (OnAddPrim != null)
{
ObjectAddPacket addPacket = (ObjectAddPacket) Pack ;
+ Console.WriteLine(addPacket.ToString());
PrimitiveBaseShape shape = new PrimitiveBaseShape();
diff --git a/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup2.cs b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup2.cs
new file mode 100644
index 0000000..5d3a406
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup2.cs
@@ -0,0 +1,299 @@
+using System.Collections.Generic;
+using System.Text;
+using Axiom.Math;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+using OpenSim.Physics.Manager;
+
+namespace OpenSim.Region.Environment.Scenes
+{
+ // public delegate void PrimCountTaintedDelegate();
+
+ public class AllNewSceneObjectGroup2 : EntityBase
+ {
+ private Encoding enc = Encoding.ASCII;
+
+ protected AllNewSceneObjectPart2 m_rootPart;
+ protected Dictionary m_parts = new Dictionary();
+
+ public event PrimCountTaintedDelegate OnPrimCountTainted;
+
+ ///
+ ///
+ ///
+ public int primCount
+ {
+ get
+ {
+ return 1;
+ }
+ }
+
+ ///
+ ///
+ ///
+ public LLVector3 GroupCentrePoint
+ {
+ get
+ {
+ return new LLVector3(0, 0, 0);
+ }
+ }
+
+ ///
+ ///
+ ///
+ public AllNewSceneObjectGroup2()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public void FlagGroupForFullUpdate()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ public void FlagGroupForTerseUpdate()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void LinkToGroup(AllNewSceneObjectGroup2 objectGroup)
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private AllNewSceneObjectPart2 GetChildPrim(LLUUID primID)
+ {
+ AllNewSceneObjectPart2 childPart = null;
+ if (this.m_parts.ContainsKey(primID))
+ {
+ childPart = this.m_parts[primID];
+ }
+ return childPart;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private AllNewSceneObjectPart2 GetChildPrim(uint localID)
+ {
+ foreach (AllNewSceneObjectPart2 part in this.m_parts.Values)
+ {
+ if (part.m_localID == localID)
+ {
+ return part;
+ }
+ }
+ return null;
+ }
+
+ public void TriggerTainted()
+ {
+ if (OnPrimCountTainted != null)
+ {
+ this.OnPrimCountTainted();
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
+ {
+ this.Pos = pos;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void GetProperites(IClientAPI client)
+ {
+ ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
+ proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
+ proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
+ proper.ObjectData[0].ItemID = LLUUID.Zero;
+ proper.ObjectData[0].CreationDate = (ulong)this.m_rootPart.CreationDate;
+ proper.ObjectData[0].CreatorID = this.m_rootPart.CreatorID;
+ proper.ObjectData[0].FolderID = LLUUID.Zero;
+ proper.ObjectData[0].FromTaskID = LLUUID.Zero;
+ proper.ObjectData[0].GroupID = LLUUID.Zero;
+ proper.ObjectData[0].InventorySerial = 0;
+ proper.ObjectData[0].LastOwnerID = this.m_rootPart.LastOwnerID;
+ proper.ObjectData[0].ObjectID = this.m_uuid;
+ proper.ObjectData[0].OwnerID = this.m_rootPart.OwnerID;
+ proper.ObjectData[0].TouchName = enc.GetBytes(this.m_rootPart.TouchName + "\0");
+ proper.ObjectData[0].TextureID = new byte[0];
+ proper.ObjectData[0].SitName = enc.GetBytes(this.m_rootPart.SitName + "\0");
+ proper.ObjectData[0].Name = enc.GetBytes(this.m_rootPart.Name + "\0");
+ proper.ObjectData[0].Description = enc.GetBytes(this.m_rootPart.Description + "\0");
+ proper.ObjectData[0].OwnerMask = this.m_rootPart.OwnerMask;
+ proper.ObjectData[0].NextOwnerMask = this.m_rootPart.NextOwnerMask;
+ proper.ObjectData[0].GroupMask = this.m_rootPart.GroupMask;
+ proper.ObjectData[0].EveryoneMask = this.m_rootPart.EveryoneMask;
+ proper.ObjectData[0].BaseMask = this.m_rootPart.BaseMask;
+
+ client.OutPacket(proper);
+ }
+
+ #region Shape
+ ///
+ ///
+ ///
+ ///
+ public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock, uint localID)
+ {
+ AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
+ if (part != null)
+ {
+ part.UpdateShape(shapeBlock);
+ }
+ }
+ #endregion
+
+ #region Position
+ public void UpdateGroupPosition(LLVector3 pos)
+ {
+ this.m_pos = pos;
+ }
+
+ public void UpdateSinglePosition(LLVector3 pos, uint localID)
+ {
+ AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
+ if (part != null)
+ {
+ if (part.uuid == this.m_rootPart.uuid)
+ {
+ this.UpdateRootPosition(pos);
+ }
+ else
+ {
+ part.UpdateOffSet(pos);
+ }
+ }
+ }
+
+ private void UpdateRootPosition(LLVector3 pos)
+ {
+ LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
+ LLVector3 oldPos = new LLVector3(this.Pos.X + this.m_rootPart.OffsetPosition.X, this.Pos.Y + this.m_rootPart.OffsetPosition.Y, this.Pos.Z + this.m_rootPart.OffsetPosition.Z);
+ LLVector3 diff = oldPos - newPos;
+ Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
+ Axiom.Math.Quaternion partRotation = new Quaternion(this.m_rootPart.RotationOffset.W, this.m_rootPart.RotationOffset.X, this.m_rootPart.RotationOffset.Y, this.m_rootPart.RotationOffset.Z);
+ axDiff = partRotation.Inverse() * axDiff;
+ diff.X = axDiff.x;
+ diff.Y = axDiff.y;
+ diff.Z = axDiff.z;
+
+ foreach (AllNewSceneObjectPart2 obPart in this.m_parts.Values)
+ {
+ if (obPart.uuid != this.m_rootPart.uuid)
+ {
+ obPart.OffsetPosition = obPart.OffsetPosition + diff;
+ }
+ }
+ this.Pos = newPos;
+ pos.X = newPos.X;
+ pos.Y = newPos.Y;
+ pos.Z = newPos.Z;
+ }
+ #endregion
+
+ #region Roation
+ public void UpdateGroupRotation(LLQuaternion rot)
+ {
+ this.m_rootPart.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot)
+ {
+ this.m_rootPart.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
+ this.m_pos = pos;
+ }
+
+ public void UpdateSingleRotation(LLQuaternion rot, uint localID)
+ {
+ AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
+ if (part != null)
+ {
+ if (part.uuid == this.m_rootPart.uuid)
+ {
+ this.UpdateRootRotation(rot);
+ }
+ else
+ {
+ part.UpdateRotation(rot);
+ }
+ }
+ }
+ private void UpdateRootRotation(LLQuaternion rot)
+ {
+ this.m_rootPart.UpdateRotation(rot);
+ Axiom.Math.Quaternion axRot = new Quaternion(rot.W, rot.X, rot.Y, rot.Z);
+ Axiom.Math.Quaternion oldParentRot = new Quaternion(this.m_rootPart.RotationOffset.W, this.m_rootPart.RotationOffset.X, this.m_rootPart.RotationOffset.Y, this.m_rootPart.RotationOffset.Z);
+
+ foreach (AllNewSceneObjectPart2 prim in this.m_parts.Values)
+ {
+ if (prim.uuid != this.m_rootPart.uuid)
+ {
+ Vector3 axPos = new Vector3(prim.OffsetPosition.X, prim.OffsetPosition.Y, prim.OffsetPosition.Z);
+ axPos = oldParentRot * axPos;
+ axPos = axRot.Inverse() * axPos;
+ prim.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
+ Axiom.Math.Quaternion primsRot = new Quaternion(prim.RotationOffset.W, prim.RotationOffset.X, prim.RotationOffset.Y, prim.RotationOffset.Z);
+ Axiom.Math.Quaternion newRot = oldParentRot * primsRot;
+ newRot = axRot.Inverse() * newRot;
+ prim.RotationOffset = new LLQuaternion(newRot.w, newRot.x, newRot.y, newRot.z);
+ }
+ }
+ }
+ #endregion
+ ///
+ ///
+ ///
+ ///
+ private void SetPartAsRoot(AllNewSceneObjectPart2 part)
+ {
+ this.m_rootPart = part;
+ this.m_uuid = part.uuid;
+ this.m_localId = part.m_localID;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ private void SetPartAsNonRoot(AllNewSceneObjectPart2 part)
+ {
+
+ }
+ }
+}
diff --git a/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart2.cs b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart2.cs
new file mode 100644
index 0000000..b0df4af
--- /dev/null
+++ b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart2.cs
@@ -0,0 +1,211 @@
+using System.Collections.Generic;
+using System.Text;
+using System;
+using Axiom.Math;
+using libsecondlife;
+using libsecondlife.Packets;
+using OpenSim.Framework.Interfaces;
+using OpenSim.Framework.Types;
+
+namespace OpenSim.Region.Environment.Scenes
+{
+
+ public class AllNewSceneObjectPart2
+ {
+ private const uint FULL_MASK_PERMISSIONS = 2147483647;
+
+ private ulong m_regionHandle;
+ private uint m_flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
+ //private Dictionary inventoryItems;
+
+ public string SitName = "";
+ public string TouchName = "";
+ public string Text = "";
+
+ public LLUUID CreatorID;
+ public LLUUID OwnerID;
+ public LLUUID LastOwnerID;
+ public Int32 CreationDate;
+
+ public LLUUID uuid;
+ public uint m_localID;
+
+ public uint ParentID = 0;
+
+ public uint OwnerMask = FULL_MASK_PERMISSIONS;
+ public uint NextOwnerMask = FULL_MASK_PERMISSIONS;
+ public uint GroupMask = FULL_MASK_PERMISSIONS;
+ public uint EveryoneMask = FULL_MASK_PERMISSIONS;
+ public uint BaseMask = FULL_MASK_PERMISSIONS;
+
+ protected PrimitiveBaseShape m_Shape;
+
+ protected AllNewSceneObjectGroup2 m_parentGroup;
+
+
+ #region Properties
+ protected string m_name;
+ ///
+ ///
+ ///
+ public virtual string Name
+ {
+ get { return m_name; }
+ set { m_name = value; }
+ }
+
+ protected LLVector3 m_offset;
+ public LLVector3 OffsetPosition
+ {
+ get
+ {
+ return m_offset;
+ }
+ set
+ {
+ m_offset = value;
+ }
+ }
+
+ protected LLQuaternion m_rotationOffset;
+ public LLQuaternion RotationOffset
+ {
+ get
+ {
+ return m_rotationOffset;
+ }
+ set
+ {
+ m_rotationOffset = value;
+ }
+ }
+
+ private string m_description = "";
+ public string Description
+ {
+ get
+ {
+ return this.m_description;
+ }
+ set
+ {
+ this.m_description = value;
+ }
+ }
+
+ public PrimitiveBaseShape Shape
+ {
+ get
+ {
+ return this.m_Shape;
+ }
+ }
+
+ public LLVector3 Scale
+ {
+ set
+ {
+ this.m_Shape.Scale = value;
+ }
+ get
+ {
+ return this.m_Shape.Scale;
+ }
+ }
+ #endregion
+
+ #region Constructors
+ public AllNewSceneObjectPart2(ulong regionHandle, AllNewSceneObjectGroup2 parent, LLUUID ownerID, uint localID, PrimitiveBaseShape shape, LLVector3 position)
+ {
+ this.m_regionHandle = regionHandle;
+ this.m_parentGroup = parent;
+
+ this.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
+ this.OwnerID = ownerID;
+ this.CreatorID = this.OwnerID;
+ this.LastOwnerID = LLUUID.Zero;
+ this.uuid = LLUUID.Random();
+ this.m_localID = (uint)(localID);
+ this.m_Shape = shape;
+
+ this.OffsetPosition = position;
+ }
+ #endregion
+
+ #region Shape
+ ///
+ ///
+ ///
+ ///
+ public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
+ {
+ this.m_Shape.PathBegin = shapeBlock.PathBegin;
+ this.m_Shape.PathEnd = shapeBlock.PathEnd;
+ this.m_Shape.PathScaleX = shapeBlock.PathScaleX;
+ this.m_Shape.PathScaleY = shapeBlock.PathScaleY;
+ this.m_Shape.PathShearX = shapeBlock.PathShearX;
+ this.m_Shape.PathShearY = shapeBlock.PathShearY;
+ this.m_Shape.PathSkew = shapeBlock.PathSkew;
+ this.m_Shape.ProfileBegin = shapeBlock.ProfileBegin;
+ this.m_Shape.ProfileEnd = shapeBlock.ProfileEnd;
+ this.m_Shape.PathCurve = shapeBlock.PathCurve;
+ this.m_Shape.ProfileCurve = shapeBlock.ProfileCurve;
+ this.m_Shape.ProfileHollow = shapeBlock.ProfileHollow;
+ this.m_Shape.PathRadiusOffset = shapeBlock.PathRadiusOffset;
+ this.m_Shape.PathRevolutions = shapeBlock.PathRevolutions;
+ this.m_Shape.PathTaperX = shapeBlock.PathTaperX;
+ this.m_Shape.PathTaperY = shapeBlock.PathTaperY;
+ this.m_Shape.PathTwist = shapeBlock.PathTwist;
+ this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin;
+ }
+ #endregion
+
+ #region Texture
+ ///
+ ///
+ ///
+ ///
+ public void UpdateTextureEntry(byte[] textureEntry)
+ {
+ this.m_Shape.TextureEntry = textureEntry;
+ }
+ #endregion
+
+ #region Position
+ ///
+ ///
+ ///
+ ///
+ public void UpdateOffSet(LLVector3 pos)
+ {
+ LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
+ this.OffsetPosition = newPos;
+ }
+ #endregion
+
+ #region rotation
+ public void UpdateRotation(LLQuaternion rot)
+ {
+ this.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
+ }
+ #endregion
+
+ #region Resizing/Scale
+ ///
+ ///
+ ///
+ ///
+ public void Resize(LLVector3 scale)
+ {
+ LLVector3 offset = (scale - this.m_Shape.Scale);
+ offset.X /= 2;
+ offset.Y /= 2;
+ offset.Z /= 2;
+
+ this.OffsetPosition += offset;
+ this.m_Shape.Scale = scale;
+ }
+ #endregion
+ }
+}
+
--
cgit v1.1