From d451dddcd0e061cd5aa326cb08d6e24e08817dcc Mon Sep 17 00:00:00 2001 From: MW Date: Thu, 9 Aug 2007 17:54:22 +0000 Subject: Start of replacing the old SceneObject/Primitive classes with the new versions. PLEASE NOTE: that with this revision some prim related features may be broke for a while. (things like linking prims and the parcel prim count.) Also this revision may not work on mono, but that will be fixed soon. --- .../Region/Environment/Scenes/SceneObjectPart.cs | 527 +++++++++++++++++++++ 1 file changed, 527 insertions(+) create mode 100644 OpenSim/Region/Environment/Scenes/SceneObjectPart.cs (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectPart.cs') diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs new file mode 100644 index 0000000..d0730d7 --- /dev/null +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -0,0 +1,527 @@ +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 SceneObjectPart + { + private const uint FULL_MASK_PERMISSIONS = 2147483647; + + public LLUUID CreatorID; + public LLUUID OwnerID; + public LLUUID GroupID; + public LLUUID LastOwnerID; + public Int32 CreationDate; + 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 byte[] m_particleSystem = new byte[0]; + + protected SceneObjectGroup m_parentGroup; + + /// + /// Only used internally to schedule client updates + /// + private byte m_updateFlag; + + #region Properties + + protected LLUUID m_uuid; + public LLUUID UUID + { + get { return m_uuid; } + set { m_uuid = value ; } + } + + protected uint m_localID; + public uint LocalID + { + get { return m_localID; } + set { m_localID = value; } + } + + protected string m_partName; + public virtual string PartName + { + get { return m_partName; } + set { m_partName = value; } + } + + protected LLObject.ObjectFlags m_flags = (LLObject.ObjectFlags)32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128; + public uint ObjectFlags + { + get { return (uint)m_flags; } + set { m_flags = (LLObject.ObjectFlags)value; } + } + + protected LLObject.MaterialType m_material; + public byte Material + { + get { return (byte)m_material; } + set { m_material = (LLObject.MaterialType)value; } + } + + protected ulong m_regionHandle; + public ulong RegionHandle + { + get { return m_regionHandle; } + set { m_regionHandle = value; } + } + + //unkown if this will be kept, added as a way of removing the group position from the group class + protected LLVector3 m_groupPosition; + public LLVector3 GroupPosition + { + get { return m_groupPosition; } + set { m_groupPosition = 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; } + } + + protected LLVector3 m_velocity; + /// + public LLVector3 Velocity + { + get { return m_velocity; } + set { m_velocity = value; } + } + + protected LLVector3 m_angularVelocity; + /// + public LLVector3 AngularVelocity + { + get { return m_angularVelocity; } + set { m_angularVelocity = value; } + } + + protected LLVector3 m_acceleration; + /// + public LLVector3 Acceleration + { + get { return m_acceleration; } + set { m_acceleration = value; } + } + + private string m_description = ""; + public string Description + { + get { return this.m_description; } + set { this.m_description = value; } + } + + private string m_text = ""; + public string Text + { + get { return m_text; } + set + { + m_text = value; + ScheduleFullUpdate(); + } + } + + private string m_sitName = ""; + public string SitName + { + get { return m_sitName; } + set { m_sitName = value; } + } + + private string m_touchName = ""; + public string TouchName + { + get { return m_touchName; } + set { m_touchName = value; } + } + + protected PrimitiveBaseShape m_shape; + public PrimitiveBaseShape Shape + { + get { return this.m_shape; } + set { m_shape = value; } + } + + public LLVector3 Scale + { + set { this.m_shape.Scale = value; } + get { return this.m_shape.Scale; } + } + #endregion + + #region Constructors + /// + /// + /// + public SceneObjectPart() + { + + } + + /// + /// Create a completely new SceneObjectPart (prim) + /// + /// + /// + /// + /// + /// + /// + public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, LLUUID ownerID, uint localID, PrimitiveBaseShape shape, LLVector3 groupPosition, LLVector3 offsetPosition) + { + this.m_partName = "Primitive"; + 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.LocalID = (uint)(localID); + this.Shape = shape; + + this.GroupPosition = groupPosition; + this.OffsetPosition = offsetPosition; + this.RotationOffset = LLQuaternion.Identity; + this.Velocity = new LLVector3(0, 0, 0); + this.AngularVelocity = new LLVector3(0, 0, 0); + this.Acceleration = new LLVector3(0, 0, 0); + + //temporary code just so the m_flags field doesn't give a compiler warning + if (m_flags == LLObject.ObjectFlags.AllowInventoryDrop) + { + + } + ScheduleFullUpdate(); + } + + /// + /// Re/create a SceneObjectPart (prim) + /// + /// + /// + /// + /// + /// + /// + public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, int creationDate, LLUUID ownerID, LLUUID creatorID, LLUUID lastOwnerID, uint localID, PrimitiveBaseShape shape, LLVector3 position, LLQuaternion rotation, uint flags) + { + this.m_regionHandle = regionHandle; + this.m_parentGroup = parent; + + this.CreationDate = creationDate; + this.OwnerID = ownerID; + this.CreatorID = creatorID; + this.LastOwnerID = lastOwnerID; + this.UUID = LLUUID.Random(); + this.LocalID = (uint)(localID); + this.Shape = shape; + + this.OffsetPosition = position; + this.RotationOffset = rotation; + this.ObjectFlags = flags; + } + #endregion + + #region Copying + /// + /// + /// + /// + public SceneObjectPart Copy(uint localID) + { + SceneObjectPart dupe = (SceneObjectPart)this.MemberwiseClone(); + dupe.m_shape = m_shape.Copy(); + dupe.m_regionHandle = m_regionHandle; + dupe.UUID = LLUUID.Random(); + dupe.LocalID = localID; + dupe.GroupPosition = new LLVector3(GroupPosition.X, GroupPosition.Y, GroupPosition.Z); + dupe.OffsetPosition = new LLVector3(OffsetPosition.X, OffsetPosition.Y, OffsetPosition.Z); + dupe.RotationOffset = new LLQuaternion(RotationOffset.X, RotationOffset.Y, RotationOffset.Z, RotationOffset.W); + dupe.Velocity = new LLVector3(0, 0, 0); + dupe.Acceleration = new LLVector3(0, 0, 0); + dupe.AngularVelocity = new LLVector3(0, 0, 0); + dupe.ObjectFlags = this.ObjectFlags; + //TODO copy extraparams data and anything else not currently copied + return dupe; + } + #endregion + + #region Update Scheduling + /// + /// + /// + private void ClearUpdateSchedule() + { + m_updateFlag = 0; + } + + /// + /// + /// + public void ScheduleFullUpdate() + { + m_updateFlag = 2; + } + + /// + /// + /// + public void ScheduleTerseUpdate() + { + if (m_updateFlag < 1) + { + m_updateFlag = 1; + } + } + + /// + /// + /// + public void SendScheduledUpdates() + { + if (m_updateFlag == 1) //some change has been made so update the clients + { + SendTerseUpdateToAllClients(); + ClearUpdateSchedule(); + } + else + { + if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes + { + SendFullUpdateToAllClients(); + ClearUpdateSchedule(); + } + } + } + #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; + ScheduleFullUpdate(); + } + #endregion + + #region Inventory + public void GetInventory(IClientAPI client, uint localID) + { + if (localID == this.m_localID) + { + client.SendTaskInventory(this.m_uuid, 0, new byte[0]); + } + } + #endregion + + #region ExtraParams + public void UpdateExtraParam(ushort type, bool inUse, byte[] data) + { + this.m_shape.ExtraParams = new byte[data.Length + 7]; + int i = 0; + uint length = (uint)data.Length; + this.m_shape.ExtraParams[i++] = 1; + this.m_shape.ExtraParams[i++] = (byte)(type % 256); + this.m_shape.ExtraParams[i++] = (byte)((type >> 8) % 256); + + this.m_shape.ExtraParams[i++] = (byte)(length % 256); + this.m_shape.ExtraParams[i++] = (byte)((length >> 8) % 256); + this.m_shape.ExtraParams[i++] = (byte)((length >> 16) % 256); + this.m_shape.ExtraParams[i++] = (byte)((length >> 24) % 256); + Array.Copy(data, 0, this.m_shape.ExtraParams, i, data.Length); + + this.ScheduleFullUpdate(); + } + #endregion + + #region Texture + /// + /// + /// + /// + public void UpdateTextureEntry(byte[] textureEntry) + { + this.m_shape.TextureEntry = textureEntry; + ScheduleFullUpdate(); + } + #endregion + + #region ParticleSystem + public void AddNewParticleSystem(libsecondlife.Primitive.ParticleSystem pSystem) + { + this.m_particleSystem = pSystem.GetBytes(); + } + #endregion + + #region Position + /// + /// + /// + /// + public void UpdateOffSet(LLVector3 pos) + { + LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z); + this.OffsetPosition = newPos; + ScheduleTerseUpdate(); + } + #endregion + + #region rotation + public void UpdateRotation(LLQuaternion rot) + { + this.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W); + ScheduleTerseUpdate(); + } + #endregion + + #region Resizing/Scale + /// + /// + /// + /// + public void Resize(LLVector3 scale) + { + this.m_shape.Scale = scale; + ScheduleFullUpdate(); + } + #endregion + + #region Client Update Methods + /// + /// + /// + public void SendFullUpdateToAllClients() + { + List avatars = this.m_parentGroup.RequestSceneAvatars(); + for (int i = 0; i < avatars.Count; i++) + { + m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this); + } + } + + /// + /// + /// + /// + public void SendFullUpdate(IClientAPI remoteClient) + { + m_parentGroup.SendPartFullUpdate( remoteClient, this ); + } + + /// + /// + /// + /// + public void SendFullUpdateToClient(IClientAPI remoteClient) + { + LLVector3 lPos; + lPos = OffsetPosition; + SendFullUpdateToClient(remoteClient, lPos); + } + + /// + /// + /// + /// + /// + public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos) + { + LLQuaternion lRot; + lRot = RotationOffset; + + remoteClient.SendPrimitiveToClient(m_regionHandle, 64096, LocalID, m_shape, lPos, this.ObjectFlags, m_uuid, OwnerID, + m_text, ParentID, this.m_particleSystem, lRot); + } + + /// + /// + /// + public void SendTerseUpdateToAllClients() + { + List avatars = this.m_parentGroup.RequestSceneAvatars(); + for (int i = 0; i < avatars.Count; i++) + { + m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this); + } + } + + /// + /// + /// + /// + public void SendTerseUpdate(IClientAPI remoteClient) + { + m_parentGroup.SendPartTerseUpdate(remoteClient, this); + } + + /// + /// + /// + /// + public void SendTerseUpdateToClient(IClientAPI remoteClient) + { + LLVector3 lPos; + lPos = this.OffsetPosition; + LLQuaternion mRot = this.RotationOffset; + remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot); + } + + /// + /// + /// + /// + /// + public void SendTerseUpdateToClient(IClientAPI remoteClient, LLVector3 lPos) + { + LLQuaternion mRot = this.RotationOffset; + remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot); + } + #endregion + } +} + -- cgit v1.1