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)); } } } } }
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)); } } } }
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); }