aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/PrimitiveBaseShape.cs61
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs63
2 files changed, 62 insertions, 62 deletions
diff --git a/OpenSim/Framework/PrimitiveBaseShape.cs b/OpenSim/Framework/PrimitiveBaseShape.cs
index d873071..1b6a1d2 100644
--- a/OpenSim/Framework/PrimitiveBaseShape.cs
+++ b/OpenSim/Framework/PrimitiveBaseShape.cs
@@ -859,6 +859,67 @@ namespace OpenSim.Framework
859 } 859 }
860 } 860 }
861 861
862 public ulong GetMeshKey(Vector3 size, float lod)
863 {
864 ulong hash = 5381;
865
866 hash = djb2(hash, this.PathCurve);
867 hash = djb2(hash, (byte)((byte)this.HollowShape | (byte)this.ProfileShape));
868 hash = djb2(hash, this.PathBegin);
869 hash = djb2(hash, this.PathEnd);
870 hash = djb2(hash, this.PathScaleX);
871 hash = djb2(hash, this.PathScaleY);
872 hash = djb2(hash, this.PathShearX);
873 hash = djb2(hash, this.PathShearY);
874 hash = djb2(hash, (byte)this.PathTwist);
875 hash = djb2(hash, (byte)this.PathTwistBegin);
876 hash = djb2(hash, (byte)this.PathRadiusOffset);
877 hash = djb2(hash, (byte)this.PathTaperX);
878 hash = djb2(hash, (byte)this.PathTaperY);
879 hash = djb2(hash, this.PathRevolutions);
880 hash = djb2(hash, (byte)this.PathSkew);
881 hash = djb2(hash, this.ProfileBegin);
882 hash = djb2(hash, this.ProfileEnd);
883 hash = djb2(hash, this.ProfileHollow);
884
885 // TODO: Separate scale out from the primitive shape data (after
886 // scaling is supported at the physics engine level)
887 byte[] scaleBytes = size.GetBytes();
888 for (int i = 0; i < scaleBytes.Length; i++)
889 hash = djb2(hash, scaleBytes[i]);
890
891 // Include LOD in hash, accounting for endianness
892 byte[] lodBytes = new byte[4];
893 Buffer.BlockCopy(BitConverter.GetBytes(lod), 0, lodBytes, 0, 4);
894 if (!BitConverter.IsLittleEndian)
895 {
896 Array.Reverse(lodBytes, 0, 4);
897 }
898 for (int i = 0; i < lodBytes.Length; i++)
899 hash = djb2(hash, lodBytes[i]);
900
901 // include sculpt UUID
902 if (this.SculptEntry)
903 {
904 scaleBytes = this.SculptTexture.GetBytes();
905 for (int i = 0; i < scaleBytes.Length; i++)
906 hash = djb2(hash, scaleBytes[i]);
907 }
908
909 return hash;
910 }
911
912 private ulong djb2(ulong hash, byte c)
913 {
914 return ((hash << 5) + hash) + (ulong)c;
915 }
916
917 private ulong djb2(ulong hash, ushort c)
918 {
919 hash = ((hash << 5) + hash) + (ulong)((byte)c);
920 return ((hash << 5) + hash) + (ulong)(c >> 8);
921 }
922
862 public byte[] ExtraParamsToBytes() 923 public byte[] ExtraParamsToBytes()
863 { 924 {
864// m_log.DebugFormat("[EXTRAPARAMS]: Called ExtraParamsToBytes()"); 925// m_log.DebugFormat("[EXTRAPARAMS]: Called ExtraParamsToBytes()");
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index faecce4..53d5e4c 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -193,67 +193,6 @@ namespace OpenSim.Region.Physics.Meshing
193 m_log.Error("****** PrimMesh Parameters ******\n" + primMesh.ParamsToDisplayString()); 193 m_log.Error("****** PrimMesh Parameters ******\n" + primMesh.ParamsToDisplayString());
194 } 194 }
195 195
196 private ulong GetMeshKey(PrimitiveBaseShape pbs, Vector3 size, float lod)
197 {
198 ulong hash = 5381;
199
200 hash = djb2(hash, pbs.PathCurve);
201 hash = djb2(hash, (byte)((byte)pbs.HollowShape | (byte)pbs.ProfileShape));
202 hash = djb2(hash, pbs.PathBegin);
203 hash = djb2(hash, pbs.PathEnd);
204 hash = djb2(hash, pbs.PathScaleX);
205 hash = djb2(hash, pbs.PathScaleY);
206 hash = djb2(hash, pbs.PathShearX);
207 hash = djb2(hash, pbs.PathShearY);
208 hash = djb2(hash, (byte)pbs.PathTwist);
209 hash = djb2(hash, (byte)pbs.PathTwistBegin);
210 hash = djb2(hash, (byte)pbs.PathRadiusOffset);
211 hash = djb2(hash, (byte)pbs.PathTaperX);
212 hash = djb2(hash, (byte)pbs.PathTaperY);
213 hash = djb2(hash, pbs.PathRevolutions);
214 hash = djb2(hash, (byte)pbs.PathSkew);
215 hash = djb2(hash, pbs.ProfileBegin);
216 hash = djb2(hash, pbs.ProfileEnd);
217 hash = djb2(hash, pbs.ProfileHollow);
218
219 // TODO: Separate scale out from the primitive shape data (after
220 // scaling is supported at the physics engine level)
221 byte[] scaleBytes = size.GetBytes();
222 for (int i = 0; i < scaleBytes.Length; i++)
223 hash = djb2(hash, scaleBytes[i]);
224
225 // Include LOD in hash, accounting for endianness
226 byte[] lodBytes = new byte[4];
227 Buffer.BlockCopy(BitConverter.GetBytes(lod), 0, lodBytes, 0, 4);
228 if (!BitConverter.IsLittleEndian)
229 {
230 Array.Reverse(lodBytes, 0, 4);
231 }
232 for (int i = 0; i < lodBytes.Length; i++)
233 hash = djb2(hash, lodBytes[i]);
234
235 // include sculpt UUID
236 if (pbs.SculptEntry)
237 {
238 scaleBytes = pbs.SculptTexture.GetBytes();
239 for (int i = 0; i < scaleBytes.Length; i++)
240 hash = djb2(hash, scaleBytes[i]);
241 }
242
243 return hash;
244 }
245
246 private ulong djb2(ulong hash, byte c)
247 {
248 return ((hash << 5) + hash) + (ulong)c;
249 }
250
251 private ulong djb2(ulong hash, ushort c)
252 {
253 hash = ((hash << 5) + hash) + (ulong)((byte)c);
254 return ((hash << 5) + hash) + (ulong)(c >> 8);
255 }
256
257 /// <summary> 196 /// <summary>
258 /// Add a submesh to an existing list of coords and faces. 197 /// Add a submesh to an existing list of coords and faces.
259 /// </summary> 198 /// </summary>
@@ -777,7 +716,7 @@ namespace OpenSim.Region.Physics.Meshing
777 716
778 // If this mesh has been created already, return it instead of creating another copy 717 // If this mesh has been created already, return it instead of creating another copy
779 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory 718 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory
780 key = GetMeshKey(primShape, size, lod); 719 key = primShape.GetMeshKey(size, lod);
781 if (m_uniqueMeshes.TryGetValue(key, out mesh)) 720 if (m_uniqueMeshes.TryGetValue(key, out mesh))
782 return mesh; 721 return mesh;
783 722