private void TerseUpdateHandler(Packet packet, Simulator simulator) { float x, y, z, w; uint localid; LLVector4 CollisionPlane = LLVector4.Zero; LLVector3 Position; LLVector3 Velocity; LLVector3 Acceleration; LLQuaternion Rotation; LLVector3 RotationVelocity; ImprovedTerseObjectUpdatePacket update = (ImprovedTerseObjectUpdatePacket)packet; foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock block in update.ObjectData) { int i = 0; bool avatar; localid = (uint)(block.Data[i++] + (block.Data[i++] << 8) + (block.Data[i++] << 16) + (block.Data[i++] << 24)); byte state = block.Data[i++]; avatar = Convert.ToBoolean(block.Data[i++]); if (avatar) { if (OnAvatarMoved == null) return; CollisionPlane = new LLVector4(block.Data, i); i += 16; } else { if (OnPrimMoved == null) return; } // Position Position = new LLVector3(block.Data, i); i += 12; // Velocity x = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; y = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; z = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; Velocity = new LLVector3(x, y, z); // Acceleration x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; Acceleration = new LLVector3(x, y, z); // Rotation x = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; y = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; z = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; w = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; Rotation = new LLQuaternion(x, y, z, w); // Rotation velocity x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; RotationVelocity = new LLVector3(x, y, z); if (avatar) { if (localid == Client.Self.LocalID) { Client.Self.Position = Position; Client.Self.Rotation = Rotation; } AvatarUpdate avupdate = new AvatarUpdate(); avupdate.LocalID = localid; avupdate.State = state; avupdate.Position = Position; avupdate.CollisionPlane = CollisionPlane; avupdate.Velocity = Velocity; avupdate.Acceleration = Acceleration; avupdate.Rotation = Rotation; avupdate.RotationVelocity = RotationVelocity; avupdate.Textures = new TextureEntry(block.TextureEntry, 4, block.TextureEntry.Length - 4); if (OnAvatarMoved != null) { OnAvatarMoved(simulator, avupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } else { // TODO: Is there an easy way to distinguish prims from trees in this packet, // or would the client have to do it's own lookup to determine whether it's a // prim or a tree? If the latter, we should rename this update to something // less prim specific PrimUpdate primupdate = new PrimUpdate(); primupdate.LocalID = localid; primupdate.State = state; primupdate.Position = Position; primupdate.Velocity = Velocity; primupdate.Acceleration = Acceleration; primupdate.Rotation = Rotation; primupdate.RotationVelocity = RotationVelocity; primupdate.Textures = new TextureEntry(block.TextureEntry, 4, block.TextureEntry.Length - 4); if (OnPrimMoved != null) { OnPrimMoved(simulator, primupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } } }
private void TerseUpdateHandler(Packet packet, Simulator simulator) { float x, y, z, w; uint localid; LLVector4 CollisionPlane = null; LLVector3 Position; LLVector3 Velocity; LLVector3 Acceleration; LLQuaternion Rotation; LLVector3 RotationVelocity; ImprovedTerseObjectUpdatePacket update = (ImprovedTerseObjectUpdatePacket)packet; foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock block in update.ObjectData) { int i = 0; bool avatar; localid = (uint)(block.Data[i++] + (block.Data[i++] << 8) + (block.Data[i++] << 16) + (block.Data[i++] << 24)); byte state = block.Data[i++]; avatar = Convert.ToBoolean(block.Data[i++]); if (avatar) { if (OnAvatarMoved == null) { return; } CollisionPlane = new LLVector4(block.Data, i); i += 16; } else { if (OnPrimMoved == null) { return; } } // Position Position = new LLVector3(block.Data, i); i += 12; // Velocity x = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; y = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; z = Dequantize(block.Data, i, -128.0F, 128.0F); i += 2; Velocity = new LLVector3(x, y, z); // Acceleration x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; Acceleration = new LLVector3(x, y, z); // Rotation x = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; y = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; z = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; w = Dequantize(block.Data, i, -1.0F, 1.0F); i += 2; Rotation = new LLQuaternion(x, y, z, w); // Rotation velocity x = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; y = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; z = Dequantize(block.Data, i, -64.0F, 64.0F); i += 2; RotationVelocity = new LLVector3(x, y, z); if (avatar) { if (localid == Client.Self.LocalID) { Client.Self.Position = Position; Client.Self.Rotation = Rotation; } AvatarUpdate avupdate = new AvatarUpdate(); avupdate.LocalID = localid; avupdate.State = state; avupdate.Position = Position; avupdate.CollisionPlane = CollisionPlane; avupdate.Velocity = Velocity; avupdate.Acceleration = Acceleration; avupdate.Rotation = Rotation; avupdate.RotationVelocity = RotationVelocity; if (OnAvatarMoved != null) { OnAvatarMoved(simulator, avupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } else { // TODO: Is there an easy way to distinguish prims from trees in this packet, // or would the client have to do it's own lookup to determine whether it's a // prim or a tree? If the latter, we should rename this update to something // less prim specific PrimUpdate primupdate = new PrimUpdate(); primupdate.LocalID = localid; primupdate.State = state; primupdate.Position = Position; primupdate.Velocity = Velocity; primupdate.Acceleration = Acceleration; primupdate.Rotation = Rotation; primupdate.RotationVelocity = RotationVelocity; if (OnPrimMoved != null) { OnPrimMoved(simulator, primupdate, update.RegionData.RegionHandle, update.RegionData.TimeDilation); } } } }
public void Update(PrimUpdate primUpdate) { Prim.Position = primUpdate.Position; Prim.Rotation = primUpdate.Rotation; Acceleration = new Vector3(primUpdate.Acceleration.X, primUpdate.Acceleration.Y, primUpdate.Acceleration.Z); Velocity = new Vector3(primUpdate.Velocity.X, primUpdate.Velocity.Y, primUpdate.Velocity.Z); RotationVelocity = new Vector3(primUpdate.RotationVelocity.X, primUpdate.RotationVelocity.Y, primUpdate.RotationVelocity.Z); BuildMatrix(); }
/// <summary> /// /// </summary> /// <param name="simulator"></param> /// <param name="primUpdate"></param> /// <param name="regionHandle"></param> /// <param name="timeDilation"></param> void OnPrimMoved(Simulator simulator, PrimUpdate primUpdate, ulong regionHandle, ushort timeDilation) { if (Prims.ContainsKey(primUpdate.LocalID)) { Prims[primUpdate.LocalID].Update(primUpdate); } else { Client.Objects.RequestObject(simulator, primUpdate.LocalID); } }
private void Objects_OnPrimMoved(Simulator simulator, PrimUpdate prim, ulong regionHandle, ushort timeDilation) { lock (SimPrims) { if (SimPrims.ContainsKey(simulator) && SimPrims[simulator].ContainsKey(prim.LocalID)) { SimPrims[simulator][prim.LocalID].Position = prim.Position; SimPrims[simulator][prim.LocalID].Rotation = prim.Rotation; } } }