Experimental physics optimization: prims with all 3 dimensions less than 0.2 meters will be meshed as a simple box
							parent
							
								
									297ca095df
								
							
						
					
					
						commit
						3646cc32c4
					
				|  | @ -64,6 +64,8 @@ namespace OpenSim.Region.Physics.Meshing | ||||||
| #endif | #endif | ||||||
|         private const float DEG_TO_RAD = 0.01745329238f; |         private const float DEG_TO_RAD = 0.01745329238f; | ||||||
| 
 | 
 | ||||||
|  |         private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh | ||||||
|  | 
 | ||||||
| // TODO: unused | // TODO: unused | ||||||
| //         private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2, | //         private static void IntersectionParameterPD(PhysicsVector p1, PhysicsVector r1, PhysicsVector p2, | ||||||
| //                                                     PhysicsVector r2, ref float lambda, ref float mu) | //                                                     PhysicsVector r2, ref float lambda, ref float mu) | ||||||
|  | @ -422,6 +424,95 @@ namespace OpenSim.Region.Physics.Meshing | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// creates a simple box mesh of the specified size | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="minX"></param> | ||||||
|  |         /// <param name="maxX"></param> | ||||||
|  |         /// <param name="minY"></param> | ||||||
|  |         /// <param name="maxY"></param> | ||||||
|  |         /// <param name="minZ"></param> | ||||||
|  |         /// <param name="maxZ"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         private static Mesh CreateSimpleBoxMesh(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) | ||||||
|  |         { | ||||||
|  |             Mesh box = new Mesh(); | ||||||
|  | 
 | ||||||
|  |             // bottom | ||||||
|  | 
 | ||||||
|  |             //box.Add(new Vertex(maxX, maxY, minZ)); | ||||||
|  |             //box.Add(new Vertex(minX, maxY, minZ)); | ||||||
|  |             //box.Add(new Vertex(minX, minY, minZ)); | ||||||
|  |             //box.Add(new Vertex(maxX, minY, minZ)); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Vertex(minX, maxY, minZ)); | ||||||
|  |             box.Add(new Vertex(maxX, maxY, minZ)); | ||||||
|  |             box.Add(new Vertex(maxX, minY, minZ)); | ||||||
|  |             box.Add(new Vertex(minX, minY, minZ)); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[0], box.vertices[1], box.vertices[2])); | ||||||
|  |             box.Add(new Triangle(box.vertices[0], box.vertices[2], box.vertices[3])); | ||||||
|  | 
 | ||||||
|  |             // top | ||||||
|  | 
 | ||||||
|  |             box.Add(new Vertex(maxX, maxY, maxZ)); | ||||||
|  |             box.Add(new Vertex(minX, maxY, maxZ)); | ||||||
|  |             box.Add(new Vertex(minX, minY, maxZ)); | ||||||
|  |             box.Add(new Vertex(maxX, minY, maxZ)); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[4], box.vertices[5], box.vertices[6])); | ||||||
|  |             box.Add(new Triangle(box.vertices[4], box.vertices[6], box.vertices[7])); | ||||||
|  | 
 | ||||||
|  |             // sides | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[5], box.vertices[0], box.vertices[3])); | ||||||
|  |             box.Add(new Triangle(box.vertices[5], box.vertices[3], box.vertices[6])); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[1], box.vertices[0], box.vertices[5])); | ||||||
|  |             box.Add(new Triangle(box.vertices[1], box.vertices[5], box.vertices[4])); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[7], box.vertices[1], box.vertices[4])); | ||||||
|  |             box.Add(new Triangle(box.vertices[7], box.vertices[2], box.vertices[1])); | ||||||
|  | 
 | ||||||
|  |             box.Add(new Triangle(box.vertices[3], box.vertices[2], box.vertices[7])); | ||||||
|  |             box.Add(new Triangle(box.vertices[3], box.vertices[7], box.vertices[6])); | ||||||
|  | 
 | ||||||
|  |             return box; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Creates a simple bounding box mesh for a complex input mesh | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="meshIn"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         private static Mesh CreateBoundingBoxMesh(Mesh meshIn) | ||||||
|  |         { | ||||||
|  |             float minX = float.MaxValue; | ||||||
|  |             float maxX = float.MinValue; | ||||||
|  |             float minY = float.MaxValue; | ||||||
|  |             float maxY = float.MinValue; | ||||||
|  |             float minZ = float.MaxValue; | ||||||
|  |             float maxZ = float.MinValue; | ||||||
|  | 
 | ||||||
|  |             foreach (Vertex v in meshIn.vertices) | ||||||
|  |             { | ||||||
|  |                 if (v != null) | ||||||
|  |                 { | ||||||
|  |                     if (v.X < minX) minX = v.X; | ||||||
|  |                     if (v.Y < minY) minY = v.Y; | ||||||
|  |                     if (v.Z < minZ) minZ = v.Z; | ||||||
|  | 
 | ||||||
|  |                     if (v.X > maxX) maxX = v.X; | ||||||
|  |                     if (v.Y > maxY) maxY = v.Y; | ||||||
|  |                     if (v.Z > maxZ) maxZ = v.Z; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return CreateSimpleBoxMesh(minX, maxX, minY, maxY, minZ, maxZ); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         private static Mesh CreateBoxMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size) |         private static Mesh CreateBoxMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size) | ||||||
|             // Builds the z (+ and -) surfaces of a box shaped prim |             // Builds the z (+ and -) surfaces of a box shaped prim | ||||||
|         { |         { | ||||||
|  | @ -1967,6 +2058,7 @@ namespace OpenSim.Region.Physics.Meshing | ||||||
|         public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod) |         public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod) | ||||||
|         { |         { | ||||||
|             Mesh mesh = null; |             Mesh mesh = null; | ||||||
|  | 
 | ||||||
|             if (primShape.SculptEntry && primShape.SculptType != (byte)0 && primShape.SculptData.Length > 0) |             if (primShape.SculptEntry && primShape.SculptType != (byte)0 && primShape.SculptData.Length > 0) | ||||||
|             { |             { | ||||||
|                  |                  | ||||||
|  | @ -2081,6 +2173,15 @@ namespace OpenSim.Region.Physics.Meshing | ||||||
|             //    } |             //    } | ||||||
|             //} |             //} | ||||||
| 
 | 
 | ||||||
|  |             if (mesh != null && size.X < minSizeForComplexMesh && size.Y < minSizeForComplexMesh && size.Z < minSizeForComplexMesh) | ||||||
|  |             { | ||||||
|  | #if SPAM | ||||||
|  |                 Console.WriteLine("Meshmerizer: prim " + primName + " has a size of " + size.ToString() + " which is below threshold of " + minSizeForComplexMesh.ToString() + " - creating simple bounding box" ); | ||||||
|  | #endif | ||||||
|  |                 mesh = CreateBoundingBoxMesh(mesh); | ||||||
|  |                 mesh.DumpRaw(baseDir, primName, "Z extruded"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             return mesh; |             return mesh; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Dahlia Trimble
						Dahlia Trimble