aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/OpenSim.RegionServer/world/Primitive.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/OpenSim.RegionServer/world/Primitive.cs570
1 files changed, 570 insertions, 0 deletions
diff --git a/OpenSim/OpenSim.RegionServer/world/Primitive.cs b/OpenSim/OpenSim.RegionServer/world/Primitive.cs
new file mode 100644
index 0000000..e048a9e
--- /dev/null
+++ b/OpenSim/OpenSim.RegionServer/world/Primitive.cs
@@ -0,0 +1,570 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.types;
5using libsecondlife;
6using libsecondlife.Packets;
7using OpenSim.Framework.Interfaces;
8using OpenSim.Physics.Manager;
9using OpenSim.Framework.Types;
10
11namespace OpenSim.world
12{
13 public class Primitive : Entity
14 {
15 protected float mesh_cutbegin;
16 protected float mesh_cutend;
17 protected PrimData primData;
18 protected bool newPrimFlag = false;
19 protected bool updateFlag = false;
20 protected bool dirtyFlag = false;
21 private ObjectUpdatePacket OurPacket;
22 private bool physicsEnabled = false;
23 private bool physicstest = false;
24 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
25 private Dictionary<uint, ClientView> m_clientThreads;
26 private ulong m_regionHandle;
27 private const uint FULL_MASK_PERMISSIONS = 2147483647;
28
29 public bool PhysicsEnabled
30 {
31 get
32 {
33 return physicsEnabled;
34 }
35 set
36 {
37 physicsEnabled = value;
38 }
39 }
40 public bool UpdateFlag
41 {
42 get
43 {
44 return updateFlag;
45 }
46 set
47 {
48 updateFlag = value;
49 }
50 }
51 public LLVector3 Scale
52 {
53 set
54 {
55 LLVector3 offset = (value - primData.Scale);
56 offset.X /= 2;
57 offset.Y /= 2;
58 offset.Z /= 2;
59
60 this.primData.Position += offset;
61 this.primData.Scale = value;
62
63 this.dirtyFlag = true;
64 }
65 get
66 {
67 return this.primData.Scale;
68 }
69 }
70 public PhysicsActor PhysActor
71 {
72 set
73 {
74 this._physActor = value;
75 }
76 }
77
78 public Primitive(Dictionary<uint, ClientView> clientThreads, ulong regionHandle, World world)
79 {
80 mesh_cutbegin = 0.0f;
81 mesh_cutend = 1.0f;
82
83 m_clientThreads = clientThreads;
84 m_regionHandle = regionHandle;
85 m_world = world;
86 }
87
88 public override Mesh getMesh()
89 {
90 Mesh mesh = new Mesh();
91 Triangle tri = new Triangle(
92 new Axiom.MathLib.Vector3(0.0f, 1.0f, 1.0f),
93 new Axiom.MathLib.Vector3(1.0f, 0.0f, 1.0f),
94 new Axiom.MathLib.Vector3(1.0f, 1.0f, 0.0f));
95
96 mesh.AddTri(tri);
97 mesh += base.getMesh();
98
99 return mesh;
100 }
101
102 public byte[] GetByteArray()
103 {
104 return this.primData.ToBytes();
105 }
106
107 public void GetProperites(ClientView client)
108 {
109 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
110 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
111 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
112 proper.ObjectData[0].ItemID = LLUUID.Zero; // this.uuid;
113 proper.ObjectData[0].CreationDate = (ulong) this.primData.CreationDate;
114 proper.ObjectData[0].CreatorID = this.primData.OwnerID;
115 proper.ObjectData[0].FolderID = LLUUID.Zero;
116 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
117 proper.ObjectData[0].GroupID = LLUUID.Zero;
118 proper.ObjectData[0].InventorySerial = 0;
119 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
120 proper.ObjectData[0].ObjectID = this.uuid;
121 proper.ObjectData[0].OwnerID = primData.OwnerID;
122 proper.ObjectData[0].TouchName = new byte[0];
123 proper.ObjectData[0].TextureID = new byte[0];
124 proper.ObjectData[0].SitName = new byte[0];
125 proper.ObjectData[0].Name = new byte[0];
126 proper.ObjectData[0].Description = new byte[0];
127 proper.ObjectData[0].OwnerMask = this.primData.OwnerMask;
128 proper.ObjectData[0].NextOwnerMask = this.primData.NextOwnerMask;
129 proper.ObjectData[0].GroupMask = this.primData.GroupMask;
130 proper.ObjectData[0].EveryoneMask = this.primData.EveryoneMask;
131 proper.ObjectData[0].BaseMask = this.primData.BaseMask;
132
133 client.OutPacket(proper);
134 }
135
136 public void UpdatePosition(LLVector3 pos)
137 {
138 this.Pos = pos;
139 if (this._physActor != null) // && this.physicsEnabled)
140 {
141 try
142 {
143 lock (m_world.LockPhysicsEngine)
144 {
145 this._physActor.Position = new PhysicsVector(pos.X, pos.Y, pos.Z);
146 }
147 }
148 catch (Exception e)
149 {
150 Console.WriteLine(e.Message);
151 }
152 }
153 this.updateFlag = true;
154 }
155
156 public override void update()
157 {
158 LLVector3 pos2 = new LLVector3(0, 0, 0);
159 if (this._physActor != null && this.physicsEnabled)
160 {
161
162 PhysicsVector pPos = this._physActor.Position;
163 pos2 = new LLVector3(pPos.X, pPos.Y, pPos.Z);
164 }
165 if (this.newPrimFlag)
166 {
167 foreach (ClientView client in m_clientThreads.Values)
168 {
169 client.OutPacket(OurPacket);
170 }
171 this.newPrimFlag = false;
172 }
173 else if (this.updateFlag)
174 {
175 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
176 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
177 terse.RegionData.TimeDilation = 64096;
178 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
179 terse.ObjectData[0] = this.CreateImprovedBlock();
180 foreach (ClientView client in m_clientThreads.Values)
181 {
182 client.OutPacket(terse);
183 }
184 this.updateFlag = false;
185 }
186 else if (this.dirtyFlag)
187 {
188 foreach (ClientView client in m_clientThreads.Values)
189 {
190 UpdateClient(client);
191 }
192 this.dirtyFlag = false;
193 }
194 else
195 {
196 if (this._physActor != null && this.physicsEnabled)
197 {
198 if (pos2 != this.positionLastFrame)
199 {
200 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
201 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
202 terse.RegionData.TimeDilation = 64096;
203 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
204 terse.ObjectData[0] = this.CreateImprovedBlock();
205 foreach (ClientView client in m_clientThreads.Values)
206 {
207 client.OutPacket(terse);
208 }
209 }
210 this.positionLastFrame = pos2;
211 }
212 }
213
214 if (this.physicstest)
215 {
216 LLVector3 pos = this.Pos;
217 pos.Z += 0.0001f;
218 this.UpdatePosition(pos);
219 this.physicstest = false;
220 }
221 }
222
223 public void UpdateClient(ClientView RemoteClient)
224 {
225
226 LLVector3 lPos;
227 if (this._physActor != null && this.physicsEnabled)
228 {
229 PhysicsVector pPos = this._physActor.Position;
230 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
231 }
232 else
233 {
234 lPos = this.Pos;
235 }
236 byte[] pb = lPos.GetBytes();
237 Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length);
238
239 // OurPacket should be update with the follwing in updateShape() rather than having to do it here
240 OurPacket.ObjectData[0].OwnerID = this.primData.OwnerID;
241 OurPacket.ObjectData[0].PCode = this.primData.PCode;
242 OurPacket.ObjectData[0].PathBegin = this.primData.PathBegin;
243 OurPacket.ObjectData[0].PathEnd = this.primData.PathEnd;
244 OurPacket.ObjectData[0].PathScaleX = this.primData.PathScaleX;
245 OurPacket.ObjectData[0].PathScaleY = this.primData.PathScaleY;
246 OurPacket.ObjectData[0].PathShearX = this.primData.PathShearX;
247 OurPacket.ObjectData[0].PathShearY = this.primData.PathShearY;
248 OurPacket.ObjectData[0].PathSkew = this.primData.PathSkew;
249 OurPacket.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
250 OurPacket.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
251 OurPacket.ObjectData[0].Scale = this.primData.Scale;
252 OurPacket.ObjectData[0].PathCurve = this.primData.PathCurve;
253 OurPacket.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
254 OurPacket.ObjectData[0].ParentID = this.primData.ParentID ;
255 OurPacket.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
256 //finish off copying rest of shape data
257 OurPacket.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
258 OurPacket.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
259 OurPacket.ObjectData[0].PathTaperX = this.primData.PathTaperX;
260 OurPacket.ObjectData[0].PathTaperY = this.primData.PathTaperY;
261 OurPacket.ObjectData[0].PathTwist = this.primData.PathTwist;
262 OurPacket.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
263
264 RemoteClient.OutPacket(OurPacket);
265 }
266
267 public void UpdateShape(ObjectShapePacket.ObjectDataBlock addPacket)
268 {
269 this.primData.PathBegin = addPacket.PathBegin;
270 this.primData.PathEnd = addPacket.PathEnd;
271 this.primData.PathScaleX = addPacket.PathScaleX;
272 this.primData.PathScaleY = addPacket.PathScaleY;
273 this.primData.PathShearX = addPacket.PathShearX;
274 this.primData.PathShearY = addPacket.PathShearY;
275 this.primData.PathSkew = addPacket.PathSkew;
276 this.primData.ProfileBegin = addPacket.ProfileBegin;
277 this.primData.ProfileEnd = addPacket.ProfileEnd;
278 this.primData.PathCurve = addPacket.PathCurve;
279 this.primData.ProfileCurve = addPacket.ProfileCurve;
280 this.primData.ProfileHollow = addPacket.ProfileHollow;
281 this.primData.PathRadiusOffset = addPacket.PathRadiusOffset;
282 this.primData.PathRevolutions = addPacket.PathRevolutions;
283 this.primData.PathTaperX = addPacket.PathTaperX;
284 this.primData.PathTaperY = addPacket.PathTaperY;
285 this.primData.PathTwist = addPacket.PathTwist;
286 this.primData.PathTwistBegin = addPacket.PathTwistBegin;
287 this.dirtyFlag = true;
288 }
289
290 public void UpdateTexture(byte[] tex)
291 {
292 this.OurPacket.ObjectData[0].TextureEntry = tex;
293 this.primData.Texture = tex;
294 this.dirtyFlag = true;
295 }
296
297 public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
298 {
299 if (this._physActor != null)
300 {
301 if (this._physActor.Kinematic == pack.AgentData.UsePhysics)
302 {
303 this._physActor.Kinematic = !pack.AgentData.UsePhysics; //if Usephysics = true, then Kinematic should = false
304 }
305 this.physicsEnabled = pack.AgentData.UsePhysics;
306 if (this._physActor.Kinematic == false)
307 {
308 LLVector3 pos = this.Pos;
309 this.UpdatePosition(pos);
310 pos.Z += 0.000001f;
311 this.UpdatePosition(pos);
312 this.physicstest = true;
313 }
314 else
315 {
316 PhysicsVector vec = this._physActor.Position;
317 LLVector3 pos = new LLVector3(vec.X, vec.Y, vec.Z);
318 this.Pos = pos;
319 this.updateFlag = true;
320 }
321 }
322 }
323
324 public void MakeParent(Primitive prim)
325 {
326 this.primData.ParentID = prim.localid;
327 this.Pos -= prim.Pos;
328 this.dirtyFlag = true;
329 }
330
331 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
332 {
333 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
334 objupdate.RegionData.RegionHandle = m_regionHandle;
335 objupdate.RegionData.TimeDilation = 64096;
336
337 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
338 PrimData PData = new PrimData();
339 this.primData = PData;
340 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
341
342 objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
343 objupdate.ObjectData[0].PSBlock = new byte[0];
344 objupdate.ObjectData[0].ExtraParams = new byte[1];
345 objupdate.ObjectData[0].MediaURL = new byte[0];
346 objupdate.ObjectData[0].NameValue = new byte[0];
347 objupdate.ObjectData[0].Text = new byte[0];
348 objupdate.ObjectData[0].TextColor = new byte[4];
349 objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
350 objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
351 objupdate.ObjectData[0].Material = 3;
352 objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
353 objupdate.ObjectData[0].TextureAnim = new byte[0];
354 objupdate.ObjectData[0].Sound = LLUUID.Zero;
355 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
356 this.primData.Texture = objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
357 objupdate.ObjectData[0].State = 0;
358 objupdate.ObjectData[0].Data = new byte[0];
359 PData.OwnerID = objupdate.ObjectData[0].OwnerID = ownerID;
360 PData.PCode = objupdate.ObjectData[0].PCode = addPacket.ObjectData.PCode;
361 PData.PathBegin = objupdate.ObjectData[0].PathBegin = addPacket.ObjectData.PathBegin;
362 PData.PathEnd = objupdate.ObjectData[0].PathEnd = addPacket.ObjectData.PathEnd;
363 PData.PathScaleX = objupdate.ObjectData[0].PathScaleX = addPacket.ObjectData.PathScaleX;
364 PData.PathScaleY = objupdate.ObjectData[0].PathScaleY = addPacket.ObjectData.PathScaleY;
365 PData.PathShearX = objupdate.ObjectData[0].PathShearX = addPacket.ObjectData.PathShearX;
366 PData.PathShearY = objupdate.ObjectData[0].PathShearY = addPacket.ObjectData.PathShearY;
367 PData.PathSkew = objupdate.ObjectData[0].PathSkew = addPacket.ObjectData.PathSkew;
368 PData.ProfileBegin = objupdate.ObjectData[0].ProfileBegin = addPacket.ObjectData.ProfileBegin;
369 PData.ProfileEnd = objupdate.ObjectData[0].ProfileEnd = addPacket.ObjectData.ProfileEnd;
370 PData.Scale = objupdate.ObjectData[0].Scale = addPacket.ObjectData.Scale;
371 PData.PathCurve = objupdate.ObjectData[0].PathCurve = addPacket.ObjectData.PathCurve;
372 PData.ProfileCurve = objupdate.ObjectData[0].ProfileCurve = addPacket.ObjectData.ProfileCurve;
373 PData.ParentID = objupdate.ObjectData[0].ParentID = 0;
374 PData.ProfileHollow = objupdate.ObjectData[0].ProfileHollow = addPacket.ObjectData.ProfileHollow;
375 PData.PathRadiusOffset = objupdate.ObjectData[0].PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
376 PData.PathRevolutions = objupdate.ObjectData[0].PathRevolutions = addPacket.ObjectData.PathRevolutions;
377 PData.PathTaperX = objupdate.ObjectData[0].PathTaperX = addPacket.ObjectData.PathTaperX;
378 PData.PathTaperY = objupdate.ObjectData[0].PathTaperY = addPacket.ObjectData.PathTaperY;
379 PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist;
380 PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
381 objupdate.ObjectData[0].ID = (uint)(localID);
382 objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID - 702000).ToString("00000"));
383 objupdate.ObjectData[0].ObjectData = new byte[60];
384 objupdate.ObjectData[0].ObjectData[46] = 128;
385 objupdate.ObjectData[0].ObjectData[47] = 63;
386 LLVector3 pos1 = addPacket.ObjectData.RayEnd;
387 //update position
388 byte[] pb = pos1.GetBytes();
389 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
390 this.newPrimFlag = true;
391 this.primData.FullID = this.uuid = objupdate.ObjectData[0].FullID;
392 this.localid = objupdate.ObjectData[0].ID;
393 this.primData.Position = this.Pos = pos1;
394 this.OurPacket = objupdate;
395 }
396
397 public void CreateFromStorage(PrimData store)
398 {
399 this.CreateFromStorage(store, store.Position, store.LocalID, false);
400 }
401
402 public void CreateFromStorage(PrimData store, LLVector3 posi, uint localID, bool newprim)
403 {
404 //need to clean this up as it shares a lot of code with CreateFromPacket()
405 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
406 objupdate.RegionData.RegionHandle = m_regionHandle;
407 objupdate.RegionData.TimeDilation = 64096;
408 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
409
410 this.primData = store;
411 objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
412 objupdate.ObjectData[0].PSBlock = new byte[0];
413 objupdate.ObjectData[0].ExtraParams = new byte[1];
414 objupdate.ObjectData[0].MediaURL = new byte[0];
415 objupdate.ObjectData[0].NameValue = new byte[0];
416 objupdate.ObjectData[0].Text = new byte[0];
417 objupdate.ObjectData[0].TextColor = new byte[4];
418 objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
419 objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
420 objupdate.ObjectData[0].Material = 3;
421 objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
422 objupdate.ObjectData[0].TextureAnim = new byte[0];
423 objupdate.ObjectData[0].Sound = LLUUID.Zero;
424
425 if (store.Texture == null)
426 {
427 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
428 objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
429 }
430 else
431 {
432 objupdate.ObjectData[0].TextureEntry = store.Texture;
433 }
434
435 objupdate.ObjectData[0].State = 0;
436 objupdate.ObjectData[0].Data = new byte[0];
437 objupdate.ObjectData[0].OwnerID = this.primData.OwnerID;
438 objupdate.ObjectData[0].PCode = this.primData.PCode;
439 objupdate.ObjectData[0].PathBegin = this.primData.PathBegin;
440 objupdate.ObjectData[0].PathEnd = this.primData.PathEnd;
441 objupdate.ObjectData[0].PathScaleX = this.primData.PathScaleX;
442 objupdate.ObjectData[0].PathScaleY = this.primData.PathScaleY;
443 objupdate.ObjectData[0].PathShearX = this.primData.PathShearX;
444 objupdate.ObjectData[0].PathShearY = this.primData.PathShearY;
445 objupdate.ObjectData[0].PathSkew = this.primData.PathSkew;
446 objupdate.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
447 objupdate.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
448 objupdate.ObjectData[0].Scale = this.primData.Scale;
449 objupdate.ObjectData[0].PathCurve = this.primData.PathCurve;
450 objupdate.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
451 objupdate.ObjectData[0].ParentID = 0;
452 objupdate.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
453 //finish off copying rest of shape data
454 objupdate.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
455 objupdate.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
456 objupdate.ObjectData[0].PathTaperX = this.primData.PathTaperX;
457 objupdate.ObjectData[0].PathTaperY = this.primData.PathTaperY;
458 objupdate.ObjectData[0].PathTwist = this.primData.PathTwist;
459 objupdate.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
460
461 objupdate.ObjectData[0].ID = localID; // (uint)store.LocalID;
462 objupdate.ObjectData[0].FullID = store.FullID;
463
464 objupdate.ObjectData[0].ObjectData = new byte[60];
465 objupdate.ObjectData[0].ObjectData[46] = 128;
466 objupdate.ObjectData[0].ObjectData[47] = 63;
467 LLVector3 pos1 = posi; // store.Position;
468 //update position
469 byte[] pb = pos1.GetBytes();
470 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
471
472 this.uuid = objupdate.ObjectData[0].FullID;
473 this.localid = objupdate.ObjectData[0].ID;
474 this.Pos = pos1;
475 this.OurPacket = objupdate;
476 if (newprim)
477 {
478 this.newPrimFlag = true;
479 }
480 }
481
482 public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedBlock()
483 {
484 uint ID = this.localid;
485 byte[] bytes = new byte[60];
486
487 int i = 0;
488 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
489 //dat.TextureEntry = this.OurPacket.ObjectData[0].TextureEntry;
490 dat.TextureEntry = new byte[0];
491 //Console.WriteLine("texture-entry length in improvedterse block is " + this.OurPacket.ObjectData[0].TextureEntry.Length);
492 bytes[i++] = (byte)(ID % 256);
493 bytes[i++] = (byte)((ID >> 8) % 256);
494 bytes[i++] = (byte)((ID >> 16) % 256);
495 bytes[i++] = (byte)((ID >> 24) % 256);
496 bytes[i++] = 0;
497 bytes[i++] = 0;
498
499 LLVector3 lPos;
500 Axiom.MathLib.Quaternion lRot;
501 if (this._physActor != null && this.physicsEnabled)
502 {
503 PhysicsVector pPos = this._physActor.Position;
504 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
505 lRot = this._physActor.Orientation;
506 }
507 else
508 {
509 lPos = this.Pos;
510 lRot = this.rotation;
511 }
512 byte[] pb = lPos.GetBytes();
513 Array.Copy(pb, 0, bytes, i, pb.Length);
514 i += 12;
515 ushort ac = 32767;
516
517 //vel
518 bytes[i++] = (byte)(ac % 256);
519 bytes[i++] = (byte)((ac >> 8) % 256);
520 bytes[i++] = (byte)(ac % 256);
521 bytes[i++] = (byte)((ac >> 8) % 256);
522 bytes[i++] = (byte)(ac % 256);
523 bytes[i++] = (byte)((ac >> 8) % 256);
524
525 //accel
526 bytes[i++] = (byte)(ac % 256);
527 bytes[i++] = (byte)((ac >> 8) % 256);
528 bytes[i++] = (byte)(ac % 256);
529 bytes[i++] = (byte)((ac >> 8) % 256);
530 bytes[i++] = (byte)(ac % 256);
531 bytes[i++] = (byte)((ac >> 8) % 256);
532
533 ushort rw, rx, ry, rz;
534 rw = (ushort)(32768 * (lRot.w + 1));
535 rx = (ushort)(32768 * (lRot.x + 1));
536 ry = (ushort)(32768 * (lRot.y + 1));
537 rz = (ushort)(32768 * (lRot.z + 1));
538
539 //rot
540 bytes[i++] = (byte)(rx % 256);
541 bytes[i++] = (byte)((rx >> 8) % 256);
542 bytes[i++] = (byte)(ry % 256);
543 bytes[i++] = (byte)((ry >> 8) % 256);
544 bytes[i++] = (byte)(rz % 256);
545 bytes[i++] = (byte)((rz >> 8) % 256);
546 bytes[i++] = (byte)(rw % 256);
547 bytes[i++] = (byte)((rw >> 8) % 256);
548
549 //rotation vel
550 bytes[i++] = (byte)(ac % 256);
551 bytes[i++] = (byte)((ac >> 8) % 256);
552 bytes[i++] = (byte)(ac % 256);
553 bytes[i++] = (byte)((ac >> 8) % 256);
554 bytes[i++] = (byte)(ac % 256);
555 bytes[i++] = (byte)((ac >> 8) % 256);
556
557 dat.Data = bytes;
558 return dat;
559 }
560
561 public override void BackUp()
562 {
563 this.primData.FullID = this.uuid;
564 this.primData.LocalID = this.localid;
565 this.primData.Position = this.Pos;
566 this.primData.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w);
567 this.m_world.localStorage.StorePrim(this.primData);
568 }
569 }
570}