start method
Makes the GPU device (or, without one, a null device), the renderer and the models; registers the model loader with the asset manager; adds a GraphicsSceneRenderer to the engine's frame and an AnimationSystem3D to its world.
Implementation
@override
Future<void> start(ServiceContext context) async {
final engine = _engine = context.engine;
String? reason;
var renderer = await Renderer3D.tryCreate(
device: _device,
onUnsupported: (r) => reason = r,
);
if (renderer == null) {
final why = _unsupportedReason = reason ?? 'There is no GPU device.';
debugPrint('just_game_engine: 3D is off. $why');
// Draws nothing, but scenes and models still load.
renderer = await Renderer3D.create(
NullGpuDevice(shaders: rendererNullShaders),
);
onUnsupported?.call(why);
}
_renderer = renderer..uploader.keepEdges = keepEdges;
final models = _models = GraphicsModels(
engine.assets.bundle,
renderer.uploader,
);
engine.assets.registerLoader(
AssetType.model,
_loader = GraphicsModelLoader(models),
);
models.listeners.add(_modelReloaded);
final scene = _scene = GraphicsSceneRenderer(
engine: engine,
renderer: renderer,
models: models,
unsupportedReason: _unsupportedReason,
)..renderScale = renderScale;
engine.rendering.addSceneRenderer(scene);
engine.world.addSystem(_animations = AnimationSystem3D(models));
}