renderTriangleMesh method

void renderTriangleMesh(
  1. RenderState renderState,
  2. Int16List ixList,
  3. Float32List vxList,
  4. int color,
)

Implementation

void renderTriangleMesh(RenderState renderState, Int16List ixList,
    Float32List vxList, int color) {
  final matrix = renderState.globalMatrix;
  final alpha = renderState.globalAlpha;
  final ixListCount = ixList.length;
  final vxListCount = vxList.length >> 1;

  // check buffer sizes and flush if necessary

  final ixData = renderBufferIndex.data;
  final ixPosition = renderBufferIndex.position;
  if (ixPosition + ixListCount >= ixData.length) flush();

  final vxData = renderBufferVertex.data;
  final vxPosition = renderBufferVertex.position;
  if (vxPosition + vxListCount * 6 >= vxData.length) flush();

  final ixIndex = renderBufferIndex.position;
  var vxIndex = renderBufferVertex.position;
  final vxOffset = renderBufferVertex.count;

  // copy index list

  for (var i = 0; i < ixListCount; i++) {
    ixData[ixIndex + i] = vxOffset + ixList[i];
  }

  renderBufferIndex.position += ixListCount;
  renderBufferIndex.count += ixListCount;

  // copy vertex list

  final ma = matrix.a;
  final mb = matrix.b;
  final mc = matrix.c;
  final md = matrix.d;
  final mx = matrix.tx;
  final my = matrix.ty;

  const colorScale = 1 / 255.0;
  final colorA = colorScale * colorGetA(color) * alpha;
  final colorR = colorScale * colorGetR(color) * colorA;
  final colorG = colorScale * colorGetG(color) * colorA;
  final colorB = colorScale * colorGetB(color) * colorA;

  for (var i = 0, o = 0; i < vxListCount; i++, o += 2) {
    final x = vxList[o + 0];
    final y = vxList[o + 1];
    vxData[vxIndex + 0] = mx + ma * x + mc * y;
    vxData[vxIndex + 1] = my + mb * x + md * y;
    vxData[vxIndex + 2] = colorR;
    vxData[vxIndex + 3] = colorG;
    vxData[vxIndex + 4] = colorB;
    vxData[vxIndex + 5] = colorA;
    vxIndex += 6;
  }

  renderBufferVertex.position += vxListCount * 6;
  renderBufferVertex.count += vxListCount;
}