toNonIndexed method
Return a non-index version of an indexed BufferGeometry.
Implementation
BufferGeometry toNonIndexed() {
Float32BufferAttribute convertBufferAttribute(BufferAttribute attribute, indices) {
console.info("BufferGeometry.convertBufferAttribute todo");
final array = attribute.array;
final itemSize = attribute.itemSize;
final normalized = attribute.normalized;
final array2 = Float32List(indices.length * itemSize);
int index = 0, index2 = 0;
for (int i = 0, l = indices.length; i < l; i++) {
if (attribute is InterleavedBufferAttribute) {
index = indices[i] * attribute.data!.stride + attribute.offset;
} else {
index = indices[i] * itemSize;
}
for (int j = 0; j < itemSize; j++) {
array2[index2++] = array[index++].toDouble();
}
}
return Float32BufferAttribute.fromList(array2, itemSize, normalized);
}
//
if (index == null) {
console.info('BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');
return this;
}
final geometry2 = BufferGeometry();
final indices = index!.array;
final attributes = this.attributes;
// attributes
for (String name in attributes.keys) {
final attribute = attributes[name];
final newAttribute = convertBufferAttribute(attribute, indices);
geometry2.setAttributeFromString(name, newAttribute);
}
// morph attributes
final morphAttributes = this.morphAttributes;
for (String name in morphAttributes.keys) {
List<BufferAttribute> morphArray = [];
List<BufferAttribute> morphAttribute = morphAttributes[name]!; // morphAttribute: array of Float32BufferAttributes
for (int i = 0; i < morphAttribute.length; i++) {
final attribute = morphAttribute[i];
final newAttribute = convertBufferAttribute(attribute, indices);
morphArray.add(newAttribute);
}
geometry2.morphAttributes[name] = morphArray;
}
geometry2.morphTargetsRelative = morphTargetsRelative;
// groups
List<Map<String,dynamic>> groups = this.groups;
for (int i = 0, l = groups.length; i < l; i++) {
final group = groups[i];
geometry2.addGroup(group["start"], group["count"], group["materialIndex"]);
}
return geometry2;
}