start method

  1. @override
Future<void> start(
  1. ServiceContext context
)
override

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));
}