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