buildMesh method
Its triangles, textured by uv.
Implementation
@override
ShapeMesh buildMesh([ShapeUv uv = ShapeUv.natural]) {
final outline = _outline;
final b = MeshBuilder(uv);
if (outline.length < 3) return b.build();
final hy = Primitive3D.size(height) / 2;
final triangles = Outline.triangulate(outline);
for (final (y, ny) in [(-hy, -1.0), (hy, 1.0)]) {
final first = b.vertexCount;
for (final (x, z) in outline) {
final (u, v) = b.planar(x, y, z, 0, ny, 0);
b.vertex(x, y, z, 0, ny, 0, u, v);
}
for (var i = 0; i + 2 < triangles.length; i += 3) {
b.triangle(
first + triangles[i],
first + triangles[i + 1],
first + triangles[i + 2],
);
}
}
// Its sides, facing out whichever way the outline runs.
final out = Outline.signedArea2(outline) > 0 ? 1.0 : -1.0;
for (var i = 0; i < outline.length; i++) {
final (x0, z0) = outline[i];
final (x1, z1) = outline[(i + 1) % outline.length];
final dx = x1 - x0, dz = z1 - z0;
final len = math.sqrt(dx * dx + dz * dz);
if (len == 0) continue;
b.face(
[(x0, -hy, z0), (x1, -hy, z1), (x1, hy, z1), (x0, hy, z0)],
dz / len * out,
0,
-dx / len * out,
);
}
return b.build();
}