filter method

  1. @override
MeshGeometry filter(
  1. MeshGeometry mesh
)
override

Returns a copy of the mesh with any filter transforms applied.

Implementation

@override
MeshGeometry filter(MeshGeometry mesh) {
  final newAttribs = List<VertexAttrib>.from(mesh.attribs);

  if (mesh.getAttrib('BARYCENTRIC') == null) {
    newAttribs.add(VertexAttrib('BARYCENTRIC', 3, 'float'));
  }

  final output = MeshGeometry(mesh.triangleVertexCount, newAttribs);

  Vector3List barycentricCoords;
  final view = output.getViewForAttrib('BARYCENTRIC');
  if (view is Vector3List) {
    barycentricCoords = view;
  } else {
    throw UnimplementedError();
  }

  final srcAttribs = <VectorList<Vector>>[];
  final destAttribs = <VectorList<Vector>>[];
  for (var attrib in mesh.attribs) {
    if (attrib.name == 'BARYCENTRIC') {
      continue;
    }

    srcAttribs.add(mesh.getViewForAttrib(attrib.name)!);
    destAttribs.add(output.getViewForAttrib(attrib.name)!);
  }

  final b0 = Vector3(1.0, 0.0, 0.0);
  final b1 = Vector3(0.0, 1.0, 0.0);
  final b2 = Vector3(0.0, 0.0, 1.0);

  int i0, i1, i2;

  for (var i = 0; i < output.length; i += 3) {
    if (mesh.indices != null) {
      i0 = mesh.indices![i];
      i1 = mesh.indices![i + 1];
      i2 = mesh.indices![i + 2];
    } else {
      i0 = i;
      i1 = i + 1;
      i2 = i + 2;
    }

    barycentricCoords[i] = b0;
    barycentricCoords[i + 1] = b1;
    barycentricCoords[i + 2] = b2;

    // Copy the remaining attributes over
    for (var j = 0; j < srcAttribs.length; ++j) {
      destAttribs[j][i] = srcAttribs[j][i0];
      destAttribs[j][i + 1] = srcAttribs[j][i1];
      destAttribs[j][i + 2] = srcAttribs[j][i2];
    }
  }

  return output;
}