diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Framework/General/Interfaces/IClientAPI.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/ClientView.API.cs | 1 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/EntityBase.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Primitive.cs | 35 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs | 33 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 21 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObject.cs | 28 |
8 files changed, 140 insertions, 2 deletions
diff --git a/OpenSim/Framework/General/Interfaces/IClientAPI.cs b/OpenSim/Framework/General/Interfaces/IClientAPI.cs index acacabe..206122d 100644 --- a/OpenSim/Framework/General/Interfaces/IClientAPI.cs +++ b/OpenSim/Framework/General/Interfaces/IClientAPI.cs | |||
@@ -59,6 +59,7 @@ namespace OpenSim.Framework.Interfaces | |||
59 | public delegate void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); | 59 | public delegate void UpdatePrimRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); |
60 | public delegate void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); | 60 | public delegate void UpdatePrimSingleRotation(uint localID, LLQuaternion rot, IClientAPI remoteClient); |
61 | public delegate void UpdatePrimGroupRotation(uint localID,LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient); | 61 | public delegate void UpdatePrimGroupRotation(uint localID,LLVector3 pos, LLQuaternion rot, IClientAPI remoteClient); |
62 | public delegate void ObjectDuplicate(uint localID, LLVector3 offset, uint dupeFlags); | ||
62 | public delegate void StatusChange(bool status); | 63 | public delegate void StatusChange(bool status); |
63 | public delegate void NewAvatar(IClientAPI remoteClient, LLUUID agentID, bool status); | 64 | public delegate void NewAvatar(IClientAPI remoteClient, LLUUID agentID, bool status); |
64 | public delegate void UpdateAgent(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation); | 65 | public delegate void UpdateAgent(IClientAPI remoteClient, uint flags, LLQuaternion bodyRotation); |
@@ -92,6 +93,7 @@ namespace OpenSim.Framework.Interfaces | |||
92 | event UpdateAgent OnAgentUpdate; | 93 | event UpdateAgent OnAgentUpdate; |
93 | event GenericCall OnRequestAvatarsData; | 94 | event GenericCall OnRequestAvatarsData; |
94 | event GenericCall4 OnAddPrim; | 95 | event GenericCall4 OnAddPrim; |
96 | event ObjectDuplicate OnObjectDuplicate; | ||
95 | event UpdateVector OnGrapObject; | 97 | event UpdateVector OnGrapObject; |
96 | event ObjectSelect OnDeGrapObject; | 98 | event ObjectSelect OnDeGrapObject; |
97 | event MoveObject OnGrapUpdate; | 99 | event MoveObject OnGrapUpdate; |
diff --git a/OpenSim/Region/ClientStack/ClientView.API.cs b/OpenSim/Region/ClientStack/ClientView.API.cs index cefe856..3c1df75 100644 --- a/OpenSim/Region/ClientStack/ClientView.API.cs +++ b/OpenSim/Region/ClientStack/ClientView.API.cs | |||
@@ -55,6 +55,7 @@ namespace OpenSim.Region.ClientStack | |||
55 | public event LinkObjects OnLinkObjects; | 55 | public event LinkObjects OnLinkObjects; |
56 | public event UpdateVector OnGrapObject; | 56 | public event UpdateVector OnGrapObject; |
57 | public event ObjectSelect OnDeGrapObject; | 57 | public event ObjectSelect OnDeGrapObject; |
58 | public event ObjectDuplicate OnObjectDuplicate; | ||
58 | public event MoveObject OnGrapUpdate; | 59 | public event MoveObject OnGrapUpdate; |
59 | public event GenericCall4 OnAddPrim; | 60 | public event GenericCall4 OnAddPrim; |
60 | public event UpdateShape OnUpdatePrimShape; | 61 | public event UpdateShape OnUpdatePrimShape; |
diff --git a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs index def14c7..982ae50 100644 --- a/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs +++ b/OpenSim/Region/ClientStack/ClientView.ProcessPackets.cs | |||
@@ -233,6 +233,18 @@ namespace OpenSim.Region.ClientStack | |||
233 | } | 233 | } |
234 | } | 234 | } |
235 | break; | 235 | break; |
236 | case PacketType.ObjectDuplicate: | ||
237 | ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack; | ||
238 | for (int i = 0; i < dupe.ObjectData.Length; i++) | ||
239 | { | ||
240 | if (OnObjectDuplicate != null) | ||
241 | { | ||
242 | OnObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset, dupe.SharedData.DuplicateFlags); | ||
243 | } | ||
244 | } | ||
245 | |||
246 | break; | ||
247 | |||
236 | case PacketType.ObjectSelect: | 248 | case PacketType.ObjectSelect: |
237 | ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; | 249 | ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack; |
238 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) | 250 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) |
diff --git a/OpenSim/Region/Environment/Scenes/EntityBase.cs b/OpenSim/Region/Environment/Scenes/EntityBase.cs index 99ca021..7914bab 100644 --- a/OpenSim/Region/Environment/Scenes/EntityBase.cs +++ b/OpenSim/Region/Environment/Scenes/EntityBase.cs | |||
@@ -74,6 +74,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
74 | public uint LocalId | 74 | public uint LocalId |
75 | { | 75 | { |
76 | get { return m_localId; } | 76 | get { return m_localId; } |
77 | set { m_localId = value; } | ||
77 | } | 78 | } |
78 | 79 | ||
79 | /// <summary> | 80 | /// <summary> |
@@ -122,6 +123,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
122 | } | 123 | } |
123 | 124 | ||
124 | /// <summary> | 125 | /// <summary> |
126 | /// Copies the entity | ||
127 | /// </summary> | ||
128 | /// <returns></returns> | ||
129 | public virtual EntityBase Copy() | ||
130 | { | ||
131 | return (EntityBase)this.MemberwiseClone(); | ||
132 | } | ||
133 | |||
134 | /// <summary> | ||
125 | /// Infoms the entity that the land (heightmap) has changed | 135 | /// Infoms the entity that the land (heightmap) has changed |
126 | /// </summary> | 136 | /// </summary> |
127 | public virtual void LandRenegerated() | 137 | public virtual void LandRenegerated() |
diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs index 9d01618..8d31d63 100644 --- a/OpenSim/Region/Environment/Scenes/Primitive.cs +++ b/OpenSim/Region/Environment/Scenes/Primitive.cs | |||
@@ -141,8 +141,43 @@ namespace OpenSim.Region.Environment.Scenes | |||
141 | this.CreateFromPacket(addPacket, ownerID, localID); | 141 | this.CreateFromPacket(addPacket, ownerID, localID); |
142 | this.rotation = Axiom.Math.Quaternion.Identity; | 142 | this.rotation = Axiom.Math.Quaternion.Identity; |
143 | } | 143 | } |
144 | |||
145 | /// <summary> | ||
146 | /// | ||
147 | /// </summary> | ||
148 | /// <remarks>Empty constructor for duplication</remarks> | ||
149 | public Primitive() | ||
150 | { | ||
151 | |||
152 | } | ||
153 | |||
144 | #endregion | 154 | #endregion |
145 | 155 | ||
156 | #region Duplication | ||
157 | |||
158 | public Primitive Copy(EntityBase parent, SceneObject rootParent) | ||
159 | { | ||
160 | Primitive dupe = (Primitive)this.MemberwiseClone(); | ||
161 | // TODO: Copy this properly. | ||
162 | dupe.inventoryItems = this.inventoryItems; | ||
163 | dupe.m_Parent = parent; | ||
164 | dupe.m_RootParent = rootParent; | ||
165 | // TODO: Copy this properly. | ||
166 | dupe.m_Shape = this.m_Shape; | ||
167 | |||
168 | uint newLocalID = this.m_world.PrimIDAllocate(); | ||
169 | dupe.LocalId = newLocalID; | ||
170 | |||
171 | dupe.Scale = new LLVector3(this.Scale.X, this.Scale.Y, this.Scale.Z); | ||
172 | dupe.rotation = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z); | ||
173 | dupe.Pos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z); | ||
174 | |||
175 | return dupe; | ||
176 | } | ||
177 | |||
178 | #endregion | ||
179 | |||
180 | |||
146 | #region Override from EntityBase | 181 | #region Override from EntityBase |
147 | /// <summary> | 182 | /// <summary> |
148 | /// | 183 | /// |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index e078348..35e0ea6 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs | |||
@@ -215,6 +215,39 @@ namespace OpenSim.Region.Environment.Scenes | |||
215 | /// <summary> | 215 | /// <summary> |
216 | /// | 216 | /// |
217 | /// </summary> | 217 | /// </summary> |
218 | /// <param name="originalPrim"></param> | ||
219 | /// <param name="offset"></param> | ||
220 | /// <param name="flags"></param> | ||
221 | public void DuplicateObject(uint originalPrim, LLVector3 offset, uint flags) | ||
222 | { | ||
223 | SceneObject originPrim = null; | ||
224 | foreach (EntityBase ent in Entities.Values) | ||
225 | { | ||
226 | if (ent is SceneObject) | ||
227 | { | ||
228 | if (((SceneObject)ent).rootLocalID == originalPrim) | ||
229 | { | ||
230 | originPrim = (SceneObject)ent; | ||
231 | break; | ||
232 | } | ||
233 | } | ||
234 | } | ||
235 | |||
236 | if (originPrim != null) | ||
237 | { | ||
238 | //SceneObject copy = originPrim.Copy(); | ||
239 | |||
240 | } | ||
241 | else | ||
242 | { | ||
243 | OpenSim.Framework.Console.MainLog.Instance.Warn("Attempted to duplicate nonexistant prim"); | ||
244 | } | ||
245 | |||
246 | } | ||
247 | |||
248 | /// <summary> | ||
249 | /// | ||
250 | /// </summary> | ||
218 | /// <param name="parentPrim"></param> | 251 | /// <param name="parentPrim"></param> |
219 | /// <param name="childPrims"></param> | 252 | /// <param name="childPrims"></param> |
220 | public void LinkObjects(uint parentPrim, List<uint> childPrims) | 253 | public void LinkObjects(uint parentPrim, List<uint> childPrims) |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index fdf3cc8..1798cba 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -57,6 +57,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
57 | private float timeStep = 0.1f; | 57 | private float timeStep = 0.1f; |
58 | private Random Rand = new Random(); | 58 | private Random Rand = new Random(); |
59 | private uint _primCount = 702000; | 59 | private uint _primCount = 702000; |
60 | private System.Threading.Mutex _primAllocateMutex = new Mutex(false); | ||
60 | private int storageCount; | 61 | private int storageCount; |
61 | private Mutex updateLock; | 62 | private Mutex updateLock; |
62 | 63 | ||
@@ -397,6 +398,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
397 | } | 398 | } |
398 | 399 | ||
399 | /// <summary> | 400 | /// <summary> |
401 | /// Returns a new unallocated primitive ID | ||
402 | /// </summary> | ||
403 | /// <returns>A brand new primitive ID</returns> | ||
404 | public uint PrimIDAllocate() | ||
405 | { | ||
406 | uint myID; | ||
407 | |||
408 | _primAllocateMutex.WaitOne(); | ||
409 | ++_primCount; | ||
410 | myID = _primCount; | ||
411 | _primAllocateMutex.ReleaseMutex(); | ||
412 | |||
413 | return myID; | ||
414 | } | ||
415 | |||
416 | /// <summary> | ||
400 | /// | 417 | /// |
401 | /// </summary> | 418 | /// </summary> |
402 | /// <param name="addPacket"></param> | 419 | /// <param name="addPacket"></param> |
@@ -415,9 +432,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
415 | { | 432 | { |
416 | try | 433 | try |
417 | { | 434 | { |
418 | SceneObject sceneOb = new SceneObject(m_regionHandle, this, addPacket, ownerID, this._primCount); | 435 | SceneObject sceneOb = new SceneObject(m_regionHandle, this, addPacket, ownerID, this.PrimIDAllocate()); |
419 | this.Entities.Add(sceneOb.rootUUID, sceneOb); | 436 | this.Entities.Add(sceneOb.rootUUID, sceneOb); |
420 | this._primCount++; | ||
421 | 437 | ||
422 | // Trigger event for listeners | 438 | // Trigger event for listeners |
423 | // eventManager.TriggerOnNewPrimitive(prim); | 439 | // eventManager.TriggerOnNewPrimitive(prim); |
@@ -468,6 +484,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
468 | client.OnObjectDescription += this.PrimDescription; | 484 | client.OnObjectDescription += this.PrimDescription; |
469 | client.OnObjectName += this.PrimName; | 485 | client.OnObjectName += this.PrimName; |
470 | client.OnLinkObjects += this.LinkObjects; | 486 | client.OnLinkObjects += this.LinkObjects; |
487 | client.OnObjectDuplicate += this.DuplicateObject; | ||
471 | 488 | ||
472 | /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest); | 489 | /* remoteClient.OnParcelPropertiesRequest += new ParcelPropertiesRequest(parcelManager.handleParcelPropertiesRequest); |
473 | remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest); | 490 | remoteClient.OnParcelDivideRequest += new ParcelDivideRequest(parcelManager.handleParcelDivideRequest); |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObject.cs b/OpenSim/Region/Environment/Scenes/SceneObject.cs index 452502b..2b80d57 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObject.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObject.cs | |||
@@ -78,6 +78,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
78 | /// <summary> | 78 | /// <summary> |
79 | /// | 79 | /// |
80 | /// </summary> | 80 | /// </summary> |
81 | /// <remarks>Need a null constructor for duplication</remarks> | ||
82 | public SceneObject() | ||
83 | { | ||
84 | |||
85 | } | ||
86 | |||
87 | /// <summary> | ||
88 | /// | ||
89 | /// </summary> | ||
81 | /// <param name="addPacket"></param> | 90 | /// <param name="addPacket"></param> |
82 | /// <param name="agentID"></param> | 91 | /// <param name="agentID"></param> |
83 | /// <param name="localID"></param> | 92 | /// <param name="localID"></param> |
@@ -100,6 +109,25 @@ namespace OpenSim.Region.Environment.Scenes | |||
100 | /// <summary> | 109 | /// <summary> |
101 | /// | 110 | /// |
102 | /// </summary> | 111 | /// </summary> |
112 | /// <returns>A complete copy of the object</returns> | ||
113 | public SceneObject Copy() | ||
114 | { | ||
115 | SceneObject dupe = new SceneObject(); | ||
116 | |||
117 | Primitive newRoot = this.rootPrimitive.Copy((EntityBase)dupe, dupe); | ||
118 | |||
119 | foreach (EntityBase child in this.children) | ||
120 | { | ||
121 | EntityBase newChild = child.Copy(); | ||
122 | dupe.children.Add(newChild); | ||
123 | } | ||
124 | |||
125 | return dupe; | ||
126 | } | ||
127 | |||
128 | /// <summary> | ||
129 | /// | ||
130 | /// </summary> | ||
103 | public void DeleteAllChildren() | 131 | public void DeleteAllChildren() |
104 | { | 132 | { |
105 | this.children.Clear(); | 133 | this.children.Clear(); |