From 9f1158ba6ac5f36db5a4d374f22276294930dfd7 Mon Sep 17 00:00:00 2001
From: MW
Date: Tue, 12 Jun 2007 14:46:29 +0000
Subject: Some Work on the Primitive class

---
 OpenSim/OpenSim.Region/World/Primitive.cs          | 101 ++++++++++++---------
 OpenSim/OpenSim.Region/World/SceneObject.cs        |  27 +++---
 .../OpenSim.Region/World/World.PacketHandlers.cs   |   9 +-
 OpenSim/OpenSim.Region/World/World.cs              |   6 +-
 OpenSim/OpenSim.RegionServer/PacketServer.cs       |  59 ++++++++++++
 5 files changed, 143 insertions(+), 59 deletions(-)

diff --git a/OpenSim/OpenSim.Region/World/Primitive.cs b/OpenSim/OpenSim.Region/World/Primitive.cs
index dbdbdb9..0680eb3 100644
--- a/OpenSim/OpenSim.Region/World/Primitive.cs
+++ b/OpenSim/OpenSim.Region/World/Primitive.cs
@@ -41,9 +41,9 @@ namespace OpenSim.Region
 {
     public class Primitive : Entity
     {
-        protected PrimData primData;
+        internal PrimData primData;
         private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
-        private Dictionary<uint, IClientAPI> m_clientThreads;
+       // private Dictionary<uint, IClientAPI> m_clientThreads;
         private ulong m_regionHandle;
         private const uint FULL_MASK_PERMISSIONS = 2147483647;
         private bool physicsEnabled = false;
@@ -95,7 +95,7 @@ namespace OpenSim.Region
         /// <param name="world"></param>
         public Primitive(Dictionary<uint, IClientAPI> clientThreads, ulong regionHandle, World world)
         {
-            m_clientThreads = clientThreads;
+           // m_clientThreads = clientThreads;
             m_regionHandle = regionHandle;
             m_world = world;
             inventoryItems = new Dictionary<LLUUID, InventoryItem>();
@@ -112,7 +112,7 @@ namespace OpenSim.Region
         /// <param name="localID"></param>
         public Primitive(Dictionary<uint, IClientAPI> clientThreads, ulong regionHandle, World world, LLUUID owner, LLUUID fullID, uint localID)
         {
-            m_clientThreads = clientThreads;
+          //  m_clientThreads = clientThreads;
             m_regionHandle = regionHandle;
             m_world = world;
             inventoryItems = new Dictionary<LLUUID, InventoryItem>();
@@ -134,7 +134,7 @@ namespace OpenSim.Region
         /// <param name="position"></param>
         public Primitive(Dictionary<uint, IClientAPI> clientThreads, ulong regionHandle, World world, LLUUID owner, uint localID, LLVector3 position)
         {
-            m_clientThreads = clientThreads;
+            //m_clientThreads = clientThreads;
             m_regionHandle = regionHandle;
             m_world = world;
             inventoryItems = new Dictionary<LLUUID, InventoryItem>();
@@ -191,11 +191,16 @@ namespace OpenSim.Region
         /// </summary>
         public override void update()
         {
-            if (this.updateFlag == 1)
+            if (this.updateFlag == 1) // is a new prim just been created/reloaded 
             {
                 this.SendFullUpdateToAllClients();
                 this.updateFlag = 0;
             }
+            if (this.updateFlag == 2) //some change has been made so update the clients
+            {
+                this.SendTerseUpdateToALLClients();
+                this.updateFlag = 0;
+            }
         }
 
         /// <summary>
@@ -216,7 +221,8 @@ namespace OpenSim.Region
         /// <param name="pos"></param>
         public void UpdatePosition(LLVector3 pos)
         {
-
+            this.Pos = new LLVector3(pos.X, pos.Y, pos.Z);
+            this.updateFlag = 2;
         }
 
         /// <summary>
@@ -272,58 +278,44 @@ namespace OpenSim.Region
 
         }
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="client"></param>
-        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.primData.CreationDate;
-            proper.ObjectData[0].CreatorID = this.primData.OwnerID;
-            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 = LLUUID.Zero;
-            proper.ObjectData[0].ObjectID = this.uuid;
-            proper.ObjectData[0].OwnerID = primData.OwnerID;
-            proper.ObjectData[0].TouchName = new byte[0];
-            proper.ObjectData[0].TextureID = new byte[0];
-            proper.ObjectData[0].SitName = new byte[0];
-            proper.ObjectData[0].Name = new byte[0];
-            proper.ObjectData[0].Description = new byte[0];
-            proper.ObjectData[0].OwnerMask = this.primData.OwnerMask;
-            proper.ObjectData[0].NextOwnerMask = this.primData.NextOwnerMask;
-            proper.ObjectData[0].GroupMask = this.primData.GroupMask;
-            proper.ObjectData[0].EveryoneMask = this.primData.EveryoneMask;
-            proper.ObjectData[0].BaseMask = this.primData.BaseMask;
-
-            client.OutPacket(proper);
-        }
-
         #endregion
 
         # region Inventory Methods
-
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="item"></param>
+        /// <returns></returns>
         public bool AddToInventory(InventoryItem item)
         {
             return false;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="itemID"></param>
+        /// <returns></returns>
         public InventoryItem RemoveFromInventory(LLUUID itemID)
         {
             return null;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="simClient"></param>
+        /// <param name="packet"></param>
         public void RequestInventoryInfo(IClientAPI simClient, RequestTaskInventoryPacket packet)
         {
 
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="simClient"></param>
+        /// <param name="xferID"></param>
         public void RequestXferInventory(IClientAPI simClient, ulong xferID)
         {
             //will only currently work if the total size of the inventory data array is under about 1000 bytes
@@ -336,6 +328,10 @@ namespace OpenSim.Region
             simClient.OutPacket(send);
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
         public byte[] ConvertInventoryToBytes()
         {
             System.Text.Encoding enc = System.Text.Encoding.ASCII;
@@ -353,6 +349,10 @@ namespace OpenSim.Region
             return result;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="data"></param>
         public void CreateInventoryFromBytes(byte[] data)
         {
 
@@ -362,7 +362,22 @@ namespace OpenSim.Region
 
         #region Update viewers Methods
 
-        //should change these mehtods, so that outgoing packets are sent through the avatar class?
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="remoteClient"></param>
+        public void SendFullUpdateForAllChildren(IClientAPI remoteClient)
+        {
+            this.SendFullUpdateToClient(remoteClient);
+            for (int i = 0; i < this.children.Count; i++)
+            {
+                if (this.children[i] is Primitive)
+                {
+                    ((Primitive)this.children[i]).SendFullUpdateForAllChildren(remoteClient);
+                }
+            }
+        }
+
         /// <summary>
         /// 
         /// </summary>
@@ -491,7 +506,7 @@ namespace OpenSim.Region
         {
             this.CreateFromPrimData(primData, primData.Position, primData.LocalID, false);
         }
-        
+
         /// <summary>
         /// 
         /// </summary>
diff --git a/OpenSim/OpenSim.Region/World/SceneObject.cs b/OpenSim/OpenSim.Region/World/SceneObject.cs
index 87c9bb0..6ded881 100644
--- a/OpenSim/OpenSim.Region/World/SceneObject.cs
+++ b/OpenSim/OpenSim.Region/World/SceneObject.cs
@@ -41,9 +41,10 @@ namespace OpenSim.Region
     public class SceneObject : Entity
     {
         private LLUUID rootUUID;
-        private Dictionary<LLUUID, Primitive> ChildPrimitives = new Dictionary<LLUUID, Primitive>();
-        private Dictionary<uint, IClientAPI> m_clientThreads;
+        //private Dictionary<LLUUID, Primitive> ChildPrimitives = new Dictionary<LLUUID, Primitive>();
+        protected Primitive rootPrimitive;
         private World m_world;
+        protected ulong regionHandle;
 
         /// <summary>
         /// 
@@ -61,6 +62,8 @@ namespace OpenSim.Region
         /// <param name="localID"></param>
         public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
         {
+            this.rootPrimitive = new Primitive(null, this.regionHandle, this.m_world);
+            this.rootPrimitive.CreateFromPacket(addPacket, agentID, localID);
         }
 
         /// <summary>
@@ -94,33 +97,33 @@ namespace OpenSim.Region
         /// <param name="client"></param>
         public void GetProperites(IClientAPI client)
         {
-            /*
+            //needs changing
             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.primData.CreationDate;
-            proper.ObjectData[0].CreatorID = this.primData.OwnerID;
+            proper.ObjectData[0].CreationDate = (ulong)this.rootPrimitive.primData.CreationDate;
+            proper.ObjectData[0].CreatorID = this.rootPrimitive.primData.OwnerID;
             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 = LLUUID.Zero;
             proper.ObjectData[0].ObjectID = this.uuid;
-            proper.ObjectData[0].OwnerID = primData.OwnerID;
+            proper.ObjectData[0].OwnerID = this.rootPrimitive.primData.OwnerID;
             proper.ObjectData[0].TouchName = new byte[0];
             proper.ObjectData[0].TextureID = new byte[0];
             proper.ObjectData[0].SitName = new byte[0];
             proper.ObjectData[0].Name = new byte[0];
             proper.ObjectData[0].Description = new byte[0];
-            proper.ObjectData[0].OwnerMask = this.primData.OwnerMask;
-            proper.ObjectData[0].NextOwnerMask = this.primData.NextOwnerMask;
-            proper.ObjectData[0].GroupMask = this.primData.GroupMask;
-            proper.ObjectData[0].EveryoneMask = this.primData.EveryoneMask;
-            proper.ObjectData[0].BaseMask = this.primData.BaseMask;
+            proper.ObjectData[0].OwnerMask = this.rootPrimitive.primData.OwnerMask;
+            proper.ObjectData[0].NextOwnerMask = this.rootPrimitive.primData.NextOwnerMask;
+            proper.ObjectData[0].GroupMask = this.rootPrimitive.primData.GroupMask;
+            proper.ObjectData[0].EveryoneMask = this.rootPrimitive.primData.EveryoneMask;
+            proper.ObjectData[0].BaseMask = this.rootPrimitive.primData.BaseMask;
 
             client.OutPacket(proper);
-             * */
+            
         }
 
     }
diff --git a/OpenSim/OpenSim.Region/World/World.PacketHandlers.cs b/OpenSim/OpenSim.Region/World/World.PacketHandlers.cs
index f266d2a..85ca247 100644
--- a/OpenSim/OpenSim.Region/World/World.PacketHandlers.cs
+++ b/OpenSim/OpenSim.Region/World/World.PacketHandlers.cs
@@ -210,7 +210,14 @@ namespace OpenSim.Region
         /// <param name="remoteClient"></param>
         public void UpdatePrimPosition(uint localID, LLVector3 pos, IClientAPI remoteClient)
         {
-           
+            foreach (Entity ent in Entities.Values)
+            {
+                if (ent.localid == localID)
+                {
+                    ((OpenSim.Region.Primitive)ent).UpdatePosition(pos);
+                    break;
+                }
+            }
         }
 
         /// <summary>
diff --git a/OpenSim/OpenSim.Region/World/World.cs b/OpenSim/OpenSim.Region/World/World.cs
index da0da7a..8c1493e 100644
--- a/OpenSim/OpenSim.Region/World/World.cs
+++ b/OpenSim/OpenSim.Region/World/World.cs
@@ -511,9 +511,9 @@ namespace OpenSim.Region
             remoteClient.OnChatFromViewer += new ChatFromViewer(this.SimChat);
             remoteClient.OnRequestWearables += new GenericCall(this.InformClientOfNeighbours);
             remoteClient.OnAddPrim += new GenericCall4(this.AddNewPrim);
-
-            /*
-            remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
+            remoteClient.OnUpdatePrimPosition += new UpdatePrimVector(this.UpdatePrimPosition);
+            
+           /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest);
             remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest);
             remoteClient.OnParcelJoinRequest += new ParcelJoinRequest(parcelManager.handleParcelJoinRequest);
             remoteClient.OnParcelPropertiesUpdateRequest += new ParcelPropertiesUpdateRequest(parcelManager.handleParcelPropertiesUpdateRequest);
diff --git a/OpenSim/OpenSim.RegionServer/PacketServer.cs b/OpenSim/OpenSim.RegionServer/PacketServer.cs
index f4653e9..f3a7d73 100644
--- a/OpenSim/OpenSim.RegionServer/PacketServer.cs
+++ b/OpenSim/OpenSim.RegionServer/PacketServer.cs
@@ -60,6 +60,11 @@ namespace OpenSim
             }
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="circuitCode"></param>
+        /// <param name="packet"></param>
         public virtual void ClientInPacket(uint circuitCode, Packet packet)
         {
             if (this.ClientThreads.ContainsKey(circuitCode))
@@ -68,36 +73,79 @@ namespace OpenSim
             }
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="circuitCode"></param>
+        /// <returns></returns>
         public virtual bool AddNewCircuitCodeClient(uint circuitCode)
         {
             return false;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="packet"></param>
         public virtual void SendPacketToAllClients(Packet packet)
         {
 
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="packet"></param>
+        /// <param name="simClient"></param>
         public virtual void SendPacketToAllExcept(Packet packet, ClientView simClient)
         {
 
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="packetType"></param>
+        /// <param name="handler"></param>
         public virtual void AddClientPacketHandler(PacketType packetType, PacketMethod handler)
         {
 
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
         public virtual void RegisterClientPacketHandlers()
         {
             
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="remoteEP"></param>
+        /// <param name="initialcirpack"></param>
+        /// <param name="clientThreads"></param>
+        /// <param name="world"></param>
+        /// <param name="assetCache"></param>
+        /// <param name="packServer"></param>
+        /// <param name="inventoryCache"></param>
+        /// <param name="authenSessions"></param>
+        /// <returns></returns>
         protected virtual ClientView CreateNewClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack, Dictionary<uint, ClientView> clientThreads, IWorld world, AssetCache assetCache, PacketServer packServer, InventoryCache inventoryCache, AuthenticateSessionsBase authenSessions)
         {
             return new ClientView(remoteEP, initialcirpack, clientThreads, world, assetCache, packServer, inventoryCache, authenSessions );
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="epSender"></param>
+        /// <param name="useCircuit"></param>
+        /// <param name="assetCache"></param>
+        /// <param name="inventoryCache"></param>
+        /// <param name="authenticateSessionsClass"></param>
+        /// <returns></returns>
         public virtual bool AddNewClient(EndPoint epSender, UseCircuitCodePacket useCircuit, AssetCache assetCache, InventoryCache inventoryCache, AuthenticateSessionsBase authenticateSessionsClass)
         {
             ClientView newuser =
@@ -110,11 +158,22 @@ namespace OpenSim
             return true;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="buffer"></param>
+        /// <param name="size"></param>
+        /// <param name="flags"></param>
+        /// <param name="circuitcode"></param>
         public virtual void SendPacketTo(byte[] buffer, int size, SocketFlags flags, uint circuitcode)
         {
             this._networkHandler.SendPacketTo(buffer, size, flags, circuitcode);
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="circuitcode"></param>
         public virtual void RemoveClientCircuit(uint circuitcode)
         {
             this._networkHandler.RemoveClientCircuit(circuitcode);
-- 
cgit v1.1