bind method

  1. @override
void bind(
  1. RenderPass pass,
  2. TransientWriter transientsBuffer,
  3. Matrix4 modelTransform,
  4. Matrix4 cameraTransform,
  5. Vector3 cameraPosition, {
  6. Shader? shaderOverride,
})
override

Binds vertex/index buffers and per-frame uniforms onto pass in preparation for a draw call.

Implementations write the model and camera transforms (and any subclass-specific values, like the joints texture for skinned geometry) into the supplied transient buffer and bind the resulting uniform views.

shaderOverride is the vertex shader the pipeline actually runs when it differs from this geometry's default vertexShader (a custom material's generated vertex variant). The per-frame uniforms (FrameInfo, the joints texture) must be bound against that shader's slots, since a variant can place its uniform blocks at different binding points.

Implementation

@override
void bind(
  gpu.RenderPass pass,
  TransientWriter transientsBuffer,
  vm.Matrix4 modelTransform,
  vm.Matrix4 cameraTransform,
  vm.Vector3 cameraPosition, {
  // Billboards use the engine's billboard vertex shader; custom material
  // vertex variants do not apply, so this override is accepted and ignored.
  gpu.Shader? shaderOverride,
}) {
  // Slot 0: the shared unit quad (and its indices).
  bindGeometryBuffers(pass);

  // Slot 1: the live per-instance attributes.
  if (_instanceCount > 0) {
    final liveBytes = ByteData.sublistView(
      _instanceData,
      0,
      _instanceCount * floatsPerInstance,
    );
    pass.bindVertexBuffer(instanceTransients.emplace(liveBytes), slot: 1);
  }

  final frameInfo = Float32List(44);
  frameInfo.setRange(0, 16, cameraTransform.storage);
  frameInfo.setRange(16, 32, modelTransform.storage);
  frameInfo[32] = cameraPosition.x;
  frameInfo[33] = cameraPosition.y;
  frameInfo[34] = cameraPosition.z;
  // [35] padding
  frameInfo[36] = worldUp.x;
  frameInfo[37] = worldUp.y;
  frameInfo[38] = worldUp.z;
  frameInfo[39] = flipbookBlend ? 1.0 : 0.0;
  frameInfo[40] = _facingValue(facing);
  frameInfo[41] = flipbookColumns.toDouble();
  frameInfo[42] = flipbookRows.toDouble();
  frameInfo[43] = velocityStretch;
  pass.bindUniform(
    vertexShader.getUniformSlot('FrameInfo'),
    transientsBuffer.emplace(ByteData.sublistView(frameInfo)),
  );
}