Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
 public void PreloadTriangleMesh(StillDesign.PhysX.Scene scene, MeshCollisionData.TriangleMeshData model)
 {
     usingScene = scene; // This is cheat
     lock (preloadQueue)
     {
         preloadQueue.Enqueue(model);
         Monitor.PulseAll(preloadQueue);
     }
 }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        public TriangleMesh LoadTriangleMesh(MeshCollisionData.TriangleMeshData model, StillDesign.PhysX.Scene scene, Matrix transform)
        {
            MemoryStream stream = cookTriangleMeshStream(model, transform);

            return(scene.Core.CreateTriangleMesh(stream));
        }