Пример #1
0
        public static void ToAssimp(Module.Export.Assimp.Context context, Scene scene)
        {
            if (context.meshes != null && context.meshes.Count > 0)
            {
                using (aiMeshArray meshes = context.scene.Meshes)
                {
                    uint count = (uint)context.meshes.Count;

                    meshes.Reserve(count, true);

                    foreach (KeyValuePair <Module.Export.Assimp.Mesh, uint> indexes in context.meshes)
                    {
                        if (indexes.Value >= 0 && indexes.Value < count)
                        {
                            // Save the values to local variables to avoid the problem of variables passed by reference to lambda functions.
                            Module.Export.Assimp.Mesh mesh_indexes = indexes.Key;

                            aiMesh assimp_mesh = new aiMesh();                             // Allocation in another thread fails so we must do it before starting the task

                            meshes.Set(indexes.Value, assimp_mesh.Unmanaged());

                            context.threads.AddTask(() => ToAssimp(context, scene, mesh_indexes, assimp_mesh));
                        }
                    }
                }
            }
        }
Пример #2
0
        public static void FromAssimp(Module.Import.Assimp.Context context, aiScene scene)
        {
            if (scene.HasMeshes())
            {
                using (aiMeshArray meshes = scene.Meshes)
                {
                    uint meshes_size = meshes.Size();

                    // Reserve the right amount of memory
                    context.scene.meshes = new Mesh[(int)meshes_size];

                    // Load all the meshes
                    for (uint i = 0; i < meshes_size; i++)
                    {
                        aiMesh mesh = meshes.Get(i);

                        // LoadGeometry must dispose of the given mesh afterward
                        // We must use a proxy method for saving the result into the array because the index i is captured by the lambda otherwise and it's value is indefinite across multiple threads.
                        context.threads.ExecAndSaveToArray(context.scene.meshes, (int)i, () => FromAssimp(context, mesh));
                    }
                }
            }
        }
Пример #3
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(aiMeshArray obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }