diff options
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 2 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | 21 |
3 files changed, 24 insertions, 11 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index f953c1e..6bb88c7 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -86,7 +86,7 @@ public abstract class BSPhysObject : PhysicsActor | |||
86 | PhysBody = new BulletBody(localID); | 86 | PhysBody = new BulletBody(localID); |
87 | PhysShape = new BulletShape(); | 87 | PhysShape = new BulletShape(); |
88 | 88 | ||
89 | LastAssetBuildFailed = false; | 89 | PrimAssetState = PrimAssetCondition.Unknown; |
90 | 90 | ||
91 | // Default material type. Also sets Friction, Restitution and Density. | 91 | // Default material type. Also sets Friction, Restitution and Density. |
92 | SetMaterial((int)MaterialAttributes.Material.Wood); | 92 | SetMaterial((int)MaterialAttributes.Material.Wood); |
@@ -133,9 +133,13 @@ public abstract class BSPhysObject : PhysicsActor | |||
133 | // Reference to the physical shape (btCollisionShape) of this object | 133 | // Reference to the physical shape (btCollisionShape) of this object |
134 | public BulletShape PhysShape; | 134 | public BulletShape PhysShape; |
135 | 135 | ||
136 | // 'true' if the mesh's underlying asset failed to build. | 136 | // The physical representation of the prim might require an asset fetch. |
137 | // This will keep us from looping after the first time the build failed. | 137 | // The asset state is first 'Unknown' then 'Waiting' then either 'Failed' or 'Fetched'. |
138 | public bool LastAssetBuildFailed { get; set; } | 138 | public enum PrimAssetCondition |
139 | { | ||
140 | Unknown, Waiting, Failed, Fetched | ||
141 | } | ||
142 | public PrimAssetCondition PrimAssetState { get; set; } | ||
139 | 143 | ||
140 | // The objects base shape information. Null if not a prim type shape. | 144 | // The objects base shape information. Null if not a prim type shape. |
141 | public PrimitiveBaseShape BaseShape { get; protected set; } | 145 | public PrimitiveBaseShape BaseShape { get; protected set; } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 2cbbe9a..6a5461a 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -155,7 +155,7 @@ public class BSPrim : BSPhysObject | |||
155 | public override PrimitiveBaseShape Shape { | 155 | public override PrimitiveBaseShape Shape { |
156 | set { | 156 | set { |
157 | BaseShape = value; | 157 | BaseShape = value; |
158 | LastAssetBuildFailed = false; | 158 | PrimAssetState = PrimAssetCondition.Unknown; |
159 | ForceBodyShapeRebuild(false); | 159 | ForceBodyShapeRebuild(false); |
160 | } | 160 | } |
161 | } | 161 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index 457f204..a6e20a8 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | |||
@@ -930,11 +930,15 @@ public sealed class BSShapeCollection : IDisposable | |||
930 | return newShape; | 930 | return newShape; |
931 | 931 | ||
932 | // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset | 932 | // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset |
933 | if (prim.BaseShape.SculptEntry && !prim.LastAssetBuildFailed && prim.BaseShape.SculptTexture != OMV.UUID.Zero) | 933 | if (prim.BaseShape.SculptEntry |
934 | && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.Failed | ||
935 | && prim.PrimAssetState != BSPhysObject.PrimAssetCondition.Waiting | ||
936 | && prim.BaseShape.SculptTexture != OMV.UUID.Zero | ||
937 | ) | ||
934 | { | 938 | { |
935 | DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset,lastFailed={1}", prim.LocalID, prim.LastAssetBuildFailed); | 939 | DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset", prim.LocalID); |
936 | // This will prevent looping through this code as we keep trying to get the failed shape | 940 | // Multiple requestors will know we're waiting for this asset |
937 | prim.LastAssetBuildFailed = true; | 941 | prim.PrimAssetState = BSPhysObject.PrimAssetCondition.Waiting; |
938 | 942 | ||
939 | BSPhysObject xprim = prim; | 943 | BSPhysObject xprim = prim; |
940 | Util.FireAndForget(delegate | 944 | Util.FireAndForget(delegate |
@@ -945,7 +949,7 @@ public sealed class BSShapeCollection : IDisposable | |||
945 | BSPhysObject yprim = xprim; // probably not necessary, but, just in case. | 949 | BSPhysObject yprim = xprim; // probably not necessary, but, just in case. |
946 | assetProvider(yprim.BaseShape.SculptTexture, delegate(AssetBase asset) | 950 | assetProvider(yprim.BaseShape.SculptTexture, delegate(AssetBase asset) |
947 | { | 951 | { |
948 | bool assetFound = false; // DEBUG DEBUG | 952 | bool assetFound = false; |
949 | string mismatchIDs = String.Empty; // DEBUG DEBUG | 953 | string mismatchIDs = String.Empty; // DEBUG DEBUG |
950 | if (asset != null && yprim.BaseShape.SculptEntry) | 954 | if (asset != null && yprim.BaseShape.SculptEntry) |
951 | { | 955 | { |
@@ -963,6 +967,10 @@ public sealed class BSShapeCollection : IDisposable | |||
963 | mismatchIDs = yprim.BaseShape.SculptTexture.ToString() + "/" + asset.ID; | 967 | mismatchIDs = yprim.BaseShape.SculptTexture.ToString() + "/" + asset.ID; |
964 | } | 968 | } |
965 | } | 969 | } |
970 | if (assetFound) | ||
971 | yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Fetched; | ||
972 | else | ||
973 | yprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed; | ||
966 | DetailLog("{0},BSShapeCollection,fetchAssetCallback,found={1},isSculpt={2},ids={3}", | 974 | DetailLog("{0},BSShapeCollection,fetchAssetCallback,found={1},isSculpt={2},ids={3}", |
967 | yprim.LocalID, assetFound, yprim.BaseShape.SculptEntry, mismatchIDs ); | 975 | yprim.LocalID, assetFound, yprim.BaseShape.SculptEntry, mismatchIDs ); |
968 | 976 | ||
@@ -970,6 +978,7 @@ public sealed class BSShapeCollection : IDisposable | |||
970 | } | 978 | } |
971 | else | 979 | else |
972 | { | 980 | { |
981 | xprim.PrimAssetState = BSPhysObject.PrimAssetCondition.Failed; | ||
973 | PhysicsScene.Logger.ErrorFormat("{0} Physical object requires asset but no asset provider. Name={1}", | 982 | PhysicsScene.Logger.ErrorFormat("{0} Physical object requires asset but no asset provider. Name={1}", |
974 | LogHeader, PhysicsScene.Name); | 983 | LogHeader, PhysicsScene.Name); |
975 | } | 984 | } |
@@ -977,7 +986,7 @@ public sealed class BSShapeCollection : IDisposable | |||
977 | } | 986 | } |
978 | else | 987 | else |
979 | { | 988 | { |
980 | if (prim.LastAssetBuildFailed) | 989 | if (prim.PrimAssetState == BSPhysObject.PrimAssetCondition.Failed) |
981 | { | 990 | { |
982 | PhysicsScene.Logger.ErrorFormat("{0} Mesh failed to fetch asset. lID={1}, texture={2}", | 991 | PhysicsScene.Logger.ErrorFormat("{0} Mesh failed to fetch asset. lID={1}, texture={2}", |
983 | LogHeader, prim.LocalID, prim.BaseShape.SculptTexture); | 992 | LogHeader, prim.LocalID, prim.BaseShape.SculptTexture); |