renderEye method

  1. @override
void renderEye(
  1. Canvas canvas,
  2. Size viewportSize,
  3. VRCamera camera,
  4. StereoscopicProjection projection,
  5. 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);
  }
}