diff --git a/OpenMetaverse/AssetTypes.cs b/OpenMetaverse/AssetTypes.cs
index 8f194158..7caba619 100644
--- a/OpenMetaverse/AssetTypes.cs
+++ b/OpenMetaverse/AssetTypes.cs
@@ -310,6 +310,7 @@ namespace OpenMetaverse
Permissions = new Permissions();
string data = Utils.BytesToString(AssetData);
+ data = data.Replace("\r", String.Empty);
string[] lines = data.Split('\n');
for (int stri = 0; stri < lines.Length; stri++)
{
diff --git a/Programs/Simian/Extensions/AssetManager.cs b/Programs/Simian/Extensions/AssetManager.cs
index 8cf2406a..c526033a 100644
--- a/Programs/Simian/Extensions/AssetManager.cs
+++ b/Programs/Simian/Extensions/AssetManager.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using OpenMetaverse;
using OpenMetaverse.Imaging;
using OpenMetaverse.Packets;
@@ -18,6 +19,8 @@ namespace Simian.Extensions
public void Start()
{
+ LoadDefaultAssets(Server.DataDir);
+
Server.UDPServer.RegisterPacketCallback(PacketType.AssetUploadRequest, new UDPServer.PacketCallback(AssetUploadRequestHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.SendXferPacket, new UDPServer.PacketCallback(SendXferPacketHandler));
Server.UDPServer.RegisterPacketCallback(PacketType.AbortXfer, new UDPServer.PacketCallback(AbortXferHandler));
@@ -203,22 +206,8 @@ namespace Simian.Extensions
// Check if we have this asset
Asset asset;
- if (Server.AssetStore.TryGetValue(assetID, out asset) || true /* HACK */)
+ if (Server.AssetStore.TryGetValue(assetID, out asset))
{
- // HACK: Always return some clothing to get avatars appearing for now
- if (asset == null)
- {
- asset = CreateAsset(type, assetID, System.IO.File.ReadAllBytes("testclothing.txt"));
- if (asset == null)
- {
- response.TransferInfo.Size = 0;
- response.TransferInfo.Status = (int)StatusCode.UnknownSource;
- response.TransferInfo.TargetType = (int)TargetType.Unknown;
- agent.SendPacket(response);
- }
- }
- // END HACK
-
if (asset.AssetType == type)
{
Logger.DebugLog(String.Format("Transferring asset {0} ({1})", asset.AssetID, asset.AssetType));
@@ -356,5 +345,53 @@ namespace Simian.Extensions
return null;
}
}
+
+ void LoadDefaultAssets(string path)
+ {
+ string[] textures = Directory.GetFiles(path, "*.jp2", SearchOption.TopDirectoryOnly);
+ string[] clothing = Directory.GetFiles(path, "*.clothing", SearchOption.TopDirectoryOnly);
+ string[] bodyparts = Directory.GetFiles(path, "*.bodypart", SearchOption.TopDirectoryOnly);
+
+ for (int i = 0; i < textures.Length; i++)
+ {
+ UUID assetID = ParseUUIDFromFilename(textures[i]);
+ AssetTexture item = new AssetTexture(assetID, File.ReadAllBytes(textures[i]));
+ Server.AssetStore[assetID] = item;
+ }
+
+ for (int i = 0; i < clothing.Length; i++)
+ {
+ UUID assetID = ParseUUIDFromFilename(clothing[i]);
+ AssetClothing item = new AssetClothing(assetID, File.ReadAllBytes(clothing[i]));
+ item.Decode();
+ Server.AssetStore[assetID] = item;
+ }
+
+ for (int i = 0; i < bodyparts.Length; i++)
+ {
+ UUID assetID = ParseUUIDFromFilename(bodyparts[i]);
+ AssetBodypart item = new AssetBodypart(assetID, File.ReadAllBytes(bodyparts[i]));
+ item.Decode();
+ Server.AssetStore[assetID] = item;
+ }
+ }
+
+ static UUID ParseUUIDFromFilename(string filename)
+ {
+ int dot = filename.LastIndexOf('.');
+
+ if (dot > 35)
+ {
+ // Grab the last 36 characters of the filename
+ string uuidString = filename.Substring(dot - 36, 36);
+ UUID uuid;
+ UUID.TryParse(uuidString, out uuid);
+ return uuid;
+ }
+ else
+ {
+ return UUID.Zero;
+ }
+ }
}
}
diff --git a/Programs/Simian/Extensions/AvatarManager.cs b/Programs/Simian/Extensions/AvatarManager.cs
index dfb1bd59..6cc2ee18 100644
--- a/Programs/Simian/Extensions/AvatarManager.cs
+++ b/Programs/Simian/Extensions/AvatarManager.cs
@@ -68,17 +68,33 @@ namespace Simian.Extensions
// Technically this should be per-agent, but if the only requirement is that it
// increments this is easier
update.AgentData.SerialNum = (uint)Interlocked.Increment(ref currentWearablesSerialNum);
- update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
- for (int i = 0; i < 13; i++)
- {
- update.WearableData[i] = new AgentWearablesUpdatePacket.WearableDataBlock();
- update.WearableData[i].AssetID = UUID.Random();
- update.WearableData[i].ItemID = UUID.Random();
- update.WearableData[i].WearableType = (byte)i;
- }
+ update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[5];
- //HACK
- //update.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[0];
+ // TODO: These are hardcoded in for now, should change that
+ update.WearableData[0] = new AgentWearablesUpdatePacket.WearableDataBlock();
+ update.WearableData[0].AssetID = new UUID("dc675529-7ba5-4976-b91d-dcb9e5e36188");
+ update.WearableData[0].ItemID = UUID.Random();
+ update.WearableData[0].WearableType = (byte)WearableType.Hair;
+
+ update.WearableData[1] = new AgentWearablesUpdatePacket.WearableDataBlock();
+ update.WearableData[1].AssetID = new UUID("3e8ee2d6-4f21-4a55-832d-77daa505edff");
+ update.WearableData[1].ItemID = UUID.Random();
+ update.WearableData[1].WearableType = (byte)WearableType.Pants;
+
+ update.WearableData[2] = new AgentWearablesUpdatePacket.WearableDataBlock();
+ update.WearableData[2].AssetID = new UUID("530a2614-052e-49a2-af0e-534bb3c05af0");
+ update.WearableData[2].ItemID = UUID.Random();
+ update.WearableData[2].WearableType = (byte)WearableType.Shape;
+
+ update.WearableData[3] = new AgentWearablesUpdatePacket.WearableDataBlock();
+ update.WearableData[3].AssetID = new UUID("6a714f37-fe53-4230-b46f-8db384465981");
+ update.WearableData[3].ItemID = UUID.Random();
+ update.WearableData[3].WearableType = (byte)WearableType.Shirt;
+
+ update.WearableData[4] = new AgentWearablesUpdatePacket.WearableDataBlock();
+ update.WearableData[4].AssetID = new UUID("5f787f25-f761-4a35-9764-6418ee4774c4");
+ update.WearableData[4].ItemID = UUID.Random();
+ update.WearableData[4].WearableType = (byte)WearableType.Skin;
agent.SendPacket(update);
}
diff --git a/Programs/Simian/Extensions/SceneManager.cs b/Programs/Simian/Extensions/SceneManager.cs
index 901619b5..54444133 100644
--- a/Programs/Simian/Extensions/SceneManager.cs
+++ b/Programs/Simian/Extensions/SceneManager.cs
@@ -24,7 +24,7 @@ namespace Simian.Extensions
public void Start()
{
server.UDPServer.RegisterPacketCallback(PacketType.CompleteAgentMovement, new UDPServer.PacketCallback(CompleteAgentMovementHandler));
- LoadTerrain("Maps/default.tga");
+ LoadTerrain(server.DataDir + "heightmap.tga");
}
public void Stop()
diff --git a/Programs/Simian/InventoryDefinitions.cs b/Programs/Simian/InventoryDefinitions.cs
index 23e69a11..6de74956 100644
--- a/Programs/Simian/InventoryDefinitions.cs
+++ b/Programs/Simian/InventoryDefinitions.cs
@@ -80,21 +80,7 @@ namespace Simian
return false;
InventoryItem o = (InventoryItem)obj;
- return o.ID == ID
- && o.ParentID == ParentID
- && o.Name == Name
- && o.OwnerID == OwnerID
- && o.AssetType == AssetType
- && o.AssetID == AssetID
- && o.CreationDate == CreationDate
- && o.Description == Description
- && o.Flags == Flags
- && o.GroupID == GroupID
- && o.GroupOwned == GroupOwned
- && o.InventoryType == InventoryType
- && o.Permissions.Equals(Permissions)
- && o.SalePrice == SalePrice
- && o.SaleType == SaleType;
+ return o.ID == ID;
}
public static bool operator ==(InventoryItem lhs, InventoryItem rhs)
@@ -106,154 +92,6 @@ namespace Simian
{
return !(lhs == rhs);
}
-
- ///
- /// Returns the InventoryItem in the hierarchical bracket format
- /// used in the Second Life client's notecards and inventory cache.
- ///
- /// a string representation of this InventoryItem
- public override string ToString()
- {
- StringWriter writer = new StringWriter();
- ToString(writer);
- return writer.ToString();
- }
-
- ///
- /// Writes the inventory item to the TextWriter in the hierarchical bracket format
- /// used in the Second Life client's notecards and inventory cache.
- ///
- /// Writer to write to.
- public void ToString(TextWriter writer)
- {
- writer.WriteLine("inv_item\t0");
- writer.WriteLine('{');
- writer.WriteLine("\titem_id\t{0}", ID.ToString());
- writer.WriteLine("\tparent_id\t{0}", ParentID.ToString());
- // Permissions:
- writer.WriteLine("permissions\t0");
- writer.WriteLine('{');
- writer.WriteLine("\tbase_mask\t{0}", String.Format("{0:x}", (uint)Permissions.BaseMask).PadLeft(8, '0'));
- writer.WriteLine("\towner_mask\t{0}", String.Format("{0:x}", (uint)Permissions.OwnerMask).PadLeft(8, '0'));
- writer.WriteLine("\tgroup_mask\t{0}", String.Format("{0:x}", (uint)Permissions.GroupMask).PadLeft(8, '0'));
- writer.WriteLine("\teveryone_mask\t{0}", String.Format("{0:x}", (uint)Permissions.EveryoneMask).PadLeft(8, '0'));
- writer.WriteLine("\tnext_owner_mask\t{0}", String.Format("{0:x}", (uint)Permissions.NextOwnerMask).PadLeft(8, '0'));
- writer.WriteLine("\tcreator_id\t{0}", CreatorID.ToString());
- writer.WriteLine("\towner_id\t{0}", OwnerID.ToString());
- writer.WriteLine("\tlast_owner_id\t{0}", UUID.Zero); // FIXME?
- writer.WriteLine("\tgroup_id\t{0}", GroupID.ToString());
- writer.WriteLine('}');
-
- writer.WriteLine("\tasset_id\t{0}", AssetID.ToString());
- writer.WriteLine("\ttype\t{0}", AssetTypeParser.StringValueOf(AssetType));
- writer.WriteLine("\tinv_type\t{0}", InventoryTypeParser.StringValueOf(InventoryType));
- writer.WriteLine("\tflags\t{0}", string.Format("{0:x}", Flags).PadLeft(8, '0'));
-
- // Sale info:
- writer.WriteLine("sale_info\t0");
- writer.WriteLine('{');
- writer.WriteLine("\tsale_type\t{0}", SaleTypeParser.StringValueOf(SaleType));
- writer.WriteLine("\tsale_price\t{0}", SalePrice);
- writer.WriteLine('}');
-
- writer.WriteLine("\tname\t{0}|", Name);
- writer.WriteLine("\tdesc\t{0}|", Description);
- writer.WriteLine("\tcreation_date\t{0}", Utils.DateTimeToUnixTime(CreationDate));
- writer.WriteLine('}');
- }
-
- ///
- /// Reads the InventoryItem from a string source. The string is wrapped
- /// in a and passed to the
- /// other method.
- ///
- /// String to parse InventoryItem from.
- /// Parsed InventoryItem
- public static InventoryItem Parse(string src)
- {
- return Parse(new StringReader(src));
- }
-
- ///
- /// Reads an InventoryItem from a TextReader source. The format of the text
- /// should be the same as the one used by Second Life Notecards. The TextReader should
- /// be placed ideally on the line containing "inv_item" but parsing will succeed as long
- /// as it is before the opening bracket immediately following the inv_item line.
- /// The TextReader will be placed on the line following the inv_item's closing bracket.
- ///
- /// text source
- /// Parsed item.
- public static InventoryItem Parse(TextReader reader)
- {
- InventoryItem item = new InventoryItem();
- #region Parsing
- TextData invItem = TextHierarchyParser.Parse(reader);
- Console.WriteLine(invItem);
- //if (invItem.Name == "inv_item") // YAY
- item.ID = new UUID(invItem.Nested["item_id"].Value);
- item.ParentID = new UUID(invItem.Nested["parent_id"].Value);
- item.AssetID = new UUID(invItem.Nested["asset_id"].Value);
- item.AssetType = AssetTypeParser.Parse(invItem.Nested["type"].Value);
- item.InventoryType = InventoryTypeParser.Parse(invItem.Nested["inv_type"].Value);
- Utils.TryParseHex(invItem.Nested["flags"].Value, out item.Flags);
- string rawName = invItem.Nested["name"].Value;
- item.Name = rawName.Substring(0, rawName.LastIndexOf('|'));
- string rawDesc = invItem.Nested["desc"].Value;
- item.Description = rawDesc.Substring(0, rawDesc.LastIndexOf('|'));
- item.CreationDate = Utils.UnixTimeToDateTime(uint.Parse(invItem.Nested["creation_date"].Value));
-
- // Sale info:
- TextData saleInfo = invItem.Nested["sale_info"];
- item.SalePrice = int.Parse(saleInfo.Nested["sale_price"].Value);
- item.SaleType = SaleTypeParser.Parse(saleInfo.Nested["sale_type"].Value);
-
- TextData permissions = invItem.Nested["permissions"];
- item.Permissions = new Permissions();
- item.Permissions.BaseMask = (PermissionMask)uint.Parse(permissions.Nested["base_mask"].Value, NumberStyles.HexNumber);
- item.Permissions.EveryoneMask = (PermissionMask)uint.Parse(permissions.Nested["everyone_mask"].Value, NumberStyles.HexNumber);
- item.Permissions.GroupMask = (PermissionMask)uint.Parse(permissions.Nested["group_mask"].Value, NumberStyles.HexNumber);
- item.Permissions.OwnerMask = (PermissionMask)uint.Parse(permissions.Nested["owner_mask"].Value, NumberStyles.HexNumber);
- item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(permissions.Nested["next_owner_mask"].Value, NumberStyles.HexNumber);
- item.CreatorID = new UUID(permissions.Nested["creator_id"].Value);
- item.OwnerID = new UUID(permissions.Nested["owner_id"].Value);
- item.GroupID = new UUID(permissions.Nested["group_id"].Value);
- // permissions.Nested["last_owner_id"] // FIXME?
- #endregion
- return item;
- }
-
- ///
- ///
- ///
- /// String to parse from
- /// Parsed InventoryItem
- /// true if successful, false otherwise.
- public static bool TryParse(string str, out InventoryItem item)
- {
- return TryParse(new StringReader(str), out item);
- }
-
- ///
- ///
- ///
- /// Text source.
- /// Parsed InventoryItem.
- /// true if successful false otherwise.
- public static bool TryParse(TextReader reader, out InventoryItem item)
- {
- try
- {
- item = Parse(reader);
- }
- catch (Exception e)
- {
- item = new InventoryItem();
- Logger.Log(e.Message, Helpers.LogLevel.Error, e);
- return false;
- }
-
- return true;
- }
}
///
@@ -286,98 +124,6 @@ namespace Simian
{
return !(lhs == rhs);
}
-
- ///
- /// Returns the InventoryFolder in the hierarchical bracket format
- /// used in the Second Life client's notecards and inventory cache.
- ///
- /// a string representation of this InventoryFolder
- public override string ToString()
- {
- StringWriter writer = new StringWriter();
- ToString(writer);
- return writer.ToString();
- }
-
- ///
- /// Writes the InventoryFolder to the TextWriter in the hierarchical bracket format
- /// used in the Second Life client's notecards and inventory cache.
- ///
- /// Writer to write to.
- public void ToString(TextWriter writer)
- {
- writer.WriteLine("inv_category\t0");
- writer.WriteLine('{');
- writer.WriteLine("\tcat_id\t{0}", ID.ToString());
- writer.WriteLine("\tparent_id\t{0}", ParentID.ToString());
- writer.WriteLine("\ttype\tcategory");
- // TODO: Some folders have "-1" as their perf_type, investigate this.
- writer.WriteLine("\tpref_type\t{0}", AssetTypeParser.StringValueOf(PreferredType));
- writer.WriteLine("\tname\t{0}|", Name);
- writer.WriteLine("\towner_id\t{0}", OwnerID.ToString());
- writer.WriteLine("\tversion\t{0}", Version);
- writer.WriteLine('}');
- }
-
- ///
- /// Reads the InventoryFolder from a string source. The string is wrapped
- /// in a and passed to the
- /// other method.
- ///
- /// String to parse InventoryFolder from.
- /// Parsed InventoryFolder
- public static InventoryFolder Parse(string src)
- {
- return Parse(new StringReader(src));
- }
-
- ///
- /// Reads an InventoryItem from a TextReader source. The format of the text
- /// should be the same as the one used by Second Life Notecards. The TextReader should
- /// be placed ideally on the line containing "inv_category" but parsing will succeed as long
- /// as it is before the opening bracket immediately following the inv_category line.
- /// The TextReader will be placed on the line following the inv_category's closing bracket.
- ///
- /// text source
- /// Parsed item.
- public static InventoryFolder Parse(TextReader reader)
- {
- InventoryFolder folder = new InventoryFolder();
- #region Parsing
- TextData invCategory = TextHierarchyParser.Parse(reader);
-
- //if (invCategory.Name == "inv_category") // YAY
- folder.ID = new UUID(invCategory.Nested["cat_id"].Value);
- string rawName = invCategory.Nested["name"].Value;
- folder.Name = rawName.Substring(0, rawName.LastIndexOf('|'));
- folder.OwnerID = new UUID(invCategory.Nested["owner_id"].Value);
- folder.ParentID = new UUID(invCategory.Nested["parent_id"].Value);
- folder.PreferredType = AssetTypeParser.Parse(invCategory.Nested["pref_type"].Value);
- folder.Version = int.Parse(invCategory.Nested["version"].Value);
- // TODO: Investigate invCategory.Nested["type"]
- #endregion
- return folder;
- }
-
- public static bool TryParse(string str, out InventoryFolder folder)
- {
- return TryParse(new StringReader(str), out folder);
- }
-
- public static bool TryParse(TextReader reader, out InventoryFolder folder)
- {
- try
- {
- folder = Parse(reader);
- }
- catch (Exception e)
- {
- folder = new InventoryFolder();
- Logger.Log(e.Message, Helpers.LogLevel.Error, e);
- return false;
- }
- return true;
- }
}
#endregion Inventory Item Containers
diff --git a/Programs/Simian/Simian.cs b/Programs/Simian/Simian.cs
index ef6a3616..abc5ae7e 100644
--- a/Programs/Simian/Simian.cs
+++ b/Programs/Simian/Simian.cs
@@ -13,6 +13,8 @@ namespace Simian
{
public partial class Simian
{
+ public string DataDir = "SimianData/";
+
public HttpServer HttpServer;
public UDPServer UDPServer;
public Dictionary SceneObjects = new Dictionary();
@@ -296,11 +298,11 @@ namespace Simian
response.HomePosition = new Vector3(128f, 128f, 25f);
response.HomeRegion = Helpers.UIntsToLong(regionX, regionY);
response.InventoryRoot = agent.InventoryRoot;
- response.InventoryFolders = null;
+ response.InventorySkeleton = null;
response.LastName = agent.LastName;
response.LibraryOwner = response.AgentID;
response.LibraryRoot = agent.InventoryLibRoot;
- response.LibraryFolders = null;
+ response.LibrarySkeleton = null;
response.LookAt = Vector3.UnitX;
response.Message = "Welcome to Simian";
response.Reason = String.Empty;
diff --git a/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart b/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart
new file mode 100644
index 00000000..e5377575
--- /dev/null
+++ b/bin/SimianData/default_hair-dc675529-7ba5-4976-b91d-dcb9e5e36188.bodypart
@@ -0,0 +1,63 @@
+LLWearable version 22
+Default Hair
+
+ permissions 0
+ {
+ base_mask 7fffffff
+ owner_mask 7fffffff
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00082000
+ creator_id 00000000-0000-0000-0000-000000000000
+ owner_id 00000000-0000-0000-0000-000000000000
+ last_owner_id 00000000-0000-0000-0000-000000000000
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 2
+parameters 39
+16 0
+31 .5
+112 0
+113 0
+114 .5
+115 0
+119 .5
+130 .45
+131 .5
+132 .39
+133 .25
+134 .5
+135 .55
+136 .5
+137 .5
+140 0
+141 0
+142 0
+143 .13
+166 0
+167 0
+168 0
+169 0
+177 0
+181 .14
+182 .7
+183 .05
+184 0
+192 0
+674 -.3
+750 .7
+752 .5
+754 0
+755 .05
+757 -1
+762 0
+763 .55
+785 0
+789 0
+textures 1
+4 7ca39b4c-bd19-4699-aff7-f93fd03d3e7b
diff --git a/bin/SimianData/testclothing.txt b/bin/SimianData/default_pants-3e8ee2d6-4f21-4a55-832d-77daa505edff.clothing
similarity index 100%
rename from bin/SimianData/testclothing.txt
rename to bin/SimianData/default_pants-3e8ee2d6-4f21-4a55-832d-77daa505edff.clothing
diff --git a/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart b/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart
new file mode 100644
index 00000000..e68d72e1
--- /dev/null
+++ b/bin/SimianData/default_shape-530a2614-052e-49a2-af0e-534bb3c05af0.bodypart
@@ -0,0 +1,105 @@
+LLWearable version 22
+Default Shape
+
+ permissions 0
+ {
+ base_mask 00000000
+ owner_mask 00000000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00000000
+ creator_id 00000000-0000-0000-0000-000000000000
+ owner_id 00000000-0000-0000-0000-000000000000
+ last_owner_id 00000000-0000-0000-0000-000000000000
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 0
+ }
+type 0
+parameters 82
+1 .21
+2 -.5
+4 -.11
+5 -.1
+6 -.3
+7 -.4
+8 -.5
+10 .7
+11 .34
+12 -.5
+13 0
+14 .04
+15 .58
+17 .56
+18 -.26
+19 -.73
+20 -.34
+21 -.01
+22 1
+23 -.5
+24 -.63
+25 .44
+27 .05
+33 -.24
+34 -.7
+35 -.16
+36 -.2
+37 -.98
+38 -.5
+80 0
+105 .07
+155 -.22
+157 0
+185 -1
+193 .86
+196 -.74
+505 .65
+506 .12
+507 -1.5
+515 0
+517 .16
+518 .8
+629 0
+637 0
+646 .4
+647 1
+649 .36
+650 .85
+652 .49
+653 -1
+656 0
+659 .65
+662 .5
+663 0
+664 0
+665 0
+675 -.15
+676 .26
+678 .28
+682 .27
+683 -.19
+684 -.09
+685 0
+690 .45
+692 .4
+693 -0
+753 -.5
+756 -.08
+758 .24
+759 .6
+760 .11
+764 -.38
+765 -.3
+769 .42
+773 .51
+795 .16
+796 .11
+799 .36
+841 0
+842 -.82
+879 0
+880 0
+textures 0
diff --git a/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing b/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing
new file mode 100644
index 00000000..fc9edbdc
--- /dev/null
+++ b/bin/SimianData/default_shirt-6a714f37-fe53-4230-b46f-8db384465981.clothing
@@ -0,0 +1,34 @@
+LLWearable version 22
+Default Shirt
+
+ permissions 0
+ {
+ base_mask 00000000
+ owner_mask 00000000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00000000
+ creator_id 00000000-0000-0000-0000-000000000000
+ owner_id 00000000-0000-0000-0000-000000000000
+ last_owner_id 00000000-0000-0000-0000-000000000000
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 4
+parameters 10
+781 .78
+800 .65
+801 .82
+802 .78
+803 .5
+804 .5
+805 .6
+828 0
+840 0
+868 0
+textures 1
+1 5748decc-f629-461c-9a36-a35a221fe21f
diff --git a/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart b/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart
new file mode 100644
index 00000000..bcd05117
--- /dev/null
+++ b/bin/SimianData/default_skin-5f787f25-f761-4a35-9764-6418ee4774c4.bodypart
@@ -0,0 +1,52 @@
+LLWearable version 22
+Default Skin
+
+ permissions 0
+ {
+ base_mask 00000000
+ owner_mask 00000000
+ group_mask 00000000
+ everyone_mask 00000000
+ next_owner_mask 00000000
+ creator_id 00000000-0000-0000-0000-000000000000
+ owner_id 00000000-0000-0000-0000-000000000000
+ last_owner_id 00000000-0000-0000-0000-000000000000
+ group_id 00000000-0000-0000-0000-000000000000
+ }
+ sale_info 0
+ {
+ sale_type not
+ sale_price 10
+ }
+type 1
+parameters 26
+108 0
+110 0
+111 0
+116 0
+117 1
+150 0
+162 0
+163 0
+165 0
+700 .01
+701 .5
+702 .26
+703 0
+704 0
+705 .5
+706 .6
+707 0
+708 0
+709 0
+710 0
+711 .5
+712 0
+713 .7
+714 0
+715 0
+775 0
+textures 3
+0 c4e3fbf4-55ef-4a06-8497-48d4dc993cbb
+5 e1a21d3f-7db4-4802-978f-4ace1bad8e7e
+6 9bebfaae-6de4-41c7-af5b-f6a3bd052ed3
diff --git a/bin/SimianData/default.tga b/bin/SimianData/heightmap.tga
similarity index 100%
rename from bin/SimianData/default.tga
rename to bin/SimianData/heightmap.tga