From c0a75fcc038c50047e7fe3739f7b53d0e1310b03 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 6 Oct 2014 00:17:41 +0100 Subject: [PATCH 1/6] fix targetOmega resend on deselect on the right place, can't be at sop but packethandlers --- OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 4 ++++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 46b2d2e222..931093a599 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -291,6 +291,10 @@ namespace OpenSim.Region.Framework.Scenes EventManager.TriggerParcelPrimCountTainted(); } + // restore targetOmega + if (part.AngularVelocity != Vector3.Zero) + part.ScheduleTerseUpdate(); + } public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3fc741c305..d5377d0016 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -666,8 +666,7 @@ namespace OpenSim.Region.Framework.Scenes m_isSelected = value; if (ParentGroup != null) ParentGroup.PartSelectChanged(value); - if (!m_isSelected && m_angularVelocity != Vector3.Zero) - ScheduleTerseUpdate(); + } } From 1a6ef2d60e4aff73e614ef45a0040c45316707f3 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Oct 2014 10:01:26 +0100 Subject: [PATCH 2/6] check for avatar skeleton data on meshs headers on cost estimation. Dont let a model have more than one mesh with skeleton, for testing create a mesh inventory item, for this meshs. Add also option to read a avatar collider replacement. This information still needs to be saved somewhere so it can be checked on attachment, etc, without parsing the mesh asset again. --- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 68 +++++++++++++++++-- .../Linden/Caps/BunchOfCaps/MeshCost.cs | 44 ++++++++++-- 2 files changed, 101 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 75634e01aa..3a070c3f9d 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.ClientStack.Linden string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, string assetType, int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload, ref string error); + bool IsAtestUpload, bool avatarSkeleton, bool avatarCollider, ref string error); public delegate UUID UpdateItem(UUID itemID, byte[] data); @@ -531,6 +531,8 @@ namespace OpenSim.Region.ClientStack.Linden int nreqmeshs= 0; int nreqinstances = 0; bool IsAtestUpload = false; + bool avatarSkeleton = false; + bool avatarCollider = false; string assetName = llsdRequest.name; @@ -580,8 +582,9 @@ namespace OpenSim.Region.ClientStack.Linden string error; int modelcost; + if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost, - meshcostdata, out error, ref warning)) + meshcostdata,out avatarSkeleton, out avatarCollider, out error, ref warning)) { LLSDAssetUploadError resperror = new LLSDAssetUploadError(); resperror.message = error; @@ -664,7 +667,7 @@ namespace OpenSim.Region.ClientStack.Linden AssetUploader uploader = new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost, - texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload); + texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload, avatarSkeleton, avatarCollider); m_HostCapsObj.HttpListener.AddStreamHandler( new BinaryStreamHandler( @@ -711,7 +714,7 @@ namespace OpenSim.Region.ClientStack.Linden UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, string assetType, int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload, ref string error) + bool IsAtestUpload,bool avatarSkeleton, bool avatarCollider, ref string error) { lock (m_ModelCost) @@ -877,12 +880,60 @@ namespace OpenSim.Region.ClientStack.Linden List meshAssets = new List(); for (int i = 0; i < mesh_list.Count; i++) { +/* + // do we really need this heavy thing? + OSD osd = OSDParser.DeserializeLLSDBinary(mesh_list[i]); + if (osd is OSDMap) + { + OSDMap mosd = (OSDMap)osd; + if (mosd.ContainsKey("skeleton")) + { + OSDMap skeleton = (OSDMap)mosd["skeleton"]; + int sksize = skeleton["size"].AsInteger(); + } + } +*/ + AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, creatorIDstr); meshAsset.Data = mesh_list[i].AsBinary(); if (istest) meshAsset.Local = true; m_assetService.Store(meshAsset); meshAssets.Add(meshAsset.FullID); + + + // test code + if (avatarSkeleton) + { + string name = assetName; + if (name.Length > 25) + name = name.Substring(0, 24); + name += "_Mesh#" + i.ToString(); + InventoryItemBase meshitem = new InventoryItemBase(); + meshitem.Owner = m_HostCapsObj.AgentID; + meshitem.CreatorId = creatorIDstr; + meshitem.CreatorData = String.Empty; + meshitem.ID = UUID.Random(); + meshitem.AssetID = meshAsset.FullID; + meshitem.Description = "mesh "; + meshitem.Name = name; + meshitem.AssetType = (int)AssetType.Mesh; + meshitem.InvType = (int)InventoryType.Mesh; + meshitem.Folder = UUID.Zero; // send to default + + // If we set PermissionMask.All then when we rez the item the next permissions will replace the current + // (owner) permissions. This becomes a problem if next permissions are changed. + meshitem.CurrentPermissions + = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); + + meshitem.BasePermissions = (uint)PermissionMask.All; + meshitem.EveryOnePermissions = 0; + meshitem.NextPermissions = (uint)PermissionMask.All; + meshitem.CreationDate = Util.UnixTimeSinceEpoch(); + + m_Scene.AddInventoryItem(client, meshitem); + meshitem = null; + } } int skipedMeshs = 0; @@ -1540,12 +1591,14 @@ namespace OpenSim.Region.ClientStack.Linden private int m_nreqmeshs; private int m_nreqinstances; private bool m_IsAtestUpload; + private bool m_avatarSkeleton; + private bool m_avatarCollider; public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolderID, string invType, string assetType, string path, IHttpServer httpServer, bool dumpAssetsToFile, int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload) + bool IsAtestUpload,bool avatarSkeleton, bool avatarCollider) { m_assetName = assetName; m_assetDes = description; @@ -1564,6 +1617,8 @@ namespace OpenSim.Region.ClientStack.Linden m_nreqmeshs = nreqmeshs; m_nreqinstances = nreqinstances; m_IsAtestUpload = IsAtestUpload; + m_avatarSkeleton = avatarSkeleton; + m_avatarCollider = avatarCollider; m_timeoutTimer.Elapsed += TimedOut; m_timeoutTimer.Interval = 120000; @@ -1608,7 +1663,8 @@ namespace OpenSim.Region.ClientStack.Linden if (handlerUpLoad != null) { handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType, - m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, ref m_error); + m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, + m_avatarSkeleton, m_avatarCollider, ref m_error); } if (m_IsAtestUpload) { diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs index 4a3fae6066..db6f9fd029 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs @@ -96,12 +96,18 @@ namespace OpenSim.Region.ClientStack.Linden // basicCost input region assets upload cost // totalcost returns model total upload fee // meshcostdata returns detailed costs for viewer - public bool MeshModelCost(LLSDAssetResource resources, int basicCost, out int totalcost, - LLSDAssetUploadResponseData meshcostdata, out string error, ref string warning) + // avatarSkeleton if mesh includes a avatar skeleton + // useAvatarCollider if we should use physics mesh for avatar + public bool MeshModelCost(LLSDAssetResource resources, int basicCost, out int totalcost, + LLSDAssetUploadResponseData meshcostdata,out bool avatarSkeleton, out bool useAvatarCollider, + out string error, ref string warning) { totalcost = 0; error = string.Empty; - + + avatarSkeleton = false; + useAvatarCollider = false; + if (resources == null || resources.instance_list == null || resources.instance_list.Array.Count == 0) @@ -145,6 +151,10 @@ namespace OpenSim.Region.ClientStack.Linden float meshsfee = 0; int numberMeshs = 0; bool haveMeshs = false; + + bool curskeleton; + bool curAvatarPhys; + List meshsCosts = new List(); if (resources.mesh_list != null && resources.mesh_list.Array.Count > 0) @@ -156,10 +166,20 @@ namespace OpenSim.Region.ClientStack.Linden ameshCostParam curCost = new ameshCostParam(); byte[] data = (byte[])resources.mesh_list.Array[i]; - if (!MeshCost(data, curCost, out error)) + if (!MeshCost(data, curCost,out curskeleton, out curAvatarPhys, out error)) { return false; } + + if (curskeleton) + { + if (avatarSkeleton) + { + error = "model can only contain a avatar skeleton"; + return false; + } + avatarSkeleton = true; + } meshsCosts.Add(curCost); meshsfee += curCost.costFee; } @@ -273,7 +293,7 @@ namespace OpenSim.Region.ClientStack.Linden } // single mesh asset cost - private bool MeshCost(byte[] data, ameshCostParam cost, out string error) + private bool MeshCost(byte[] data, ameshCostParam cost,out bool skeleton, out bool avatarPhys, out string error) { cost.highLODSize = 0; cost.medLODSize = 0; @@ -284,6 +304,9 @@ namespace OpenSim.Region.ClientStack.Linden error = string.Empty; + skeleton = false; + avatarPhys = false; + if (data == null || data.Length == 0) { error = "Missing model information."; @@ -330,6 +353,17 @@ namespace OpenSim.Region.ClientStack.Linden int submesh_offset = -1; + if (map.ContainsKey("skeleton")) + { + tmpmap = (OSDMap)map["skeleton"]; + if (tmpmap.ContainsKey("offset") && tmpmap.ContainsKey("size")) + { + int sksize = tmpmap["size"].AsInteger(); + if(sksize > 0) + skeleton = true; + } + } + if (map.ContainsKey("physics_convex")) { tmpmap = (OSDMap)map["physics_convex"]; From dab2e778d6a9d11cce48161d045598a56e7de952 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Oct 2014 10:22:57 +0100 Subject: [PATCH 3/6] bug fix --- .../ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 3a070c3f9d..133a629dcf 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -830,7 +830,8 @@ namespace OpenSim.Region.ClientStack.Linden List textures = new List(); - if (doTextInv) +// if (doTextInv) + if (doTextInv || avatarSkeleton) m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client); if(client == null) // don't put textures in inventory if there is no client @@ -903,7 +904,7 @@ namespace OpenSim.Region.ClientStack.Linden // test code - if (avatarSkeleton) + if (avatarSkeleton && client != null) { string name = assetName; if (name.Length > 25) From cc71dd9a278ffe79668336db11fb768ce881fd18 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Oct 2014 11:12:43 +0100 Subject: [PATCH 4/6] dont let test mesh go to meshes inventory folder that is not displayed by viewers --- .../Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 133a629dcf..344df2b942 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -920,7 +920,9 @@ namespace OpenSim.Region.ClientStack.Linden meshitem.Name = name; meshitem.AssetType = (int)AssetType.Mesh; meshitem.InvType = (int)InventoryType.Mesh; - meshitem.Folder = UUID.Zero; // send to default + // meshitem.Folder = UUID.Zero; // send to default + + meshitem.Folder = parentFolder; // dont let it go to folder Meshes that viewers dont show // If we set PermissionMask.All then when we rez the item the next permissions will replace the current // (owner) permissions. This becomes a problem if next permissions are changed. From c3e88b7b3810aace6e2260526d8f74df88d2cead Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Oct 2014 22:41:59 +0100 Subject: [PATCH 5/6] changed skeleton, do parse the mesh on upload to check skeleton. Sooner or later this parsing needs to validate the model cost also. --- .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 44 ++++++++++--------- .../Linden/Caps/BunchOfCaps/MeshCost.cs | 8 ++-- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 344df2b942..ab8f0c9435 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.ClientStack.Linden string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, string assetType, int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload, bool avatarSkeleton, bool avatarCollider, ref string error); + bool IsAtestUpload, ref string error); public delegate UUID UpdateItem(UUID itemID, byte[] data); @@ -531,8 +531,6 @@ namespace OpenSim.Region.ClientStack.Linden int nreqmeshs= 0; int nreqinstances = 0; bool IsAtestUpload = false; - bool avatarSkeleton = false; - bool avatarCollider = false; string assetName = llsdRequest.name; @@ -584,7 +582,7 @@ namespace OpenSim.Region.ClientStack.Linden if (!m_ModelCost.MeshModelCost(llsdRequest.asset_resources, baseCost, out modelcost, - meshcostdata,out avatarSkeleton, out avatarCollider, out error, ref warning)) + meshcostdata, out error, ref warning)) { LLSDAssetUploadError resperror = new LLSDAssetUploadError(); resperror.message = error; @@ -667,7 +665,7 @@ namespace OpenSim.Region.ClientStack.Linden AssetUploader uploader = new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, llsdRequest.asset_type, capsBase + uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile, cost, - texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload, avatarSkeleton, avatarCollider); + texturesFolder, nreqtextures, nreqmeshs, nreqinstances, IsAtestUpload); m_HostCapsObj.HttpListener.AddStreamHandler( new BinaryStreamHandler( @@ -714,7 +712,7 @@ namespace OpenSim.Region.ClientStack.Linden UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType, string assetType, int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload,bool avatarSkeleton, bool avatarCollider, ref string error) + bool IsAtestUpload, ref string error) { lock (m_ModelCost) @@ -800,7 +798,7 @@ namespace OpenSim.Region.ClientStack.Linden OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data); // compare and get updated information - +/* does nothing still we do need something to avoid special viewer to upload something diferent from the cost estimation bool mismatchError = true; while (mismatchError) @@ -816,7 +814,7 @@ namespace OpenSim.Region.ClientStack.Linden return; } - +*/ OSDArray instance_list = (OSDArray)request["instance_list"]; OSDArray mesh_list = (OSDArray)request["mesh_list"]; OSDArray texture_list = (OSDArray)request["texture_list"]; @@ -831,7 +829,6 @@ namespace OpenSim.Region.ClientStack.Linden // if (doTextInv) - if (doTextInv || avatarSkeleton) m_Scene.TryGetClient(m_HostCapsObj.AgentID, out client); if(client == null) // don't put textures in inventory if there is no client @@ -879,10 +876,17 @@ namespace OpenSim.Region.ClientStack.Linden // create and store meshs assets List meshAssets = new List(); + List meshAvatarSkeletons = new List(); + List meshAvatarColliders = new List(); + + bool curAvSkeleton; + bool curAvCollider; for (int i = 0; i < mesh_list.Count; i++) { -/* - // do we really need this heavy thing? + curAvSkeleton = false; + curAvCollider = false; + + // we do need to parse the mesh now OSD osd = OSDParser.DeserializeLLSDBinary(mesh_list[i]); if (osd is OSDMap) { @@ -891,9 +895,10 @@ namespace OpenSim.Region.ClientStack.Linden { OSDMap skeleton = (OSDMap)mosd["skeleton"]; int sksize = skeleton["size"].AsInteger(); + if (sksize > 0) + curAvSkeleton = true; } } -*/ AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, creatorIDstr); meshAsset.Data = mesh_list[i].AsBinary(); @@ -901,10 +906,11 @@ namespace OpenSim.Region.ClientStack.Linden meshAsset.Local = true; m_assetService.Store(meshAsset); meshAssets.Add(meshAsset.FullID); - + meshAvatarSkeletons.Add(curAvSkeleton); + meshAvatarColliders.Add(curAvCollider); // test code - if (avatarSkeleton && client != null) + if (curAvSkeleton && client != null) { string name = assetName; if (name.Length > 25) @@ -1594,14 +1600,12 @@ namespace OpenSim.Region.ClientStack.Linden private int m_nreqmeshs; private int m_nreqinstances; private bool m_IsAtestUpload; - private bool m_avatarSkeleton; - private bool m_avatarCollider; - + public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolderID, string invType, string assetType, string path, IHttpServer httpServer, bool dumpAssetsToFile, int totalCost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances, - bool IsAtestUpload,bool avatarSkeleton, bool avatarCollider) + bool IsAtestUpload) { m_assetName = assetName; m_assetDes = description; @@ -1620,8 +1624,6 @@ namespace OpenSim.Region.ClientStack.Linden m_nreqmeshs = nreqmeshs; m_nreqinstances = nreqinstances; m_IsAtestUpload = IsAtestUpload; - m_avatarSkeleton = avatarSkeleton; - m_avatarCollider = avatarCollider; m_timeoutTimer.Elapsed += TimedOut; m_timeoutTimer.Interval = 120000; @@ -1667,7 +1669,7 @@ namespace OpenSim.Region.ClientStack.Linden { handlerUpLoad(m_assetName, m_assetDes, newAssetID, inv, parentFolder, data, m_invType, m_assetType, m_cost, m_texturesFolder, m_nreqtextures, m_nreqmeshs, m_nreqinstances, m_IsAtestUpload, - m_avatarSkeleton, m_avatarCollider, ref m_error); + ref m_error); } if (m_IsAtestUpload) { diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs index db6f9fd029..546bcd9f60 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/MeshCost.cs @@ -99,15 +99,13 @@ namespace OpenSim.Region.ClientStack.Linden // avatarSkeleton if mesh includes a avatar skeleton // useAvatarCollider if we should use physics mesh for avatar public bool MeshModelCost(LLSDAssetResource resources, int basicCost, out int totalcost, - LLSDAssetUploadResponseData meshcostdata,out bool avatarSkeleton, out bool useAvatarCollider, - out string error, ref string warning) + LLSDAssetUploadResponseData meshcostdata, out string error, ref string warning) { totalcost = 0; error = string.Empty; - avatarSkeleton = false; - useAvatarCollider = false; - + bool avatarSkeleton = false; + if (resources == null || resources.instance_list == null || resources.instance_list.Array.Count == 0) From 39cfd823032ec83096cf3755566901f73a993fdc Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 11 Oct 2014 22:53:47 +0100 Subject: [PATCH 6/6] add simulator features AvatarSkeleton and AnimationSet report --- .../ClientStack/Linden/Caps/SimulatorFeaturesModule.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs index e4d8a20fb6..7c22a7ca63 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs @@ -131,8 +131,11 @@ namespace OpenSim.Region.ClientStack.Linden m_features["MeshRezEnabled"] = true; m_features["MeshUploadEnabled"] = true; m_features["MeshXferEnabled"] = true; + m_features["AvatarSkeleton"] = true; + m_features["AnimationSet"] = true; + m_features["PhysicsMaterialsEnabled"] = true; - + OSDMap typesMap = new OSDMap(); typesMap["convex"] = true; typesMap["none"] = true;