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