buildNode method

Future<Object3D?> buildNode(
  1. Map<String, dynamic> data
)

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;
}