aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/Primitive.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/Primitive.cs')
-rw-r--r--OpenSim/Region/Environment/Scenes/Primitive.cs124
1 files changed, 116 insertions, 8 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Primitive.cs b/OpenSim/Region/Environment/Scenes/Primitive.cs
index 803bd28..24dc115 100644
--- a/OpenSim/Region/Environment/Scenes/Primitive.cs
+++ b/OpenSim/Region/Environment/Scenes/Primitive.cs
@@ -1,6 +1,6 @@
1using System; 1using System;
2using System.Collections.Generic; 2using System.Collections.Generic;
3using Axiom.MathLib; 3using Axiom.Math;
4using libsecondlife; 4using libsecondlife;
5using libsecondlife.Packets; 5using libsecondlife.Packets;
6using OpenSim.Framework.Interfaces; 6using OpenSim.Framework.Interfaces;
@@ -45,6 +45,7 @@ namespace OpenSim.Region.Environment.Scenes
45 public bool isRootPrim; 45 public bool isRootPrim;
46 public EntityBase m_Parent; 46 public EntityBase m_Parent;
47 47
48 #region Properties
48 public override LLVector3 Pos 49 public override LLVector3 Pos
49 { 50 {
50 get 51 get
@@ -69,6 +70,22 @@ namespace OpenSim.Region.Environment.Scenes
69 70
70 } 71 }
71 72
73 public LLVector3 WorldPos
74 {
75 get
76 {
77 if (!this.isRootPrim)
78 {
79 Primitive parentPrim = (Primitive)this.m_Parent;
80 return this.m_pos + parentPrim.WorldPos;
81 }
82 else
83 {
84 return this.Pos;
85 }
86 }
87 }
88
72 public string Description 89 public string Description
73 { 90 {
74 get 91 get
@@ -92,7 +109,9 @@ namespace OpenSim.Region.Environment.Scenes
92 return this.m_Shape.Scale; 109 return this.m_Shape.Scale;
93 } 110 }
94 } 111 }
112 #endregion
95 113
114 #region Constructors
96 public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject) 115 public Primitive(ulong regionHandle, Scene world, ObjectAddPacket addPacket, LLUUID ownerID, uint localID, bool isRoot, EntityBase parent, SceneObject rootObject)
97 { 116 {
98 m_regionHandle = regionHandle; 117 m_regionHandle = regionHandle;
@@ -102,9 +121,11 @@ namespace OpenSim.Region.Environment.Scenes
102 this.isRootPrim = isRoot; 121 this.isRootPrim = isRoot;
103 this.m_RootParent = rootObject; 122 this.m_RootParent = rootObject;
104 this.CreateFromPacket(addPacket, ownerID, localID); 123 this.CreateFromPacket(addPacket, ownerID, localID);
105 this.rotation = Axiom.MathLib.Quaternion.Identity; 124 this.rotation = Axiom.Math.Quaternion.Identity;
106 } 125 }
126 #endregion
107 127
128 #region Override from EntityBase
108 /// <summary> 129 /// <summary>
109 /// 130 ///
110 /// </summary> 131 /// </summary>
@@ -126,7 +147,9 @@ namespace OpenSim.Region.Environment.Scenes
126 child.update(); 147 child.update();
127 } 148 }
128 } 149 }
150 #endregion
129 151
152 #region Setup
130 /// <summary> 153 /// <summary>
131 /// 154 ///
132 /// </summary> 155 /// </summary>
@@ -169,7 +192,9 @@ namespace OpenSim.Region.Environment.Scenes
169 192
170 this.updateFlag = 1; 193 this.updateFlag = 1;
171 } 194 }
195 #endregion
172 196
197 #region Linking / unlinking
173 /// <summary> 198 /// <summary>
174 /// 199 ///
175 /// </summary> 200 /// </summary>
@@ -196,28 +221,49 @@ namespace OpenSim.Region.Environment.Scenes
196 this.isRootPrim = false; 221 this.isRootPrim = false;
197 this.m_Parent = newParent; 222 this.m_Parent = newParent;
198 this.ParentID = newParent.LocalId; 223 this.ParentID = newParent.LocalId;
199 this.SetRootParent(rootParent); 224 this.m_RootParent = rootParent;
225 this.m_RootParent.AddChildToList(this);
200 this.Pos = oldPos; 226 this.Pos = oldPos;
201 Axiom.MathLib.Vector3 axPos = new Axiom.MathLib.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z); 227 Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
202 axPos = this.m_Parent.rotation.Inverse() * axPos; 228 axPos = this.m_Parent.rotation.Inverse() * axPos;
203 this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z); 229 this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
204 this.rotation = this.rotation * this.m_Parent.rotation.Inverse(); 230 this.rotation = this.rotation * this.m_Parent.rotation.Inverse();
205 this.updateFlag = 1; 231 this.updateFlag = 1;
206 232
233 foreach (Primitive child in children)
234 {
235 child.SetRootParent(rootParent, newParent, oldPos);
236 }
237 children.Clear();
238
239
207 } 240 }
208 241
209 /// <summary> 242 /// <summary>
210 /// 243 ///
211 /// </summary> 244 /// </summary>
212 /// <param name="newRoot"></param> 245 /// <param name="newRoot"></param>
213 public void SetRootParent(SceneObject newRoot) 246 public void SetRootParent(SceneObject newRoot , Primitive newParent, LLVector3 oldParentPosition)
214 { 247 {
248 LLVector3 oldPos = new LLVector3(this.Pos.X, this.Pos.Y, this.Pos.Z);
249 oldPos += oldParentPosition;
250 this.isRootPrim = false;
251 this.m_Parent = newParent;
252 this.ParentID = newParent.LocalId;
253 newParent.AddToChildrenList(this);
215 this.m_RootParent = newRoot; 254 this.m_RootParent = newRoot;
216 this.m_RootParent.AddChildToList(this); 255 this.m_RootParent.AddChildToList(this);
256 this.Pos = oldPos;
257 Axiom.Math.Vector3 axPos = new Axiom.Math.Vector3(this.m_pos.X, m_pos.Y, m_pos.Z);
258 axPos = this.m_Parent.rotation.Inverse() * axPos;
259 this.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
260 this.rotation = this.rotation * this.m_Parent.rotation.Inverse();
261 this.updateFlag = 1;
217 foreach (Primitive child in children) 262 foreach (Primitive child in children)
218 { 263 {
219 child.SetRootParent(newRoot); 264 child.SetRootParent(newRoot, newParent, oldPos);
220 } 265 }
266 children.Clear();
221 } 267 }
222 268
223 public void AddOffsetToChildren(LLVector3 offset) 269 public void AddOffsetToChildren(LLVector3 offset)
@@ -229,6 +275,12 @@ namespace OpenSim.Region.Environment.Scenes
229 } 275 }
230 } 276 }
231 277
278 public void AddToChildrenList(Primitive prim)
279 {
280 this.children.Add(prim);
281 }
282 #endregion
283
232 #region Resizing/Scale 284 #region Resizing/Scale
233 public void ResizeGoup(LLVector3 scale) 285 public void ResizeGoup(LLVector3 scale)
234 { 286 {
@@ -252,6 +304,7 @@ namespace OpenSim.Region.Environment.Scenes
252 } 304 }
253 #endregion 305 #endregion
254 306
307 #region Position
255 /// <summary> 308 /// <summary>
256 /// 309 ///
257 /// </summary> 310 /// </summary>
@@ -264,19 +317,73 @@ namespace OpenSim.Region.Environment.Scenes
264 this.updateFlag = 2; 317 this.updateFlag = 2;
265 } 318 }
266 319
320 public void UpdateSinglePosition(LLVector3 pos)
321 {
322 //Console.WriteLine("updating single prim position");
323 if (this.isRootPrim)
324 {
325 LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
326 LLVector3 oldPos = new LLVector3(Pos.X, Pos.Y, Pos.Z);
327 LLVector3 diff = oldPos - newPos;
328 Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
329 axDiff = this.rotation.Inverse() * axDiff;
330 diff.X = axDiff.x;
331 diff.Y = axDiff.y;
332 diff.Z = axDiff.z;
333 this.Pos = newPos;
334
335 foreach (Primitive prim in this.children)
336 {
337 prim.m_pos += diff;
338 prim.updateFlag = 2;
339 }
340 this.updateFlag = 2;
341 }
342 else
343 {
344 LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
345 this.m_pos = newPos;
346 this.updateFlag = 2;
347 }
348 }
349
350 #endregion
351
352 #region Rotation
267 public void UpdateRotation(LLQuaternion rot) 353 public void UpdateRotation(LLQuaternion rot)
268 { 354 {
269 this.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.Z); 355 this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
356 this.updateFlag = 2;
357 }
358
359 public void UpdateSingleRotation(LLQuaternion rot)
360 {
361 Axiom.Math.Quaternion axRot = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
362 Axiom.Math.Quaternion oldParentRot = new Quaternion(this.rotation.w, this.rotation.x, this.rotation.y, this.rotation.z);
363 this.rotation = axRot;
364 foreach (Primitive prim in this.children)
365 {
366 Axiom.Math.Vector3 axPos = new Vector3(prim.m_pos.X, prim.m_pos.Y, prim.m_pos.Z);
367 axPos = oldParentRot * axPos;
368 axPos = axRot.Inverse() * axPos;
369 prim.m_pos = new LLVector3(axPos.x, axPos.y, axPos.z);
370 prim.rotation = prim.rotation * oldParentRot;
371 prim.rotation = prim.rotation * axRot.Inverse();
372 prim.updateFlag = 2;
373 }
270 this.updateFlag = 2; 374 this.updateFlag = 2;
271 } 375 }
272 376
273 public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot) 377 public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot)
274 { 378 {
275 this.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.Z); 379 this.rotation = new Axiom.Math.Quaternion(rot.W, rot.X, rot.Y, rot.Z);
276 this.Pos = pos; 380 this.Pos = pos;
277 this.updateFlag = 2; 381 this.updateFlag = 2;
278 } 382 }
279 383
384 #endregion
385
386 #region Shape
280 public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock) 387 public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
281 { 388 {
282 this.m_Shape.PathBegin = shapeBlock.PathBegin; 389 this.m_Shape.PathBegin = shapeBlock.PathBegin;
@@ -299,6 +406,7 @@ namespace OpenSim.Region.Environment.Scenes
299 this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin; 406 this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin;
300 this.updateFlag = 1; 407 this.updateFlag = 1;
301 } 408 }
409 #endregion
302 410
303 #region Client Update Methods 411 #region Client Update Methods
304 412