parseNode method
Map<String, dynamic>
parseNode(
- 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;
}