|
@@ -995,7 +995,107 @@ function computeMorphedAttributes( object ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+function mergeGroups( geometry ) {
|
|
|
|
|
|
+ if ( geometry.groups.length === 0 ) {
|
|
|
+
|
|
|
+ console.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );
|
|
|
+ return geometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ let groups = geometry.groups;
|
|
|
+
|
|
|
+ // sort groups by material index
|
|
|
+
|
|
|
+ groups = groups.sort( ( a, b ) => {
|
|
|
+
|
|
|
+ if ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;
|
|
|
+
|
|
|
+ return a.start - b.start;
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
+ // create index for non-indexed geometries
|
|
|
+
|
|
|
+ if ( geometry.getIndex() === null ) {
|
|
|
+
|
|
|
+ const positionAttribute = geometry.getAttribute( 'position' );
|
|
|
+ const indices = [];
|
|
|
+
|
|
|
+ for ( let i = 0; i < positionAttribute.count; i += 3 ) {
|
|
|
+
|
|
|
+ indices.push( i, i + 1, i + 2 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry.setIndex( indices );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // sort index
|
|
|
+
|
|
|
+ const index = geometry.getIndex();
|
|
|
+
|
|
|
+ const newIndices = [];
|
|
|
+
|
|
|
+ for ( let i = 0; i < groups.length; i ++ ) {
|
|
|
+
|
|
|
+ const group = groups[ i ];
|
|
|
+
|
|
|
+ const groupStart = group.start;
|
|
|
+ const groupLength = groupStart + group.count;
|
|
|
+
|
|
|
+ for ( let j = groupStart; j < groupLength; j ++ ) {
|
|
|
+
|
|
|
+ newIndices.push( index.getX( j ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry.dispose(); // Required to force buffer recreation
|
|
|
+ geometry.setIndex( newIndices );
|
|
|
+
|
|
|
+ // update groups indices
|
|
|
+
|
|
|
+ let start = 0;
|
|
|
+
|
|
|
+ for ( let i = 0; i < groups.length; i ++ ) {
|
|
|
+
|
|
|
+ const group = groups[ i ];
|
|
|
+
|
|
|
+ group.start = start;
|
|
|
+ start += group.count;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // merge groups
|
|
|
+
|
|
|
+ let currentGroup = groups[ 0 ];
|
|
|
+
|
|
|
+ geometry.groups = [ currentGroup ];
|
|
|
+
|
|
|
+ for ( let i = 1; i < groups.length; i ++ ) {
|
|
|
+
|
|
|
+ const group = groups[ i ];
|
|
|
+
|
|
|
+ if ( currentGroup.materialIndex === group.materialIndex ) {
|
|
|
+
|
|
|
+ currentGroup.count += group.count;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ currentGroup = group;
|
|
|
+ geometry.groups.push( currentGroup );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return geometry;
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
export {
|
|
|
computeTangents,
|
|
@@ -1006,4 +1106,5 @@ export {
|
|
|
mergeVertices,
|
|
|
toTrianglesDrawMode,
|
|
|
computeMorphedAttributes,
|
|
|
+ mergeGroups
|
|
|
};
|