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. --- .../Environment/Scenes/AllNewSceneObjectGroup2.cs | 299 +++++++++++++++++++++ .../Environment/Scenes/AllNewSceneObjectPart2.cs | 211 +++++++++++++++ 2 files changed, 510 insertions(+) create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup2.cs create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart2.cs (limited to 'OpenSim/Region/Environment') 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