bind method

  1. @override
void bind(
  1. RenderPass pass,
  2. HostBuffer transientsBuffer,
  3. Matrix4 modelTransform,
  4. Matrix4 cameraTransform,
  5. Vector3 cameraPosition,
)
override

Implementation

@override
void bind(
  gpu.RenderPass pass,
  gpu.HostBuffer transientsBuffer,
  vm.Matrix4 modelTransform,
  vm.Matrix4 cameraTransform,
  vm.Vector3 cameraPosition,
) {
  if (_jointsTexture == null) {
    throw Exception('Joints texture must be set for skinned geometry.');
  }

  pass.bindTexture(
    vertexShader.getUniformSlot('joints_texture'),
    _jointsTexture!,
    sampler: gpu.SamplerOptions(
      minFilter: gpu.MinMagFilter.nearest,
      magFilter: gpu.MinMagFilter.nearest,
      mipFilter: gpu.MipFilter.nearest,
      widthAddressMode: gpu.SamplerAddressMode.clampToEdge,
      heightAddressMode: gpu.SamplerAddressMode.clampToEdge,
    ),
  );

  if (_vertices == null) {
    throw Exception(
      'SetVertices must be called before GetBufferView for Geometry.',
    );
  }

  pass.bindVertexBuffer(_vertices!, _vertexCount);
  if (_indices != null) {
    pass.bindIndexBuffer(_indices!, _indexType, _indexCount);
  }

  // Skinned vertex UBO.
  final frameInfoSlot = vertexShader.getUniformSlot('FrameInfo');
  final frameInfoFloats = Float32List.fromList([
    modelTransform.storage[0],
    modelTransform.storage[1],
    modelTransform.storage[2],
    modelTransform.storage[3],
    modelTransform.storage[4],
    modelTransform.storage[5],
    modelTransform.storage[6],
    modelTransform.storage[7],
    modelTransform.storage[8],
    modelTransform.storage[9],
    modelTransform.storage[10],
    modelTransform.storage[11],
    modelTransform.storage[12],
    modelTransform.storage[13],
    modelTransform.storage[14],
    modelTransform.storage[15],
    cameraTransform.storage[0],
    cameraTransform.storage[1],
    cameraTransform.storage[2],
    cameraTransform.storage[3],
    cameraTransform.storage[4],
    cameraTransform.storage[5],
    cameraTransform.storage[6],
    cameraTransform.storage[7],
    cameraTransform.storage[8],
    cameraTransform.storage[9],
    cameraTransform.storage[10],
    cameraTransform.storage[11],
    cameraTransform.storage[12],
    cameraTransform.storage[13],
    cameraTransform.storage[14],
    cameraTransform.storage[15],
    cameraPosition.x,
    cameraPosition.y,
    cameraPosition.z,
    _jointsTexture != null ? 1 : 0,
    _jointsTexture != null ? _jointsTextureWidth.toDouble() : 1.0,
  ]);
  final frameInfoView = transientsBuffer.emplace(
    frameInfoFloats.buffer.asByteData(),
  );
  pass.bindUniform(frameInfoSlot, frameInfoView);
}