public bool GenerateNodes(ChiselBlobAssetReference <NativeChiselSurfaceDefinition> surfaceDefinitionBlob, NativeList <GeneratedNode> nodes, Allocator allocator)
        {
            var generatedBrushMeshes = new NativeList <ChiselBlobAssetReference <BrushMeshBlob> >(nodes.Length, Allocator.Temp);

            try
            {
                generatedBrushMeshes.Resize(nodes.Length, NativeArrayOptions.ClearMemory);
                if (!BrushMeshFactory.GenerateSpiralStairs(generatedBrushMeshes,
                                                           ref this,
                                                           in surfaceDefinitionBlob,
                                                           allocator))
                {
                    for (int i = 0; i < generatedBrushMeshes.Length; i++)
                    {
                        if (generatedBrushMeshes[i].IsCreated)
                        {
                            generatedBrushMeshes[i].Dispose();
                        }
                        generatedBrushMeshes[i] = default;
                    }
                    return(false);
                }
                for (int i = 0; i < generatedBrushMeshes.Length; i++)
                {
                    nodes[i] = GeneratedNode.GenerateBrush(generatedBrushMeshes[i]);
                }

                // TODO: clean this up
                {
                    var subMeshIndex = TreadStart - CylinderSubMeshCount;
                    var node         = nodes[subMeshIndex];
                    node.operation      = CSGOperationType.Intersecting;
                    nodes[subMeshIndex] = node;

                    subMeshIndex        = RequiredSubMeshCount - CylinderSubMeshCount;
                    node                = nodes[subMeshIndex];
                    node.operation      = CSGOperationType.Intersecting;
                    nodes[subMeshIndex] = node;
                }

                if (HaveInnerCylinder)
                {
                    var subMeshIndex = TreadStart - 1;
                    var node         = nodes[subMeshIndex];
                    node.operation      = CSGOperationType.Subtractive;
                    nodes[subMeshIndex] = node;

                    subMeshIndex        = RequiredSubMeshCount - 1;
                    node                = nodes[subMeshIndex];
                    node.operation      = CSGOperationType.Subtractive;
                    nodes[subMeshIndex] = node;
                }

                return(true);
            }
            finally
            {
                generatedBrushMeshes.Dispose();
            }
        }
Esempio n. 2
0
        public bool GenerateNodes(ChiselBlobAssetReference <NativeChiselSurfaceDefinition> surfaceDefinitionBlob, NativeList <GeneratedNode> nodes, Allocator allocator)
        {
            var generatedBrushMeshes = new NativeList <ChiselBlobAssetReference <BrushMeshBlob> >(nodes.Length, Allocator.Temp);

            try
            {
                generatedBrushMeshes.Resize(nodes.Length, NativeArrayOptions.ClearMemory);
                using var vertices = BrushMeshFactory.GenerateTorusVertices(outerDiameter,
                                                                            tubeWidth,
                                                                            tubeHeight,
                                                                            tubeRotation,
                                                                            startAngle,
                                                                            totalAngle,
                                                                            verticalSegments,
                                                                            horizontalSegments,
                                                                            fitCircle,
                                                                            Allocator.Temp);

                if (!BrushMeshFactory.GenerateTorus(generatedBrushMeshes,
                                                    in vertices,
                                                    verticalSegments,
                                                    horizontalSegments,
                                                    in surfaceDefinitionBlob,
                                                    allocator))
                {
                    for (int i = 0; i < generatedBrushMeshes.Length; i++)
                    {
                        if (generatedBrushMeshes[i].IsCreated)
                        {
                            generatedBrushMeshes[i].Dispose();
                        }
                        generatedBrushMeshes[i] = default;
                    }
                    return(false);
                }

                for (int i = 0; i < generatedBrushMeshes.Length; i++)
                {
                    nodes[i] = GeneratedNode.GenerateBrush(generatedBrushMeshes[i]);
                }
                return(true);
            }
            finally
            {
                generatedBrushMeshes.Dispose();
            }
        }
        public bool GenerateNodes(ChiselBlobAssetReference <NativeChiselSurfaceDefinition> surfaceDefinitionBlob, NativeList <GeneratedNode> nodes, Allocator allocator)
        {
            var generatedBrushMeshes = new NativeList <ChiselBlobAssetReference <BrushMeshBlob> >(nodes.Length, Allocator.Temp);

            try
            {
                generatedBrushMeshes.Resize(nodes.Length, NativeArrayOptions.ClearMemory);
                var description = new BrushMeshFactory.LineairStairsData(bounds,
                                                                         stepHeight, stepDepth,
                                                                         treadHeight,
                                                                         nosingDepth, nosingWidth,
                                                                         plateauHeight,
                                                                         riserType, riserDepth,
                                                                         leftSide, rightSide,
                                                                         sideWidth, sideHeight, sideDepth);
                const int subMeshOffset = 0;
                if (!BrushMeshFactory.GenerateLinearStairsSubMeshes(generatedBrushMeshes,
                                                                    subMeshOffset,
                                                                    in description,
                                                                    in surfaceDefinitionBlob,
                                                                    allocator))
                {
                    for (int i = 0; i < generatedBrushMeshes.Length; i++)
                    {
                        if (generatedBrushMeshes[i].IsCreated)
                        {
                            generatedBrushMeshes[i].Dispose();
                        }
                        generatedBrushMeshes[i] = default;
                    }
                    return(false);
                }
                for (int i = 0; i < generatedBrushMeshes.Length; i++)
                {
                    nodes[i] = GeneratedNode.GenerateBrush(generatedBrushMeshes[i]);
                }
            }
            finally
            {
                generatedBrushMeshes.Dispose();
            }
            return(true);
        }