buildGeometryData method
dynamic
buildGeometryData(])
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 );
}
}
}