private void AddWallCap(
        Vector3 near,
        Vector3 far,
        float hexOuterRadius,
        int wrapSize
    ) {
        near = HexagonPoint.Perturb(
            near,
            hexOuterRadius,
            wrapSize
        );

        far = HexagonPoint.Perturb(
            far,
            hexOuterRadius,
            wrapSize
        );

        Vector3 center = HexagonPoint.WallLerp(near, far);
        Vector3 thickness = HexagonPoint.WallThicknessOffset(near, far);

        Vector3 vertex1;
        Vector3 vertex2;
        Vector3 vertex3;
        Vector3 vertex4;

        vertex1 = vertex3 = center - thickness;
        vertex2 = vertex4 = center + thickness;
        vertex3.y = vertex4.y = center.y + HexagonPoint.wallHeight;
        walls.AddQuadUnperturbed(vertex1, vertex2, vertex3, vertex4);
    }
    private void AddWallWedge(
        Vector3 near,
        Vector3 far,
        Vector3 point,
        float hexOuterRadius,
        int wrapSize
    ) {
        near = HexagonPoint.Perturb(
            near,
            hexOuterRadius,
            wrapSize
        );

        far = HexagonPoint.Perturb(
            far,
            hexOuterRadius,
            wrapSize
        );

        point = HexagonPoint.Perturb(
            point,
            hexOuterRadius,
            wrapSize
        );

        Vector3 center = HexagonPoint.WallLerp(near, far);
        Vector3 thickness = HexagonPoint.WallThicknessOffset(near, far);

        Vector3 vertex1;
        Vector3 vertex2;
        Vector3 vertex3;
        Vector3 vertex4;

        Vector3 pointTop = point;
        point.y = center.y;

        vertex1 = vertex3 = center - thickness;
        vertex2 = vertex4 = center + thickness;
        vertex3.y = vertex4.y = pointTop.y = center.y + HexagonPoint.wallHeight;
        
        walls.AddQuadUnperturbed(vertex1, point, vertex3, pointTop);
        walls.AddQuadUnperturbed(point, vertex2, pointTop, vertex4);
        walls.AddTriangleUnperturbed(pointTop, vertex3, vertex4);
    }
    private void AddWallSegment(
        Vector3 nearLeft,
        Vector3 farLeft,
        Vector3 nearRight,
        Vector3 farRight,
        float hexOuterRadius,
        int wrapSize,
        bool addTower = false
    ) {
        nearLeft = HexagonPoint.Perturb(
            nearLeft,
            hexOuterRadius,
            wrapSize
        );
        
        farLeft = HexagonPoint.Perturb(
            farLeft,
            hexOuterRadius,
            wrapSize
        );
        
        nearRight = HexagonPoint.Perturb(
            nearRight,
            hexOuterRadius,
            wrapSize
        );
        
        farRight = HexagonPoint.Perturb(
            farRight,
            hexOuterRadius,
            wrapSize
        );

        Vector3 left = HexagonPoint.WallLerp(nearLeft, farLeft);
        Vector3 right = HexagonPoint.WallLerp(nearRight, farRight);

        Vector3 leftThicknessOffset = 
            HexagonPoint.WallThicknessOffset(nearLeft, farLeft);
        Vector3 rightThicknessOffset = 
            HexagonPoint.WallThicknessOffset(nearRight, farRight);

        float leftTop = left.y + HexagonPoint.wallHeight;
        float rightTop = right.y + HexagonPoint.wallHeight;

        Vector3 vertex1;
        Vector3 vertex2;
        Vector3 vertex3;
        Vector3 vertex4;

        vertex1 = vertex3 = left - leftThicknessOffset;
        vertex2 = vertex4 = right - rightThicknessOffset;
        vertex3.y = leftTop;
        vertex4.y = rightTop;
        walls.AddQuadUnperturbed(vertex1, vertex2, vertex3, vertex4);

        Vector3 top1 = vertex3;
        Vector3 top2 = vertex4;

        vertex1 = vertex3 = left + leftThicknessOffset;
        vertex2 = vertex4 = right + rightThicknessOffset;
        vertex3.y = leftTop;
        vertex4.y = rightTop;
        walls.AddQuadUnperturbed(vertex2, vertex1, vertex4, vertex3);

        walls.AddQuadUnperturbed(top1, top2, vertex3, vertex4);

        if (addTower) {
            Transform towerInstance = Instantiate(wallTower);
            towerInstance.transform.localPosition = (left + right) * 0.5f;
            Vector3 rightDirection = right - left;
            rightDirection.y = 0f;
            towerInstance.transform.right = rightDirection;
            towerInstance.SetParent(_container, false);
        }
    }