genGeometry method
dynamic
genGeometry(
- Map geoNode,
- dynamic skeleton,
- dynamic morphTargets,
- dynamic preTransform,
)
Implementation
genGeometry( Map geoNode, skeleton, morphTargets, preTransform ) {
var geo = new BufferGeometry();
if ( geoNode["attrName"] != null ) geo.name = geoNode["attrName"];
var geoInfo = this.parseGeoNode( geoNode, skeleton );
var buffers = this.genBuffers( geoInfo );
var positionAttribute = new Float32BufferAttribute( Float32Array.fromList(List<double>.from(buffers["vertex"])), 3 );
positionAttribute.applyMatrix4( preTransform );
geo.setAttribute( 'position', positionAttribute );
if ( buffers["colors"].length > 0 ) {
geo.setAttribute( 'color', new Float32BufferAttribute( buffers["colors"], 3 ) );
}
if ( skeleton != null ) {
geo.setAttribute( 'skinIndex', new Uint16BufferAttribute( Uint16Array.fromList( List<int>.from(buffers["weightsIndices"]) ), 4 ) );
geo.setAttribute( 'skinWeight', new Float32BufferAttribute( Float32Array.fromList( List<double>.from(buffers["vertexWeights"].map((e) => e.toDouble())) ), 4 ) );
// used later to bind the skeleton to the model
geo.userData["FBX_Deformer"] = skeleton;
}
if ( buffers["normal"].length > 0 ) {
var normalMatrix = new Matrix3().getNormalMatrix( preTransform );
var normalAttribute = new Float32BufferAttribute( Float32Array.fromList( List<double>.from(buffers["normal"]) ), 3 );
normalAttribute.applyNormalMatrix( normalMatrix );
geo.setAttribute( 'normal', normalAttribute );
}
buffers["uvs"].asMap().forEach( ( i, uvBuffer ) {
// subsequent uv buffers are called 'uv1', 'uv2', ...
var name = 'uv' + ( i + 1 ).toString();
// the first uv buffer is just called 'uv'
if ( i == 0 ) {
name = 'uv';
}
geo.setAttribute( name, new Float32BufferAttribute( Float32Array.fromList( List<double>.from(buffers["uvs"][ i ]) ), 2 ) );
} );
if ( geoInfo["material"] != null && geoInfo["material"]["mappingType"] != 'AllSame' ) {
// Convert the material indices of each vertex into rendering groups on the geometry.
var prevMaterialIndex = buffers["materialIndex"][ 0 ];
var startIndex = 0;
buffers["materialIndex"].asMap().forEach( ( i, currentIndex ) {
if ( currentIndex != prevMaterialIndex ) {
geo.addGroup( startIndex, i - startIndex, prevMaterialIndex );
prevMaterialIndex = currentIndex;
startIndex = i;
}
} );
// the loop above doesn't add the last group, do that here.
if ( geo.groups.length > 0 ) {
var lastGroup = geo.groups[ geo.groups.length - 1 ];
var lastIndex = lastGroup["start"] + lastGroup["count"];
if ( lastIndex != buffers["materialIndex"].length ) {
geo.addGroup( lastIndex, buffers["materialIndex"].length - lastIndex, prevMaterialIndex );
}
}
// case where there are multiple materials but the whole geometry is only
// using one of them
if ( geo.groups.length == 0 ) {
geo.addGroup( 0, buffers["materialIndex"].length, buffers["materialIndex"][ 0 ].toInt() );
}
}
this.addMorphTargets( geo, geoNode, morphTargets, preTransform );
return geo;
}