diff --git a/OpenMetaverse.Rendering.Meshmerizer/MeshmerizerTypes.cs b/OpenMetaverse.Rendering.Meshmerizer/MeshmerizerTypes.cs index 73426f53..9b21963c 100644 --- a/OpenMetaverse.Rendering.Meshmerizer/MeshmerizerTypes.cs +++ b/OpenMetaverse.Rendering.Meshmerizer/MeshmerizerTypes.cs @@ -1026,7 +1026,7 @@ namespace OpenMetaverse.Rendering // Sculpted private UUID _sculptTexture = UUID.Zero; private byte _sculptType = (byte)0; - private byte[] _sculptData = new byte[0]; + private byte[] _sculptData = Utils.EmptyBytes; // Flexi private int _flexiSoftness = 0; diff --git a/OpenMetaverse.StructuredData/LLSD/NotationLLSD.cs b/OpenMetaverse.StructuredData/LLSD/NotationLLSD.cs index be1f35dc..e0d7efd2 100644 --- a/OpenMetaverse.StructuredData/LLSD/NotationLLSD.cs +++ b/OpenMetaverse.StructuredData/LLSD/NotationLLSD.cs @@ -186,7 +186,7 @@ namespace OpenMetaverse.StructuredData osd = OSD.FromUUID(lluuid); break; case binaryNotationMarker: - byte[] bytes = new byte[0]; + byte[] bytes = Utils.EmptyBytes; int bChar = reader.Peek(); if (bChar < 0) throw new OSDException("Notation LLSD parsing: Unexpected end of stream in binary."); diff --git a/OpenMetaverse.StructuredData/LLSD/XmlLLSD.cs b/OpenMetaverse.StructuredData/LLSD/XmlLLSD.cs index 4f1038c4..870eb8f2 100644 --- a/OpenMetaverse.StructuredData/LLSD/XmlLLSD.cs +++ b/OpenMetaverse.StructuredData/LLSD/XmlLLSD.cs @@ -389,7 +389,7 @@ namespace OpenMetaverse.StructuredData if (reader.IsEmptyElement) { reader.Read(); - return OSD.FromBinary(new byte[0]); + return OSD.FromBinary(Utils.EmptyBytes); } if (reader.GetAttribute("encoding") != null && reader.GetAttribute("encoding") != "base64") @@ -408,7 +408,7 @@ namespace OpenMetaverse.StructuredData } } - ret = OSD.FromBinary(new byte[0]); + ret = OSD.FromBinary(Utils.EmptyBytes); break; case "uri": if (reader.IsEmptyElement) diff --git a/OpenMetaverse.StructuredData/StructuredData.cs b/OpenMetaverse.StructuredData/StructuredData.cs index cc890a37..6a915154 100644 --- a/OpenMetaverse.StructuredData/StructuredData.cs +++ b/OpenMetaverse.StructuredData/StructuredData.cs @@ -86,7 +86,7 @@ namespace OpenMetaverse.StructuredData public virtual UUID AsUUID() { return UUID.Zero; } public virtual DateTime AsDate() { return Utils.Epoch; } public virtual Uri AsUri() { return new Uri(String.Empty); } - public virtual byte[] AsBinary() { return new byte[0]; } + public virtual byte[] AsBinary() { return Utils.EmptyBytes; } public virtual Vector2 AsVector2() { return Vector2.Zero; } public virtual Vector3 AsVector3() { return Vector3.Zero; } public virtual Vector3d AsVector3d() { return Vector3d.Zero; } @@ -668,7 +668,7 @@ namespace OpenMetaverse.StructuredData if (value != null) this.value = value; else - this.value = new byte[0]; + this.value = Utils.EmptyBytes; } public OSDBinary(uint value) diff --git a/OpenMetaverse/AgentManager.cs b/OpenMetaverse/AgentManager.cs index 0ff9ab47..11b8f6f8 100644 --- a/OpenMetaverse/AgentManager.cs +++ b/OpenMetaverse/AgentManager.cs @@ -1252,7 +1252,7 @@ namespace OpenMetaverse { InstantMessage(Name, target, message, AgentID.Equals(target) ? AgentID : target ^ AgentID, InstantMessageDialog.MessageFromAgent, InstantMessageOnline.Offline, this.SimPosition, - UUID.Zero, new byte[0]); + UUID.Zero, Utils.EmptyBytes); } /// @@ -1265,7 +1265,7 @@ namespace OpenMetaverse { InstantMessage(Name, target, message, imSessionID, InstantMessageDialog.MessageFromAgent, InstantMessageOnline.Offline, this.SimPosition, - UUID.Zero, new byte[0]); + UUID.Zero, Utils.EmptyBytes); } /// @@ -1289,7 +1289,7 @@ namespace OpenMetaverse } else { - binaryBucket = new byte[0]; + binaryBucket = Utils.EmptyBytes; } InstantMessage(fromName, target, message, imSessionID, InstantMessageDialog.MessageFromAgent, @@ -1334,7 +1334,7 @@ namespace OpenMetaverse if (binaryBucket != null) im.MessageBlock.BinaryBucket = binaryBucket; else - im.MessageBlock.BinaryBucket = new byte[0]; + im.MessageBlock.BinaryBucket = Utils.EmptyBytes; // These fields are mandatory, even if we don't have valid values for them im.MessageBlock.Position = Vector3.Zero; @@ -1410,12 +1410,12 @@ namespace OpenMetaverse im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionGroupStart; im.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name); im.MessageBlock.FromGroup = false; - im.MessageBlock.Message = new byte[0]; + im.MessageBlock.Message = Utils.EmptyBytes; im.MessageBlock.ParentEstateID = 0; im.MessageBlock.Offline = 0; im.MessageBlock.ID = groupID; im.MessageBlock.ToAgentID = groupID; - im.MessageBlock.BinaryBucket = new byte[0]; + im.MessageBlock.BinaryBucket = Utils.EmptyBytes; im.MessageBlock.Position = Client.Self.SimPosition; im.MessageBlock.RegionID = UUID.Zero; @@ -1435,11 +1435,11 @@ namespace OpenMetaverse im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionDrop; im.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name); im.MessageBlock.FromGroup = false; - im.MessageBlock.Message = new byte[0]; + im.MessageBlock.Message = Utils.EmptyBytes; im.MessageBlock.Offline = 0; im.MessageBlock.ID = groupID; im.MessageBlock.ToAgentID = groupID; - im.MessageBlock.BinaryBucket = new byte[0]; + im.MessageBlock.BinaryBucket = Utils.EmptyBytes; im.MessageBlock.Position = Vector3.Zero; im.MessageBlock.RegionID = UUID.Zero; @@ -2338,7 +2338,7 @@ namespace OpenMetaverse { InstantMessage(Name, requesterID, String.Empty, UUID.Random(), accept ? InstantMessageDialog.AcceptTeleport : InstantMessageDialog.DenyTeleport, - InstantMessageOnline.Offline, this.SimPosition, UUID.Zero, new byte[0]); + InstantMessageOnline.Offline, this.SimPosition, UUID.Zero, Utils.EmptyBytes); if (accept) { @@ -2492,7 +2492,7 @@ namespace OpenMetaverse { InstantMessage(Name, groupID, String.Empty, imSessionID, accept ? InstantMessageDialog.GroupInvitationAccept : InstantMessageDialog.GroupInvitationDecline, - InstantMessageOnline.Offline, Vector3.Zero, UUID.Zero, new byte[0]); + InstantMessageOnline.Offline, Vector3.Zero, UUID.Zero, Utils.EmptyBytes); } /// diff --git a/OpenMetaverse/AssetManager.cs b/OpenMetaverse/AssetManager.cs index a29050c2..fd5ad9af 100644 --- a/OpenMetaverse/AssetManager.cs +++ b/OpenMetaverse/AssetManager.cs @@ -218,7 +218,7 @@ namespace OpenMetaverse { public UUID ID; public int Size; - public byte[] AssetData = new byte[0]; + public byte[] AssetData = Utils.EmptyBytes; public int Transferred; public bool Success; public AssetType AssetType; @@ -235,7 +235,7 @@ namespace OpenMetaverse public Transfer() { - AssetData = new byte[0]; + AssetData = Utils.EmptyBytes; transferStart = Environment.TickCount; } } @@ -867,7 +867,7 @@ namespace OpenMetaverse upload.ID.ToString(), upload.AssetID.ToString(), upload.Size), Helpers.LogLevel.Info, Client); // Asset is too big, send in multiple packets - request.AssetBlock.AssetData = new byte[0]; + request.AssetBlock.AssetData = Utils.EmptyBytes; } // Wait for the previous upload to receive a RequestXferPacket diff --git a/OpenMetaverse/FriendsManager.cs b/OpenMetaverse/FriendsManager.cs index ea490564..c3d5022b 100644 --- a/OpenMetaverse/FriendsManager.cs +++ b/OpenMetaverse/FriendsManager.cs @@ -403,7 +403,7 @@ namespace OpenMetaverse InstantMessageOnline.Online, Client.Self.SimPosition, Client.Network.CurrentSim.ID, - new byte[0]); + Utils.EmptyBytes); } diff --git a/OpenMetaverse/GroupManager.cs b/OpenMetaverse/GroupManager.cs index 08de49cc..239f4465 100644 --- a/OpenMetaverse/GroupManager.cs +++ b/OpenMetaverse/GroupManager.cs @@ -235,7 +235,7 @@ namespace OpenMetaverse public byte[] SerializeAttachment() { if (OwnerID == UUID.Zero || AttachmentID == UUID.Zero) - return new byte[0]; + return Utils.EmptyBytes; OpenMetaverse.StructuredData.OSDMap att = new OpenMetaverse.StructuredData.OSDMap(); att.Add("item_id", OpenMetaverse.StructuredData.OSD.FromUUID(AttachmentID)); diff --git a/OpenMetaverse/InventoryManager.cs b/OpenMetaverse/InventoryManager.cs index 91cbeb22..f4f99146 100644 --- a/OpenMetaverse/InventoryManager.cs +++ b/OpenMetaverse/InventoryManager.cs @@ -1621,7 +1621,7 @@ namespace OpenMetaverse MoveInventoryItemPacket.InventoryDataBlock block = new MoveInventoryItemPacket.InventoryDataBlock(); block.ItemID = entry.Key; block.FolderID = entry.Value; - block.NewName = new byte[0]; + block.NewName = Utils.EmptyBytes; move.InventoryData[index++] = block; } @@ -2020,7 +2020,7 @@ namespace OpenMetaverse if (newNames != null && !String.IsNullOrEmpty(newNames[i])) copy.InventoryData[i].NewName = Utils.StringToBytes(newNames[i]); else - copy.InventoryData[i].NewName = new byte[0]; + copy.InventoryData[i].NewName = Utils.EmptyBytes; } _Client.Network.SendPacket(copy); @@ -3614,7 +3614,7 @@ namespace OpenMetaverse imp.MessageBlock.ID = im.IMSessionID; imp.MessageBlock.Timestamp = 0; imp.MessageBlock.FromAgentName = Utils.StringToBytes(_Client.Self.Name); - imp.MessageBlock.Message = new byte[0]; + imp.MessageBlock.Message = Utils.EmptyBytes; imp.MessageBlock.ParentEstateID = 0; imp.MessageBlock.RegionID = UUID.Zero; imp.MessageBlock.Position = _Client.Self.SimPosition; @@ -3653,7 +3653,7 @@ namespace OpenMetaverse break; } - imp.MessageBlock.BinaryBucket = new byte[0]; + imp.MessageBlock.BinaryBucket = Utils.EmptyBytes; } _Client.Network.SendPacket(imp, simulator); diff --git a/OpenMetaverse/ObjectManager.cs b/OpenMetaverse/ObjectManager.cs index 19cc4c05..87efa3fb 100644 --- a/OpenMetaverse/ObjectManager.cs +++ b/OpenMetaverse/ObjectManager.cs @@ -871,7 +871,7 @@ namespace OpenMetaverse extra.ObjectData[0].ObjectLocalID = localID; extra.ObjectData[0].ParamType = (byte)type; extra.ObjectData[0].ParamInUse = false; - extra.ObjectData[0].ParamData = new byte[0]; + extra.ObjectData[0].ParamData = Utils.EmptyBytes; extra.ObjectData[0].ParamSize = 0; Client.Network.SendPacket(extra, simulator); diff --git a/OpenMetaverse/ParcelManager.cs b/OpenMetaverse/ParcelManager.cs index f0586d80..0d14df0e 100644 --- a/OpenMetaverse/ParcelManager.cs +++ b/OpenMetaverse/ParcelManager.cs @@ -558,7 +558,7 @@ namespace OpenMetaverse RentPrice = 0; AABBMin = Vector3.Zero; AABBMax = Vector3.Zero; - Bitmap = new byte[0]; + Bitmap = Utils.EmptyBytes; Area = 0; Status = ParcelStatus.None; SimWideMaxPrims = 0; @@ -612,7 +612,7 @@ namespace OpenMetaverse body["auto_scale"] = OSD.FromInteger(this.Media.MediaAutoScale); body["category"] = OSD.FromInteger((byte)this.Category); body["description"] = OSD.FromString(this.Desc); - body["flags"] = OSD.FromBinary(new byte[0]); + body["flags"] = OSD.FromBinary(Utils.EmptyBytes); body["group_id"] = OSD.FromUUID(this.GroupID); body["landing_type"] = OSD.FromInteger((byte)this.Landing); body["local_id"] = OSD.FromInteger(this.LocalID); diff --git a/OpenMetaverse/Primitives/TextureEntry.cs b/OpenMetaverse/Primitives/TextureEntry.cs index 8534744c..7a1cbac2 100644 --- a/OpenMetaverse/Primitives/TextureEntry.cs +++ b/OpenMetaverse/Primitives/TextureEntry.cs @@ -845,7 +845,7 @@ namespace OpenMetaverse public byte[] ToBytes() { if (DefaultTexture == null) - return new byte[0]; + return Utils.EmptyBytes; MemoryStream memStream = new MemoryStream(); BinaryWriter binWriter = new BinaryWriter(memStream); diff --git a/OpenMetaverse/Types/CRC32.cs b/OpenMetaverse/Types/CRC32.cs new file mode 100644 index 00000000..f8211fd5 --- /dev/null +++ b/OpenMetaverse/Types/CRC32.cs @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2009, openmetaverse.org + * All rights reserved. + * + * - Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * - Neither the name of the openmetaverse.org nor the names + * of its contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +using System; + +namespace OpenMetaverse +{ + public class CRC32 + { + #region CRC table for polynomial 0xEDB88320 + + static readonly uint[] crcTable = new uint[] { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + }; + + #endregion CRC table for polynomial 0xEDB88320 + + public uint CRC; + + public CRC32() + { + CRC = 0xffffffff; + } + + public void Update(byte value) + { + CRC = crcTable[(CRC ^ value) & 0xff] ^ (CRC >> 8); + } + + public void Update(byte[] value, int pos, int length) + { + for (int i = pos; i < length; i++) + CRC = crcTable[(CRC ^ value[i]) & 0xff] ^ (CRC >> 8); + } + } +} diff --git a/OpenMetaverse/Types/Quaternion.cs b/OpenMetaverse/Types/Quaternion.cs index e6d78e23..2fd28c2e 100644 --- a/OpenMetaverse/Types/Quaternion.cs +++ b/OpenMetaverse/Types/Quaternion.cs @@ -197,9 +197,7 @@ namespace OpenMetaverse public byte[] GetBytes() { byte[] bytes = new byte[12]; - float norm; - - norm = (float)Math.Sqrt(X * X + Y * Y + Z * Z + W * W); + float norm = (float)Math.Sqrt(X * X + Y * Y + Z * Z + W * W); if (norm != 0f) { @@ -235,6 +233,48 @@ namespace OpenMetaverse return bytes; } + /// + /// Writes the raw bytes for this quaternion to a byte array + /// + /// Destination byte array + /// Position in the destination array to start + /// writing. Must be at least 12 bytes before the end of the array + public void ToBytes(byte[] dest, int pos) + { + float norm = (float)Math.Sqrt(X * X + Y * Y + Z * Z + W * W); + + if (norm != 0f) + { + norm = 1f / norm; + + float x, y, z; + if (W >= 0f) + { + x = X; y = Y; z = Z; + } + else + { + x = -X; y = -Y; z = -Z; + } + + Buffer.BlockCopy(BitConverter.GetBytes(norm * x), 0, dest, pos + 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(norm * y), 0, dest, pos + 4, 4); + Buffer.BlockCopy(BitConverter.GetBytes(norm * z), 0, dest, pos + 8, 4); + + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(dest, pos + 0, 4); + Array.Reverse(dest, pos + 4, 4); + Array.Reverse(dest, pos + 8, 4); + } + } + else + { + throw new InvalidOperationException(String.Format( + "Quaternion {0} normalized to zero", ToString())); + } + } + /// /// Convert this quaternion to euler angles /// diff --git a/OpenMetaverse/Types/Utils.cs b/OpenMetaverse/Types/Utils.cs index 2481873c..35003d38 100644 --- a/OpenMetaverse/Types/Utils.cs +++ b/OpenMetaverse/Types/Utils.cs @@ -80,6 +80,8 @@ namespace OpenMetaverse /// UNIX epoch in DateTime format public static readonly DateTime Epoch = new DateTime(1970, 1, 1); + public static readonly byte[] EmptyBytes = Utils.EmptyBytes; + /// Provide a single instance of the MD5 class to avoid making /// duplicate copies and handle thread safety private static readonly System.Security.Cryptography.MD5 MD5Builder = diff --git a/OpenMetaverse/Types/UtilsConversions.cs b/OpenMetaverse/Types/UtilsConversions.cs index b86efd14..7ed83806 100644 --- a/OpenMetaverse/Types/UtilsConversions.cs +++ b/OpenMetaverse/Types/UtilsConversions.cs @@ -468,7 +468,7 @@ namespace OpenMetaverse /// A null-terminated UTF8 byte array public static byte[] StringToBytes(string str) { - if (String.IsNullOrEmpty(str)) { return new byte[0]; } + if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; } if (!str.EndsWith("\0")) { str += "\0"; } return System.Text.UTF8Encoding.UTF8.GetBytes(str); } @@ -485,7 +485,7 @@ namespace OpenMetaverse if (handleDirty) { if (String.IsNullOrEmpty(hexString)) - return new byte[0]; + return Utils.EmptyBytes; StringBuilder stripped = new StringBuilder(hexString.Length); char c; diff --git a/OpenMetaverse/Types/Vector2.cs b/OpenMetaverse/Types/Vector2.cs index 5506f170..efcc8f77 100644 --- a/OpenMetaverse/Types/Vector2.cs +++ b/OpenMetaverse/Types/Vector2.cs @@ -145,6 +145,24 @@ namespace OpenMetaverse return byteArray; } + /// + /// Writes the raw bytes for this vector to a byte array + /// + /// Destination byte array + /// Position in the destination array to start + /// writing. Must be at least 8 bytes before the end of the array + public void ToBytes(byte[] dest, int pos) + { + Buffer.BlockCopy(BitConverter.GetBytes(X), 0, dest, pos + 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, dest, pos + 4, 4); + + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(dest, pos + 0, 4); + Array.Reverse(dest, pos + 4, 4); + } + } + public float Length() { return (float)Math.Sqrt(DistanceSquared(this, Zero)); diff --git a/OpenMetaverse/Types/Vector3.cs b/OpenMetaverse/Types/Vector3.cs index 01005040..69a234b3 100644 --- a/OpenMetaverse/Types/Vector3.cs +++ b/OpenMetaverse/Types/Vector3.cs @@ -195,6 +195,26 @@ namespace OpenMetaverse return byteArray; } + /// + /// Writes the raw bytes for this vector to a byte array + /// + /// Destination byte array + /// Position in the destination array to start + /// writing. Must be at least 12 bytes before the end of the array + public void ToBytes(byte[] dest, int pos) + { + Buffer.BlockCopy(BitConverter.GetBytes(X), 0, dest, pos + 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, dest, pos + 4, 4); + Buffer.BlockCopy(BitConverter.GetBytes(Z), 0, dest, pos + 8, 4); + + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(dest, pos + 0, 4); + Array.Reverse(dest, pos + 4, 4); + Array.Reverse(dest, pos + 8, 4); + } + } + #endregion Public Methods #region Static Methods diff --git a/OpenMetaverse/Types/Vector3d.cs b/OpenMetaverse/Types/Vector3d.cs index fb6164e7..74f844ff 100644 --- a/OpenMetaverse/Types/Vector3d.cs +++ b/OpenMetaverse/Types/Vector3d.cs @@ -188,6 +188,26 @@ namespace OpenMetaverse return byteArray; } + /// + /// Writes the raw bytes for this vector to a byte array + /// + /// Destination byte array + /// Position in the destination array to start + /// writing. Must be at least 24 bytes before the end of the array + public void ToBytes(byte[] dest, int pos) + { + Buffer.BlockCopy(BitConverter.GetBytes(X), 0, dest, pos + 0, 8); + Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, dest, pos + 8, 8); + Buffer.BlockCopy(BitConverter.GetBytes(Z), 0, dest, pos + 16, 8); + + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(dest, pos + 0, 8); + Array.Reverse(dest, pos + 8, 8); + Array.Reverse(dest, pos + 16, 8); + } + } + #endregion Public Methods #region Static Methods diff --git a/OpenMetaverse/Types/Vector4.cs b/OpenMetaverse/Types/Vector4.cs index 2e85cbed..551a630a 100644 --- a/OpenMetaverse/Types/Vector4.cs +++ b/OpenMetaverse/Types/Vector4.cs @@ -204,6 +204,28 @@ namespace OpenMetaverse return byteArray; } + /// + /// Writes the raw bytes for this vector to a byte array + /// + /// Destination byte array + /// Position in the destination array to start + /// writing. Must be at least 16 bytes before the end of the array + public void ToBytes(byte[] dest, int pos) + { + Buffer.BlockCopy(BitConverter.GetBytes(X), 0, dest, pos + 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, dest, pos + 4, 4); + Buffer.BlockCopy(BitConverter.GetBytes(Z), 0, dest, pos + 8, 4); + Buffer.BlockCopy(BitConverter.GetBytes(W), 0, dest, pos + 12, 4); + + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(dest, pos + 0, 4); + Array.Reverse(dest, pos + 4, 4); + Array.Reverse(dest, pos + 8, 4); + Array.Reverse(dest, pos + 12, 4); + } + } + #endregion Public Methods #region Static Methods diff --git a/Programs/SimExport/OarFile.cs b/Programs/SimExport/OarFile.cs index 1a5a42c5..aafe4d1f 100644 --- a/Programs/SimExport/OarFile.cs +++ b/Programs/SimExport/OarFile.cs @@ -204,7 +204,7 @@ namespace SimExport if (prim.Textures != null) te = prim.Textures.ToBytes(); else - te = new byte[0]; + te = Utils.EmptyBytes; writer.WriteBase64(te, 0, te.Length); writer.WriteEndElement(); diff --git a/Programs/examples/GridAccountant/frmGridAccountant.cs b/Programs/examples/GridAccountant/frmGridAccountant.cs index 5d6e632a..b1262934 100644 --- a/Programs/examples/GridAccountant/frmGridAccountant.cs +++ b/Programs/examples/GridAccountant/frmGridAccountant.cs @@ -423,7 +423,7 @@ namespace GridAccountant appearance.AgentData.SessionID = Client.Self.SessionID; appearance.AgentData.SerialNum = 1; appearance.AgentData.Size = new Vector3(0.45F, 0.6F, 1.831094F); - appearance.ObjectData.TextureEntry = new byte[0]; + appearance.ObjectData.TextureEntry = Utils.EmptyBytes; Client.Network.SendPacket(appearance); diff --git a/bin/Simian.ini b/bin/Simian.ini index f3a231fe..1efb4c59 100644 --- a/bin/Simian.ini +++ b/bin/Simian.ini @@ -83,6 +83,10 @@ RenderingPluginMesher ; or prim-prim collisions. Movement +; A simple physics engine with good (but slow) implementations of the +; interfaces. +PhysicsSimple + ; Physics engine provided by the Open Dynamics Engine library. Work in progress, ; not functional yet. ;PhysicsODE diff --git a/prebuild.xml b/prebuild.xml index 28397d54..930c2634 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -182,6 +182,7 @@ +