Example #1
0
        private bool OnQuitRequested()
        {
            Application.wantsToQuit -= OnQuitRequested;

            foreach (var disposable in _disposables)
            {
                disposable.Dispose();
            }

            GuiCallbackQueue.Enqueue(() => _relay.Send <RequestShowDialogMessage.ExitingDialog>(this));

            return(false);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }