private bool OnQuitRequested() { Application.wantsToQuit -= OnQuitRequested; foreach (var disposable in _disposables) { disposable.Dispose(); } GuiCallbackQueue.Enqueue(() => _relay.Send <RequestShowDialogMessage.ExitingDialog>(this)); return(false); }
public static Task <GeometryInfo> FromMeshAsync(Mesh mesh, ConfigVector3?rotation, ConfigVector3?scale) { var tcs = new TaskCompletionSource <GeometryInfo>(); GuiCallbackQueue.Enqueue(() => { var rot = rotation != null ? (Vector3)rotation.Value : Vector3.zero; var scl = scale != null ? (Vector3)scale.Value : Vector3.one; var rotated = Quaternion.Euler(rot) * mesh.bounds.size; var size = new Vector3(rotated.x * scl.x, rotated.y * scl.y, rotated.z * scl.z); var vertices = mesh.vertices; Task.Run(() => { var volume = 0f; for (var i = 0; i < vertices.Length; i += 3) { var a = vertices[i + 0]; var b = vertices[i + 1]; var c = vertices[i + 2]; volume += Vector3.Dot(Vector3.Cross(a, b), c) / 6f; } volume = Mathf.Abs(volume * scl.x * scl.y * scl.z) / 1000f; var info = new GeometryInfo { Rotation = rot, Scale = scl, Size = size, Volume = volume, VertexCount = vertices.Length, TriangleCount = vertices.Length / 3 }; tcs.SetResult(info); }); }); return(tcs.Task); }
private static async Task <Mesh> CreateMeshFromFacetsAsync(Facet[] facets, bool centerVertices, string fileName) { var(vertices, normals, triangles) = await Task.Run(() => BuildMesh(facets)) .Timed("Building mesh data from {0} imported facets of {1}", facets.Length, fileName); var tcs = new TaskCompletionSource <Mesh>(TaskCreationOptions.RunContinuationsAsynchronously); GuiCallbackQueue.Enqueue(async() => { var mesh = new Mesh { name = fileName, hideFlags = HideFlags.HideAndDontSave }; var vertexCount = facets.Length * 3; mesh.SetVertexBufferParams( vertexCount, new VertexAttributeDescriptor(VertexAttribute.Position, stream: 0), new VertexAttributeDescriptor(VertexAttribute.Normal, stream: 1) ); mesh.SetVertexBufferData(vertices, 0, 0, vertexCount, stream: 0); mesh.SetVertexBufferData(normals, 0, 0, vertexCount, stream: 1); mesh.SetIndexBufferParams(vertexCount, IndexFormat.UInt32); mesh.SetIndexBufferData(triangles, 0, 0, vertexCount); mesh.SetSubMesh(0, new SubMeshDescriptor(0, vertexCount)); mesh.RecalculateBounds(); if (centerVertices) { var currentCenter = mesh.bounds.center; await Task.Run(() => CenterVertices(vertices, currentCenter)) .Timed("Centering vertices of {0}", fileName); mesh.SetVertexBufferData(vertices, 0, 0, vertexCount, stream: 0); mesh.RecalculateBounds(); } tcs.SetResult(mesh); }); return(await tcs.Task); }
private bool OnQuitRequested() { Application.wantsToQuit -= OnQuitRequested; foreach (var disposable in _disposables) { disposable.Dispose(); } GuiCallbackQueue.Enqueue(async() => { var layout = GatherLayoutSettings(); await _configStore.StoreAsync(layout); }); GuiCallbackQueue.Enqueue(() => _relay.Send <RequestShowDialogMessage.ExitingDialog>(this)); return(false); }