buildMesh method

  1. @override
ShapeMesh buildMesh([
  1. ShapeUv uv = ShapeUv.natural
])
override

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();
}