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;
         }
     }
 }