ProceduralToolkit
ProceduralToolkit copied to clipboard
Conical Rooftops
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;
}
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);
}