onRender method

  1. @override
void onRender(
  1. Canvas canvas,
  2. Matrix4 viewProjection
)
override

Override for custom rendering.

Implementation

@override
void onRender(Canvas canvas, Matrix4 viewProjection) {
  // Transform panel center to screen space
  final mvp = viewProjection * worldMatrix;
  final center4 = mvp.transformed(Vector4(0, 0, 0, 1));
  if (center4.w <= 0.001) return;

  final ndcX = center4.x / center4.w;
  final ndcY = center4.y / center4.w;

  // Approximate screen-space size based on depth
  final depth = center4.w;
  final scale = 200 / depth; // Pixels per world unit at this depth
  final screenW = panelWidth * scale;
  final screenH = panelHeight * scale;

  final screenX = ndcX;
  final screenY = ndcY;

  canvas.save();
  canvas.translate(screenX, screenY);

  final rect = Rect.fromCenter(
    center: Offset.zero,
    width: screenW,
    height: screenH,
  );

  final rrect = RRect.fromRectAndRadius(
    rect,
    Radius.circular(cornerRadius / depth),
  );

  // Background
  canvas.drawRRect(
    rrect,
    Paint()..color = backgroundColor.withValues(alpha: opacity),
  );

  // Border
  canvas.drawRRect(
    rrect,
    Paint()
      ..color = borderColor.withValues(alpha: opacity)
      ..style = PaintingStyle.stroke
      ..strokeWidth = borderWidth / depth,
  );

  // Content
  if (onRenderContent != null) {
    canvas.clipRRect(rrect);
    canvas.translate(-screenW / 2, -screenH / 2);
    onRenderContent!(canvas, Size(screenW, screenH));
  }

  canvas.restore();
}