updateFromMetadata method

  1. @override
void updateFromMetadata(
  1. Shader fragmentShader,
  2. Map<String, Object?> metadata
)

Re-reads the render state and parameters from a regenerated fragmentShader and sidecar metadata (a hot-reloaded .fmat), in place.

Updates culling, blending, shading model, and the parameter layout without replacing the material instance, so every primitive already using it picks up the change. Explicitly-set parameter values are preserved; see MaterialParameters.updateFromMetadata.

Implementation

@override
void updateFromMetadata(
  gpu.Shader fragmentShader,
  Map<String, Object?> metadata,
) {
  _shadingModel = _parseShadingModel(metadata['shading_model']);
  _blending = _parseBlending(metadata['blending']);
  _culling = _parseCulling(metadata['culling']);
  _depthWrite = metadata['depth_write'] == true;
  _effectsDepth = metadata['effects_depth'] == true;
  _depthCompare = _parseDepthCompare(metadata['depth_test']);
  _sceneInputs = _parseSceneInputs(metadata['engine_inputs']);
  _environmentLighting = metadata['environment_lighting'] != false;
  // A reloaded declaration is a new schema object, which invalidates the
  // widened vertex layouts and instance buffers keyed on the old one.
  _instanceAttributes = InstanceAttributeSchema.fromMetadata(metadata);
  _vertexAttributes = VertexAttributeSchema.fromMetadata(metadata);
  _usesPlanarReflection = parsePlanarReflectionInput(
    metadata['engine_inputs'],
  );
  _sceneColorReach = _parseSceneColorReach(metadata['scene_color_reach']);
  final declaredDepthLayer = _parseDepthLayer(metadata['depth_layer']);
  if (declaredDepthLayer != _declaredDepthLayer) {
    _declaredDepthLayer = declaredDepthLayer;
    depthLayer = declaredDepthLayer;
  }
  markMaterialSceneInputsChanged();
  setFragmentShader(fragmentShader);
  parameters.updateFromMetadata(fragmentShader, metadata);
}