render method

void render(
  1. Canvas canvas,
  2. Size size
)

Implementation

void render(Canvas canvas, Size size) {
  // check if texture needs to update
  if (_needsUpdateTexture) {
    _needsUpdateTexture = false;
    _updateTexture();
  }

  // create render mesh from objects
  final renderMesh = _makeRenderMesh();
  _renderObject(renderMesh, world, Matrix4.identity(), camera.lookAtMatrix, camera.projectionMatrix);

  // remove the culled faces and recreate list.
  final List<Polygon> renderIndices = <Polygon>[];
  final List<Polygon?> rawIndices = renderMesh.indices;
  for (int i = 0; i < rawIndices.length; i++) {
    final Polygon? p = rawIndices[i];
    if (p != null) renderIndices.add(p);
  }
  if (renderIndices.length == 0) return;

  // sort the faces by z
  renderIndices.sort((Polygon a, Polygon b) {
    // return b.sumOfZ.compareTo(a.sumOfZ);
    final double az = a.sumOfZ;
    final double bz = b.sumOfZ;
    if (bz > az) return 1;
    if (bz < az) return -1;
    return 0;
  });

  // convert Polygon list to Uint16List
  final int indexCount = renderIndices.length;
  final Uint16List indices = Uint16List(indexCount * 3);
  for (int i = 0; i < indexCount; i++) {
    final int index0 = i * 3;
    final int index1 = index0 + 1;
    final int index2 = index0 + 2;
    final Polygon polygon = renderIndices[i];
    indices[index0] = polygon.vertex0;
    indices[index1] = polygon.vertex1;
    indices[index2] = polygon.vertex2;
  }

  final vertices = Vertices.raw(
    VertexMode.triangles,
    renderMesh.positions,
    textureCoordinates: renderMesh.texture == null ? null : renderMesh.texcoords,
    colors: renderMesh.colors,
    indices: indices,
  );

  final paint = Paint();
  if (renderMesh.texture != null) {
    Float64List matrix4 = new Matrix4.identity().storage;
    final shader = ImageShader(renderMesh.texture!, TileMode.mirror, TileMode.mirror, matrix4);
    paint.shader = shader;
  }
  paint.blendMode = blendMode;
  canvas.drawVertices(vertices, textureBlendMode, paint);
}