/// <summary> /// NOTE: should MeshCollisionData.TriangleMeshData be used here, or just IMESH? /// </summary> /// <param name="scene"></param> /// <param name="model"></param> /// <returns></returns> public TriangleMesh CreateTriangleMesh(StillDesign.PhysX.Scene scene, MeshCollisionData.TriangleMeshData model) { TriangleMesh ret; lock (this) { if (triangleMeshEntries.TryGetValue(model, out ret)) { return(ret); } if (currentPreloadingMesh != model) { //Insta-load the model!!! ret = LoadTriangleMesh(model, scene, Matrix.Identity); triangleMeshEntries[model] = ret; } //Wait for preload to finish while (currentPreloadingMesh == model) { //Still update, otherwise deadlock Update(scene); Monitor.Wait(this); } ret = triangleMeshEntries[model]; } return(ret); }
private ConvexMesh loadConvexMesh(MeshCollisionData.Convex convexData, StillDesign.PhysX.Scene scene) { // Allocate memory for the points and triangles var convexMeshDesc = new ConvexMeshDescription() { PointCount = convexData.Positions.Count }; convexMeshDesc.Flags |= ConvexFlag.ComputeConvex; convexMeshDesc.AllocatePoints <Vector3>(convexData.Positions.Count); // Write in the points and triangles // We only want the Position component of the vertex. Also scale down the mesh for (int i = 0; i < convexData.Positions.Count; i++) { convexMeshDesc.PointsStream.Write(convexData.Positions[i]); } // Cook to memory or to a file MemoryStream stream = new MemoryStream(); //FileStream stream = new FileStream( @"Convex Mesh.cooked", FileMode.CreateNew ); Cooking.InitializeCooking(new ConsoleOutputStream()); Cooking.CookConvexMesh(convexMeshDesc, stream); Cooking.CloseCooking(); stream.Position = 0; return(scene.Core.CreateConvexMesh(stream)); }
public void PreloadTriangleMesh(StillDesign.PhysX.Scene scene, MeshCollisionData.TriangleMeshData model) { usingScene = scene; // This is cheat lock (preloadQueue) { preloadQueue.Enqueue(model); Monitor.PulseAll(preloadQueue); } }
public ConvexMesh CreateConvexMesh(StillDesign.PhysX.Scene scene, MeshCollisionData.Convex convex) { ConvexMesh ret; if (convexMeshEntries.TryGetValue(convex, out ret)) { return(ret); } ret = loadConvexMesh(convex, scene); convexMeshEntries[convex] = ret; return(ret); }
public void Update(StillDesign.PhysX.Scene scene) { lock (this) { if (currentPreloadingMesh == null) { return; } if (cookedStream == null) { return; } var mesh = scene.Core.CreateTriangleMesh(cookedStream); triangleMeshEntries[currentPreloadingMesh] = mesh; Console.WriteLine("Mesh succesfully preloaded!"); currentPreloadingMesh = null; cookedStream = null; Monitor.PulseAll(this); } }
public TriangleMesh LoadTriangleMesh(MeshCollisionData.TriangleMeshData model, StillDesign.PhysX.Scene scene, Matrix transform) { MemoryStream stream = cookTriangleMeshStream(model, transform); return(scene.Core.CreateTriangleMesh(stream)); }