buildGeometryData method

dynamic buildGeometryData(
  1. Map<String, dynamic> primitive,
  2. Map<String, dynamic>? source,
  3. int offset,
  4. dynamic array, [
  5. bool isColor = false,
])

Implementation

buildGeometryData(Map<String, dynamic> primitive, Map<String, dynamic>? source, int offset, array, [bool isColor = false ]) {
  final List<int> indices = primitive['p'];
  final int stride = primitive['stride'];
  final List<int>? vcount = primitive['vcount'];

  final sourceArray = source?['array'];
  final sourceStride = source?['stride'];

  void pushVector(int i ) {
    var index = indices[ i + offset ] * sourceStride;
    final length = index + sourceStride;

    for ( ; index < length; index ++ ) {
      array.add(sourceArray[ index ]);
    }

    if ( isColor ) {
      // convert the vertex colors from srgb to linear if present
      int startIndex = array.length - sourceStride - 1;
      if(startIndex == -1) startIndex = 0;
      tempColor.setRGB(
        array[ startIndex + 0 ],
        array[ startIndex + 1 ],
        array[ startIndex + 2 ]
      ).convertSRGBToLinear();

      array[ startIndex + 0 ] = tempColor.red;
      array[ startIndex + 1 ] = tempColor.green;
      array[ startIndex + 2 ] = tempColor.blue;
    }
  }

  if ( primitive['vcount'] != null ) {
    int index = 0;

    for (int i = 0, l = vcount!.length; i < l; i ++ ) {
      final int count = vcount[ i ];

      if ( count == 4 ) {
        final a = index + stride * 0;
        final b = index + stride * 1;
        final c = index + stride * 2;
        final d = index + stride * 3;

        pushVector( a ); pushVector( b ); pushVector( d );
        pushVector( b ); pushVector( c ); pushVector( d );
      }
      else if ( count == 3 ) {
        final a = index + stride * 0;
        final b = index + stride * 1;
        final c = index + stride * 2;

        pushVector( a ); pushVector( b ); pushVector( c );
      }
      else if ( count > 4 ) {
        for (int k = 1, kl = ( count - 2 ); k <= kl; k ++ ) {

          final a = index + stride * 0;
          final b = index + stride * k;
          final c = index + stride * ( k + 1 );

          pushVector( a ); pushVector( b ); pushVector( c );
        }
      }

      index += stride * count;
    }
  }
  else {
    for (int i = 0, l = indices.length; i < l; i += stride ) {
      pushVector( i );
    }
  }
}