ProceduralToolkit icon indicating copy to clipboard operation
ProceduralToolkit copied to clipboard

Conical Rooftops

Open PositivPy opened this issue 3 years ago • 1 comments

Add this to ./Building/Runtime/ProceduralRoof.cs

    public class ProceduralConicalRoof : ProceduralRoof 
    {
        public ProceduralConicalRoof(List<Vector2> foundationPolygon, RoofConfig roofConfig, Color roofColor)
            : base(foundationPolygon, roofConfig, roofColor)
        {
        }

        public override MeshDraft Construct(Vector2 parentLayoutOrigin)
        {
            var roofDraft = ConstructRoofBase(out List<Vector2> roofPolygon2, out List<Vector3> roofPolygon3);
            List<Vector3> upperRing = roofPolygon2.ConvertAll(v => v.ToVector3XZ() + Vector3.up * roofConfig.thickness);

            var centerPoint = FindCenter(upperRing);

            /// Arbitrary: roof height is radius of the base ///
            float centerPointHeight = Vector3.Distance(centerPoint, upperRing[0]); 

            centerPoint += Vector3.up * centerPointHeight;
            
            for (int i = 0; i < upperRing.Count - 1; i++)
            {
                roofDraft.AddTriangle(upperRing[i], upperRing[i+1], centerPoint, true);
            }
            // Add last triangle ([end] to [start])
            roofDraft.AddTriangle(upperRing[upperRing.Count - 1] , upperRing[0], centerPoint, true);

            return roofDraft.Paint(roofColor);
        }

        private Vector3 FindCenter(List<Vector3> polygon)
        {
            Vector3 pos = Vector3.zero;
            foreach(Vector3 v in polygon)
            {
                pos += v;
            }
            return pos / polygon.Count;
        }

PositivPy avatar Dec 16 '22 22:12 PositivPy

If you want to use the fancy Primitives:

public override MeshDraft Construct(Vector2 parentLayoutOrigin)
        {
            var roofDraft = ConstructRoofBase(out List<Vector2> roofPolygon2, out List<Vector3> roofPolygon3);
            List<Vector3> upperRing = roofPolygon2.ConvertAll(v => v.ToVector3XZ() + Vector3.up * roofConfig.thickness);

            var centerPoint = FindCenter(upperRing);
            float centerPointHeight = Vector3.Distance(centerPoint, upperRing[0]); 
            centerPoint += Vector3.up * centerPointHeight;

            roofDraft.AddBaselessPyramid(centerPoint, upperRing, true, false);
            
            return roofDraft.Paint(roofColor);
        }

PositivPy avatar Dec 16 '22 22:12 PositivPy