flutter3d
Showcase Changelog 38 packages API reference

Several views in one frame: the source

since 0.7.0 Scene and geometry

Regions the guide quotes: layers (line 24), rect (line 57), split (line 65), controls (line 87), check (line 96).

1/// One `RenderView` cropped to a rectangle, and two combined in one frame.
2library;
3
4import 'package:flutter3d/flutter3d.dart';
5import 'package:flutter3d_showcase/src/demo/demo.dart';
6import 'package:vector_math/vector_math.dart';
7
8final class MultiViewDemo extends ShowcaseDemo {
9 bool showLeft = true;
11 late final Scene _scene;
12 FrameResult? _combined;
14 @override
15 void configureView(DemoContext context) {
16 context.orbit
17 ..distance = 6.0
18 ..pitch = 0.15
19 ..yaw = 0.0;
20 }
22 @override
23 Scene build(DemoContext context) {
24 final MeshNode leftCube =
25 MeshNode(
26 DeviceMesh.upload(
27 context.device,
28 CuboidShape(size: Vector3.all(1.0)).build(),
29 ),
30 Material(name: 'left', baseColor: Vector4(0.2, 0.55, 0.95, 1.0)),
31 name: 'left cube',
32 )
33 ..setPosition(-1.4, 0.0, 0.0)
34 ..layerMask = 1;
35 final MeshNode rightCube =
36 MeshNode(
37 DeviceMesh.upload(
38 context.device,
39 CuboidShape(size: Vector3.all(1.0)).build(),
40 ),
41 Material(name: 'right', baseColor: Vector4(0.95, 0.42, 0.2, 1.0)),
42 name: 'right cube',
43 )
44 ..setPosition(1.4, 0.0, 0.0)
45 ..layerMask = 2;
47 _scene = Scene()
48 ..ambientColor = Vector3(0.45, 0.5, 0.6)
49 ..ambientIntensity = 0.16
50 ..add(leftCube)
51 ..add(rightCube)
52 ..add(
53 LightNode(name: 'key', intensity: 3.0)
54 ..setLocalForward(Vector3(-0.4, -0.7, -0.5)),
55 );
57 context.view
58 ..viewportFraction = const ViewportRect(0.0, 0.0, 0.5, 1.0)
59 ..layerMask = showLeft ? 1 : 2;
60 return _scene;
61 }
63 @override
64 void update(DemoContext context, double dt) {
65 final RenderView left = RenderView(
66 camera: context.camera,
67 viewportFraction: const ViewportRect(0.0, 0.0, 0.5, 1.0),
68 layerMask: 1,
69 );
70 final RenderView right = RenderView(
71 camera: context.camera,
72 viewportFraction: const ViewportRect(0.5, 0.0, 0.5, 1.0),
73 layerMask: 2,
74 );
75 _combined = context.renderer.render(
76 width: 320,
77 height: 180,
78 scene: _scene,
79 views: <RenderView>[left, right],
80 settings: const RenderSettings(),
81 );
82 context.view.layerMask = showLeft ? 1 : 2;
83 }
85 @override
86 List<DemoControl> controls(DemoContext context) => <DemoControl>[
87 ToggleControl(
88 'Show the left layer',
89 value: () => showLeft,
90 onChanged: (bool value) => showLeft = value,
91 ),
92 ];
94 @override
95 void verify(Scene scene, FrameResult frame) {
96 final FrameResult? combined = _combined;
97 if (combined == null || combined.drawCalls <= frame.drawCalls) {
98 throw StateError('two views in one frame did not draw more than one');
99 }
100 }