The scene surface and its status screens: the source
Open the live demo · Read the guide · View on GitHub
Regions the guide quotes: scene (line 18), surface (line 37), failure (line 53).
1/// The widget every viewport in this app is built from: renders a scene
2/// once a frame and hands the result to Flutter through `presentFrame`, and
3/// the screen an application shows when a renderer never opened at all.
4///
5/// Quoted by `scene_surface.md` and shown whole in the Source tab.
6library;
8import 'package:flutter/widgets.dart';
9import 'package:flutter3d/flutter3d.dart' hide Material;
10import 'package:flutter3d/flutter3d.dart' as f3d show Material;
11import 'package:flutter3d_app/flutter3d_app.dart';
12import 'package:flutter3d_showcase/src/demo/demo.dart';
13import 'package:vector_math/vector_math.dart';
15final class SceneSurfaceDemo extends ShowcaseDemo {
16 late Scene _scene;
19 Scene build(DemoContext context) {
20 final material = f3d.Material(
21 name: 'ball',
22 baseColor: Vector4(0.6, 0.7, 0.9, 1.0),
23 );
24 final ball = MeshNode(
25 DeviceMesh.upload(context.device, SphereShape(segments: 24).build()),
26 material,
27 );
28 _scene = Scene()
29 ..add(ball)
30 ..add(
31 LightNode(name: 'sun', intensity: 3.0)
32 ..setLocalForward(Vector3(-0.4, -1.0, -0.3)),
33 );
34 return _scene;
35 }
38 Widget? customBody(BuildContext buildContext, DemoContext context) =>
39 SceneSurface(
40 renderer: context.renderer,
41 scene: _scene,
42 view: context.view,
43 settings: () => const RenderSettings(),
44 onBeforeFrame: () {},
45 presentFrame: presentFrame,
46 );
49 void verify(Scene scene, FrameResult frame) {
50 if (frame.drawCalls < 1) {
51 throw StateError('the ball was not drawn');
52 }
53 // What an application shows instead, when the renderer never opened.
54 final failure = DidNotStart(
55 StateError('no shader bundle for this build'),
56 explaining: 'run tool/build_shaders.sh first',
57 );
58 if (failure.explaining != 'run tool/build_shaders.sh first') {
59 throw StateError('the explanation should be carried through as given');
60 }
61 }
62}