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