The stereo rig: the source
Open the live demo · Read the guide · View on GitHub
Regions the guide quotes: rig (line 15), surface (line 42), views (line 53).
1/// Two cameras under a head, under a stage the application moves: a stereo
2/// pair drawn side by side into one frame.
3///
4/// Quoted by `stereo_rig.md` and shown whole in the Source tab.
5library;
7import 'package:flutter/widgets.dart';
8import 'package:flutter3d/flutter3d.dart' hide Material;
9import 'package:flutter3d/flutter3d.dart' as f3d show Material;
10import 'package:flutter3d_showcase/src/demo/demo.dart';
11import 'package:flutter3d_stereo/flutter3d_stereo.dart';
12import 'package:vector_math/vector_math.dart';
14final class StereoRigDemo extends ShowcaseDemo {
15 final StereoRig _rig = StereoRig();
17 late Scene _scene;
20 Scene build(DemoContext context) {
21 final material = f3d.Material(
22 name: 'ball',
23 baseColor: Vector4(0.8, 0.5, 0.3, 1.0),
24 );
25 final ball = MeshNode(
26 DeviceMesh.upload(context.device, SphereShape(segments: 24).build()),
27 material,
28 )..setPosition(0, 0, -2);
29 _rig.stage.setPosition(0, 0, 0);
30 _scene = Scene()
31 ..add(_rig.stage)
32 ..add(ball)
33 ..add(
34 LightNode(name: 'sun', intensity: 3.0)
35 ..setLocalForward(Vector3(-0.4, -1.0, -0.3)),
36 );
37 return _scene;
38 }
41 Widget? customBody(BuildContext buildContext, DemoContext context) {
42 return StereoSurface(
43 renderer: context.renderer,
44 scene: _scene,
45 rig: _rig,
46 settings: () => const RenderSettings().forStereo(),
47 onBeforeFrame: () {},
48 );
49 }
52 void verify(Scene scene, FrameResult frame) {
53 // Two views, side by side, half the frame's width apart.
54 if (_rig.views.length != 2) {
55 throw StateError('a stereo rig draws exactly two views');
56 }
57 final left = _rig.views[0].viewportFraction;
58 final right = _rig.views[1].viewportFraction;
59 if (left.x != 0.0 || right.x != 0.5 || left.width != 0.5) {
60 throw StateError(
61 'the left view should fill the left half of the '
62 'frame and the right view the right half',
63 );
64 }
65 }
66}