parseNode method

Map<String, dynamic> parseNode(
  1. XmlElement xml
)

Implementation

Map<String, dynamic> parseNode(XmlElement xml ) {
  final Map<String,dynamic> data = {
    'name': xml.getAttribute( 'name' ) ?? '',
    'type': xml.getAttribute( 'type' ),
    'id': xml.getAttribute( 'id' ),
    'sid': xml.getAttribute( 'sid' ),
    'matrix':Matrix4.identity(),
    'nodes': [],
    'instanceCameras': [],
    'instanceControllers': [],
    'instanceLights': [],
    'instanceGeometries': [],
    'instanceNodes': [],
    'transforms': {}
  };

  for (final child in xml.descendantElements) {
    var array;
    switch ( child.name.local ) {
      case 'node':
        data['nodes'].add( child.getAttribute( 'id' ) );
        parseNode( child );
        break;
      case 'instance_camera':
        data['instanceCameras'].add( parseId( child.getAttribute( 'url' )! ) );
        break;
      case 'instance_controller':
        data['instanceControllers'].add( parseNodeInstance( child ) );
        break;
      case 'instance_light':
        data['instanceLights'].add( parseId( child.getAttribute( 'url' )! ) );
        break;
      case 'instance_geometry':
        data['instanceGeometries'].add( parseNodeInstance( child ) );
        break;
      case 'instance_node':
        data['instanceNodes'].add( parseId( child.getAttribute( 'url' )! ) );
        break;
      case 'matrix':
        array = parseFloats( child.innerText );
        data['matrix'].multiply( matrix.copyFromArray( array ).transpose() );
        data['transforms'][ child.getAttribute( 'sid' ) ] = child.name.local;
        break;
      case 'translate':
        array = parseFloats( child.innerText );
        vector.copyFromArray( array );
        data['matrix'].multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );
        data['transforms'][ child.getAttribute( 'sid' ) ] = child.name.local;
        break;
      case 'rotate':
        array = parseFloats( child.innerText );
        final angle = MathUtils.degToRad( array[ 3 ] );
        data['matrix'].multiply( matrix.makeRotationAxis( vector.copyFromArray( array ), angle ) );
        data['transforms'][ child.getAttribute( 'sid' ) ] = child.name.local;
        break;
      case 'scale':
        array = parseFloats( child.innerText );
        (data['matrix'] as Matrix4).scaleByVector( vector.copyFromArray( array ) );
        data['transforms'][ child.getAttribute( 'sid' ) ] = child.name.local;
        break;
      case 'extra':
        break;
      default:
        console.info( child.name.local );
    }
  }

  if ( hasNode( data['id'] ) ) {
    console.warning( 'ColladaLoader: There is already a node with ID ${data['id']}. Exclude current node from further processing.');
  }
  else {
    library['nodes']![ data['id'] ] = data;
  }

  return data;
}