From 04ece84d6b3aa442ed7413f23b0daa30ff6d3ee8 Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 18 Jul 2007 13:40:07 +0000 Subject: few small changes --- .../Environment/Scenes/AllNewSceneObjectGroup.cs | 244 +++++++++++++++++++ .../Environment/Scenes/AllNewSceneObjectPart.cs | 258 +++++++++++++++++++++ OpenSim/Region/Environment/Scenes/EntityBase.cs | 8 +- OpenSim/Region/Environment/Scenes/Primitive.cs | 18 +- OpenSim/Region/Environment/Scenes/Scene.cs | 4 + OpenSim/Region/Environment/Scenes/SceneObject.cs | 3 +- 6 files changed, 532 insertions(+), 3 deletions(-) create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup.cs create mode 100644 OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart.cs (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup.cs new file mode 100644 index 0000000..b04340a --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectGroup.cs @@ -0,0 +1,244 @@ +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 AllNewSceneObjectGroup : EntityBase + { + private Encoding enc = Encoding.ASCII; + + protected AllNewSceneObjectPart 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 AllNewSceneObjectGroup() + { + + } + + /// + /// + /// + public void FlagGroupForFullUpdate() + { + + } + + /// + /// + /// + public void FlagGroupForTerseUpdate() + { + + } + + /// + /// + /// + /// + public void LinkToGroup(AllNewSceneObjectGroup objectGroup) + { + + } + + /// + /// + /// + /// + /// + public AllNewSceneObjectPart HasChildPrim(LLUUID primID) + { + AllNewSceneObjectPart childPart = null; + if (this.m_parts.ContainsKey(primID)) + { + childPart = this.m_parts[primID]; + } + return childPart; + } + + /// + /// + /// + /// + /// + public AllNewSceneObjectPart HasChildPrim(uint localID) + { + foreach (AllNewSceneObjectPart 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); + } + + /// + /// + /// + /// + private void SetPartAsRoot(AllNewSceneObjectPart part) + { + this.m_rootPart = part; + this.m_uuid = part.uuid; + this.m_localId = part.m_localID; + part.ParentID = 0; + part.UpdateHandler = delegate(ref LLVector3 pos, UpdateType direction, AllNewSceneObjectPart objectPart) + { + switch (direction) + { + case UpdateType.InComingNewPosition: + this.m_pos = new LLVector3(pos.X, pos.Y, pos.Z); + pos.X = 0; + pos.Y = 0; + pos.Z = 0; + break; + + case UpdateType.SinglePositionEdit: + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + LLVector3 oldPos = new LLVector3(this.Pos.X + objectPart.OffsetPosition.X, this.Pos.Y + objectPart.OffsetPosition.Y, this.Pos.Z + objectPart.OffsetPosition.Z); + LLVector3 diff = oldPos - newPos; + Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z); + Axiom.Math.Quaternion partRotation = new Quaternion(objectPart.RotationOffset.W, objectPart.RotationOffset.X, objectPart.RotationOffset.Y, objectPart.RotationOffset.Z); + axDiff = partRotation.Inverse() * axDiff; + diff.X = axDiff.x; + diff.Y = axDiff.y; + diff.Z = axDiff.z; + + foreach (AllNewSceneObjectPart obPart in this.m_parts.Values) + { + if (obPart.uuid == objectPart.uuid) + { + obPart.OffsetPosition = obPart.OffsetPosition + diff; + } + } + this.Pos = newPos; + pos.X = newPos.X; + pos.Y = newPos.Y; + pos.Z = newPos.Z; + break; + + case UpdateType.ResizeOffset: + this.Pos += pos; + LLVector3 offset = new LLVector3(-pos.X, -pos.Y, -pos.Z); + foreach (AllNewSceneObjectPart obPart2 in this.m_parts.Values) + { + if (obPart2.uuid == objectPart.uuid) + { + obPart2.OffsetPosition = obPart2.OffsetPosition + offset; + } + } + pos.X = 0; + pos.Y = 0; + pos.Z = 0; + break; + + case UpdateType.SingleRotationEdit: + break; + } + + + return pos; + }; + } + + /// + /// + /// + /// + private void SetPartAsNonRoot(AllNewSceneObjectPart part) + { + part.ParentID = this.m_rootPart.m_localID; + part.UpdateHandler = delegate(ref LLVector3 pos, UpdateType direction, AllNewSceneObjectPart objectPart) + { + return pos; + }; + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart.cs new file mode 100644 index 0000000..21659c4 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/AllNewSceneObjectPart.cs @@ -0,0 +1,258 @@ +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 enum UpdateType + { + OutGoingOffset, + InComingNewPosition, + SinglePositionEdit, + ResizeOffset, + SingleRotationEdit + } + + public delegate LLVector3 HandleUpdate(ref LLVector3 pos, UpdateType updateType, AllNewSceneObjectPart objectPart); + + public class AllNewSceneObjectPart + { + 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 AllNewSceneObjectGroup m_parentGroup; + + public HandleUpdate UpdateHandler; + + #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 AllNewSceneObjectPart(ulong regionHandle, AllNewSceneObjectGroup 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.UpdateHandler(ref position, UpdateType.InComingNewPosition, this); + 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 UpdateGroupPosition(LLVector3 pos) + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + this.UpdateHandler(ref newPos, UpdateType.InComingNewPosition, this); + this.OffsetPosition = newPos; + } + + public void UpdateSinglePosition(LLVector3 pos) + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + this.UpdateHandler(ref newPos, UpdateType.SinglePositionEdit, this); + this.OffsetPosition = newPos; + } + #endregion + + #region rotation + public void UpdateGroupRotation(LLQuaternion rot) + { + this.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W); + } + + /// + /// + /// + /// + /// + public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot) + { + this.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W); + this.UpdateHandler(ref pos, UpdateType.InComingNewPosition, this); + this.OffsetPosition = pos; + } + + /// + /// + /// + /// + public void UpdateSingleRotation(LLQuaternion rot) + { + //Console.WriteLine("updating single prim rotation"); + Axiom.Math.Quaternion axRot = new Quaternion(rot.W, rot.X, rot.Y, rot.Z); + Axiom.Math.Quaternion oldParentRot = new Quaternion(this.RotationOffset.W, this.RotationOffset.X, this.RotationOffset.Y, this.RotationOffset.Z); + this.RotationOffset = new LLQuaternion(axRot.x, axRot.y, axRot.z, axRot.w); + + LLVector3 offset = this.OffsetPosition; + this.UpdateHandler(ref offset, UpdateType.SingleRotationEdit, this); + } + #endregion + + #region Resizing/Scale + /// + /// + /// + /// + public void ResizeGoup(LLVector3 scale) + { + LLVector3 offset = (scale - this.m_Shape.Scale); + offset.X /= 2; + offset.Y /= 2; + offset.Z /= 2; + + this.UpdateHandler(ref offset, UpdateType.ResizeOffset, this); + this.OffsetPosition += offset; + this.m_Shape.Scale = scale; + } + #endregion + } +} diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs index fc75bdc..0d1e3fc 100644 --- a/OpenSim/Region/Environment/Scenes/EntityBase.cs +++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs @@ -7,9 +7,10 @@ namespace OpenSim.Region.Environment.Scenes public abstract class EntityBase { public LLUUID m_uuid; - + protected List m_children; + protected Scene m_world; protected string m_name; @@ -88,7 +89,9 @@ namespace OpenSim.Region.Environment.Scenes m_velocity = new LLVector3(); Rotation = new Quaternion(); m_name = "(basic entity)"; + m_children = new List(); + } /// @@ -96,7 +99,9 @@ namespace OpenSim.Region.Environment.Scenes /// public virtual void updateMovement() { + foreach (EntityBase child in m_children) + { child.updateMovement(); } @@ -108,6 +113,7 @@ namespace OpenSim.Region.Environment.Scenes public virtual void Update() { // Do any per-frame updates needed that are applicable to every type of entity + foreach (EntityBase child in m_children) { child.Update(); diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs index 5b6b13d..4818348 100644 --- a/OpenSim/Region/Environment/Scenes/Primitive.cs +++ b/OpenSim/Region/Environment/Scenes/Primitive.cs @@ -9,7 +9,7 @@ using OpenSim.Framework.Types; namespace OpenSim.Region.Environment.Scenes { - public delegate void PrimCountTaintedDelegate(); + // public delegate void PrimCountTaintedDelegate(); public class Primitive : EntityBase { @@ -198,12 +198,14 @@ namespace OpenSim.Region.Environment.Scenes dupe.m_RootParent = rootParent; // TODO: Copy this properly. + dupe.m_inventoryItems = m_inventoryItems; dupe.m_children = new List(); dupe.m_Shape = m_Shape.Copy(); dupe.m_regionHandle = m_regionHandle; dupe.m_world = m_world; + uint newLocalID = m_world.PrimIDAllocate(); dupe.m_uuid = LLUUID.Random(); dupe.LocalId = newLocalID; @@ -227,9 +229,11 @@ namespace OpenSim.Region.Environment.Scenes m_world.AcknowledgeNewPrim(dupe); dupe.TriggerOnPrimCountTainted(); + foreach (Primitive prim in m_children) { Primitive primClone = prim.Copy(dupe, rootParent); + dupe.m_children.Add(primClone); } @@ -320,6 +324,7 @@ namespace OpenSim.Region.Environment.Scenes { // Console.WriteLine("linking new prims " + linkObject.rootLocalID + " to me (" + this.LocalId + ")"); //TODO check permissions + m_children.Add(linkObject.rootPrimitive); linkObject.rootPrimitive.SetNewParent(this, m_RootParent); @@ -350,11 +355,14 @@ namespace OpenSim.Region.Environment.Scenes Rotation = m_Parent.Rotation.Inverse() * Rotation; ScheduleFullUpdate(); + foreach (Primitive child in m_children) { child.SetRootParent(rootParent, newParent, oldPos, oldRot); } + m_children.Clear(); + } /// @@ -374,6 +382,7 @@ namespace OpenSim.Region.Environment.Scenes m_Parent = newParent; ParentID = newParent.LocalId; newParent.AddToChildrenList(this); + m_RootParent = newRoot; m_RootParent.AddChildToList(this); Pos = oldPos; @@ -387,7 +396,9 @@ namespace OpenSim.Region.Environment.Scenes { child.SetRootParent(newRoot, newParent, oldPos, oldRot); } + m_children.Clear(); + } /// @@ -527,6 +538,7 @@ namespace OpenSim.Region.Environment.Scenes public void UpdateSingleRotation(LLQuaternion rot) { //Console.WriteLine("updating single prim rotation"); + Quaternion axRot = new Quaternion(rot.W, rot.X, rot.Y, rot.Z); Quaternion oldParentRot = new Quaternion(Rotation.w, Rotation.x, Rotation.y, Rotation.z); Rotation = axRot; @@ -598,9 +610,12 @@ namespace OpenSim.Region.Environment.Scenes /// public void SendFullUpdateForAllChildren(IClientAPI remoteClient) { + SendFullUpdateToClient(remoteClient); for (int i = 0; i < m_children.Count; i++) + { + if (m_children[i] is Primitive) { ((Primitive)m_children[i]).SendFullUpdateForAllChildren(remoteClient); @@ -641,6 +656,7 @@ namespace OpenSim.Region.Environment.Scenes /// public void SendTerseUpdateForAllChildren(IClientAPI remoteClient) { + SendTerseUpdateToClient(remoteClient); for (int i = 0; i < m_children.Count; i++) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index b6a2a34..70d2c6a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -707,6 +707,10 @@ namespace OpenSim.Region.Environment.Scenes return null; } + /// + /// + /// + /// public void ForEachScenePresence(ForEachScenePresenceDelegate whatToDo) { foreach (ScenePresence presence in Avatars.Values) diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs index ed27fa9..926f1a4 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObject.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs @@ -150,8 +150,8 @@ namespace OpenSim.Region.Environment.Scenes { this.rootPrimitive = new Primitive(this.m_regionHandle, this.m_world, agentID, localID, true, this, this, shape, pos); - this.m_children.Add(rootPrimitive); + this.ChildPrimitives.Add(this.rootUUID, this.rootPrimitive); } @@ -177,6 +177,7 @@ namespace OpenSim.Region.Environment.Scenes dupe.m_regionHandle = this.m_regionHandle; Primitive newRoot = this.rootPrimitive.Copy(dupe, dupe); dupe.rootPrimitive = newRoot; + dupe.m_children.Add(dupe.rootPrimitive); dupe.rootPrimitive.Pos = this.Pos; dupe.Rotation = this.Rotation; -- cgit v1.1