renderEye method
void
renderEye(
- Canvas canvas,
- Size viewportSize,
- VRCamera camera,
- StereoscopicProjection projection,
- bool isLeftEye,
override
Renders the scene for a single eye viewport.
Implementation
@override
void renderEye(
Canvas canvas,
Size viewportSize,
VRCamera camera,
StereoscopicProjection projection,
bool isLeftEye,
) {
// Background
if (backgroundGradient != null) {
canvas.drawRect(
Offset.zero & viewportSize,
Paint()
..shader = backgroundGradient!.createShader(
Offset.zero & viewportSize,
),
);
} else {
canvas.drawRect(
Offset.zero & viewportSize,
Paint()..color = backgroundColor,
);
}
// Collect and sort by depth
final projected = <_ProjectedElement>[];
for (final element in elements) {
if (!element.visible) continue;
final point = isLeftEye
? projection.projectLeft(
element.position,
camera,
viewportSize.width,
viewportSize.height,
)
: projection.projectRight(
element.position,
camera,
viewportSize.width,
viewportSize.height,
);
if (!point.visible || point.depth <= 0) continue;
projected.add(
_ProjectedElement(
element: element,
screenX: point.screenX,
screenY: point.screenY,
depth: point.depth,
),
);
}
// Z-sort (far to near)
projected.sort((a, b) => b.depth.compareTo(a.depth));
// Render connections first
for (final conn in connections) {
final pa = isLeftEye
? projection.projectLeft(
conn.a.position,
camera,
viewportSize.width,
viewportSize.height,
)
: projection.projectRight(
conn.a.position,
camera,
viewportSize.width,
viewportSize.height,
);
final pb = isLeftEye
? projection.projectLeft(
conn.b.position,
camera,
viewportSize.width,
viewportSize.height,
)
: projection.projectRight(
conn.b.position,
camera,
viewportSize.width,
viewportSize.height,
);
if (pa.visible && pb.visible) {
canvas.drawLine(
pa.offset,
pb.offset,
Paint()
..color = conn.color
..strokeWidth = conn.strokeWidth,
);
}
}
// Render elements
for (final p in projected) {
final scale = (projection.projectionScale / p.depth).clamp(0.1, 5.0);
p.element.render(canvas, p.screenX, p.screenY, p.depth, scale);
}
}