buildNode method
Implementation
Future<Object3D?> buildNode(Map<String,dynamic> data ) async{
final List<Object3D> objects = [];
final matrix = data['matrix'];
final nodes = data['nodes'];
final type = data['type'];
final instanceCameras = data['instanceCameras'];
final instanceControllers = data['instanceControllers'];
final instanceLights = data['instanceLights'];
final instanceGeometries = data['instanceGeometries'];
final instanceNodes = data['instanceNodes'];
// nodes
for (int i = 0, l = nodes.length; i < l; i ++ ) {
objects.add(await getNode( nodes[ i ] ) );
}
// for (final node in nodes) {
// objects.add(await getBuild( library['nodes']![ node ], buildNode ));
// }
// instance cameras
for (int i = 0, l = instanceCameras.length; i < l; i ++ ) {
final instanceCamera = await getCamera( instanceCameras[ i ] );
if ( instanceCamera != null ) {
objects.add( instanceCamera.clone() );
}
}
// instance controllers
for (int i = 0, l = instanceControllers.length; i < l; i ++ ) {
final instance = instanceControllers[ i ];
final controller = await getController( instance['id'] );
final geometries = await getGeometry( controller['id'] );
final newObjects = await buildObjects( geometries, instance['materials'] );
final skeletons = instance['skeletons'];
final joints = controller['skin']['joints'];
final skeleton = await buildSkeleton( skeletons, joints );
for (int j = 0, jl = newObjects.length; j < jl; j ++ ) {
final object = newObjects[ j ];
if (object is SkinnedMesh) {
object.bind( skeleton, controller['skin']['bindMatrix'] );
object.normalizeSkinWeights();
}
objects.add( object );
}
}
// instance lights
for (int i = 0, l = instanceLights.length; i < l; i ++ ) {
final instanceLight = await getLight( instanceLights[ i ] );
if ( instanceLight != null ) {
objects.add( instanceLight.clone() );
}
}
// instance geometries
for (int i = 0, l = instanceGeometries.length; i < l; i ++ ) {
final instance = instanceGeometries[ i ];
final geometries = await getGeometry( instance['id'] );
final newObjects = await buildObjects( geometries, instance['materials'] );
for (int j = 0, jl = newObjects.length; j < jl; j ++ ) {
objects.add( newObjects[ j ] );
}
}
// instance nodes
for (int i = 0, l = instanceNodes.length; i < l; i ++ ) {
objects.add( (await getNode( instanceNodes[ i ] )).clone() );
}
Object3D? object;
if ( nodes.isEmpty && objects.length == 1 ) {
object = objects[ 0 ];
}
else {
object = ( type == 'JOINT' ) ?Bone() :Group();
for (int i = 0; i < objects.length; i ++ ) {
object.add( await objects[ i ] );
}
}
object.name = ( type == 'JOINT' ) ? data['sid'] : data['name'];
object.matrix.setFrom( matrix );
object.matrix.decompose( object.position, object.quaternion, object.scale );
return object;
}