private void ProcessGroupPosition(SceneObjectPart obj, XmlTextReader reader)
 {
     obj.FixGroupPosition(ReadVector(reader, "GroupPosition"), false);
 }
        /// <summary>
        ///   Builds the prim from a datarecord.
        /// </summary>
        /// <param name = "primRow">datarecord</param>
        /// <returns></returns>
        private static SceneObjectPart BuildPrim(IDataRecord primRow, IScene scene)
        {
            SceneObjectPart prim = new SceneObjectPart(scene)
            {
                UUID         = new UUID((Guid)primRow["UUID"]),
                CreationDate = Convert.ToInt32(primRow["CreationDate"]),
                Name         = (string)primRow["Name"],
                Text         = (string)primRow["Text"],
                Color        = Color.FromArgb(Convert.ToInt32(primRow["ColorA"]),
                                              Convert.ToInt32(primRow["ColorR"]),
                                              Convert.ToInt32(primRow["ColorG"]),
                                              Convert.ToInt32(primRow["ColorB"])),
                Description   = (string)primRow["Description"],
                SitName       = (string)primRow["SitName"],
                TouchName     = (string)primRow["TouchName"],
                Flags         = (PrimFlags)Convert.ToUInt32(primRow["ObjectFlags"]),
                CreatorID     = new UUID((Guid)primRow["CreatorID"]),
                OwnerID       = new UUID((Guid)primRow["OwnerID"]),
                GroupID       = new UUID((Guid)primRow["GroupID"]),
                LastOwnerID   = new UUID((Guid)primRow["LastOwnerID"]),
                OwnerMask     = Convert.ToUInt32(primRow["OwnerMask"]),
                NextOwnerMask = Convert.ToUInt32(primRow["NextOwnerMask"]),
                GroupMask     = Convert.ToUInt32(primRow["GroupMask"]),
                EveryoneMask  = Convert.ToUInt32(primRow["EveryoneMask"]),
                BaseMask      = Convert.ToUInt32(primRow["BaseMask"])
            };

            // explicit conversion of integers is required, which sort
            // of sucks.  No idea if there is a shortcut here or not.
            // various text fields
            // permissions
            // vectors
            prim.FixOffsetPosition(new Vector3(
                                       Convert.ToSingle(primRow["PositionX"]),
                                       Convert.ToSingle(primRow["PositionY"]),
                                       Convert.ToSingle(primRow["PositionZ"]))
                                   , true);

            prim.FixGroupPosition(new Vector3(
                                      Convert.ToSingle(primRow["GroupPositionX"]),
                                      Convert.ToSingle(primRow["GroupPositionY"]),
                                      Convert.ToSingle(primRow["GroupPositionZ"]))
                                  , true);

            prim.Velocity = new Vector3(
                Convert.ToSingle(primRow["VelocityX"]),
                Convert.ToSingle(primRow["VelocityY"]),
                Convert.ToSingle(primRow["VelocityZ"]));

            prim.AngularVelocity = new Vector3(
                Convert.ToSingle(primRow["AngularVelocityX"]),
                Convert.ToSingle(primRow["AngularVelocityY"]),
                Convert.ToSingle(primRow["AngularVelocityZ"]));

            prim.Acceleration = new Vector3(
                Convert.ToSingle(primRow["AccelerationX"]),
                Convert.ToSingle(primRow["AccelerationY"]),
                Convert.ToSingle(primRow["AccelerationZ"]));

            // quaternions
            prim.RotationOffset = new Quaternion(
                Convert.ToSingle(primRow["RotationX"]),
                Convert.ToSingle(primRow["RotationY"]),
                Convert.ToSingle(primRow["RotationZ"]),
                Convert.ToSingle(primRow["RotationW"]));

            prim.SitTargetPositionLL = new Vector3(
                Convert.ToSingle(primRow["SitTargetOffsetX"]),
                Convert.ToSingle(primRow["SitTargetOffsetY"]),
                Convert.ToSingle(primRow["SitTargetOffsetZ"]));

            prim.SitTargetOrientationLL = new Quaternion(
                Convert.ToSingle(primRow["SitTargetOrientX"]),
                Convert.ToSingle(primRow["SitTargetOrientY"]),
                Convert.ToSingle(primRow["SitTargetOrientZ"]),
                Convert.ToSingle(primRow["SitTargetOrientW"]));

            prim.PayPrice[0] = Convert.ToInt32(primRow["PayPrice"]);
            prim.PayPrice[1] = Convert.ToInt32(primRow["PayButton1"]);
            prim.PayPrice[2] = Convert.ToInt32(primRow["PayButton2"]);
            prim.PayPrice[3] = Convert.ToInt32(primRow["PayButton3"]);
            prim.PayPrice[4] = Convert.ToInt32(primRow["PayButton4"]);

            prim.Sound      = new UUID((Guid)primRow["LoopedSound"]);
            prim.SoundGain  = Convert.ToSingle(primRow["LoopedSoundGain"]);
            prim.SoundFlags = 1; // If it's persisted at all, it's looped

            if (!(primRow["TextureAnimation"] is DBNull))
            {
                prim.TextureAnimation = (Byte[])primRow["TextureAnimation"];
            }
            if (!(primRow["ParticleSystem"] is DBNull))
            {
                prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
            }

            prim.AngularVelocity = new Vector3(
                Convert.ToSingle(primRow["OmegaX"]),
                Convert.ToSingle(primRow["OmegaY"]),
                Convert.ToSingle(primRow["OmegaZ"]));

            prim.CameraEyeOffset = new Vector3(
                Convert.ToSingle(primRow["CameraEyeOffsetX"]),
                Convert.ToSingle(primRow["CameraEyeOffsetY"]),
                Convert.ToSingle(primRow["CameraEyeOffsetZ"])
                );

            prim.CameraAtOffset = new Vector3(
                Convert.ToSingle(primRow["CameraAtOffsetX"]),
                Convert.ToSingle(primRow["CameraAtOffsetY"]),
                Convert.ToSingle(primRow["CameraAtOffsetZ"])
                );

            if (Convert.ToInt16(primRow["ForceMouselook"]) != 0)
            {
                prim.ForceMouselook = (true);
            }

            prim.ScriptAccessPin = Convert.ToInt32(primRow["ScriptAccessPin"]);

            if (Convert.ToInt16(primRow["AllowedDrop"]) != 0)
            {
                prim.AllowedDrop = true;
            }

            if (Convert.ToInt16(primRow["DieAtEdge"]) != 0)
            {
                prim.DIE_AT_EDGE = true;
            }

            prim.SalePrice      = Convert.ToInt32(primRow["SalePrice"]);
            prim.ObjectSaleType = Convert.ToByte(primRow["SaleType"]);

            prim.Material = Convert.ToByte(primRow["Material"]);

            if (!(primRow["ClickAction"] is DBNull))
            {
                prim.ClickAction = Convert.ToByte(primRow["ClickAction"]);
            }

            prim.CollisionSound       = new UUID((Guid)primRow["CollisionSound"]);
            prim.CollisionSoundVolume = Convert.ToSingle(primRow["CollisionSoundVolume"]);
            prim.PassTouch            = Convert.ToInt32(primRow["PassTouches"]);
            prim.LinkNum     = Convert.ToInt32(primRow["LinkNumber"]);
            prim.GenericData = (string)primRow["Generic"];
            if (!(primRow["MediaURL"] is DBNull))
            {
                prim.MediaUrl = (string)primRow["MediaURL"];
            }

            return(prim);
        }