render method
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);
}