From 17dcdb206505c6ce7e2ea2c6667fe861cfedc7a7 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Tue, 12 Jan 2021 21:53:43 +0100 Subject: [PATCH] Examples: Remove SubdivisionModifier. --- examples/files.json | 1 - examples/js/modifiers/SubdivisionModifier.js | 421 ----------------- .../jsm/modifiers/SubdivisionModifier.d.ts | 14 - examples/jsm/modifiers/SubdivisionModifier.js | 431 ------------------ .../webgl_modifier_subdivision.jpg | Bin 19881 -> 0 bytes examples/webgl_modifier_subdivision.html | 136 ------ utils/modularize.js | 1 - 7 files changed, 1004 deletions(-) delete mode 100644 examples/js/modifiers/SubdivisionModifier.js delete mode 100644 examples/jsm/modifiers/SubdivisionModifier.d.ts delete mode 100644 examples/jsm/modifiers/SubdivisionModifier.js delete mode 100644 examples/screenshots/webgl_modifier_subdivision.jpg delete mode 100644 examples/webgl_modifier_subdivision.html diff --git a/examples/files.json b/examples/files.json index fdc1630818f358..b121161f9e2964 100644 --- a/examples/files.json +++ b/examples/files.json @@ -185,7 +185,6 @@ "webgl_modifier_curve_instanced", "webgl_modifier_edgesplit", "webgl_modifier_simplifier", - "webgl_modifier_subdivision", "webgl_modifier_tessellation", "webgl_morphtargets", "webgl_morphtargets_horse", diff --git a/examples/js/modifiers/SubdivisionModifier.js b/examples/js/modifiers/SubdivisionModifier.js deleted file mode 100644 index 3e4472d5d60ca6..00000000000000 --- a/examples/js/modifiers/SubdivisionModifier.js +++ /dev/null @@ -1,421 +0,0 @@ -/** - * Subdivision Geometry Modifier - * using Loop Subdivision Scheme - * - * References: - * http://graphics.stanford.edu/~mdfisher/subdivision.html - * http://www.holmes3d.net/graphics/subdivision/ - * http://www.cs.rutgers.edu/~decarlo/readings/subdiv-sg00c.pdf - * - * Known Issues: - * - currently doesn't handle "Sharp Edges" - */ - -THREE.SubdivisionModifier = function ( subdivisions ) { - - this.subdivisions = ( subdivisions === undefined ) ? 1 : subdivisions; - -}; - -// Applies the "modify" pattern -THREE.SubdivisionModifier.prototype.modify = function ( geometry ) { - - var isBufferGeometry = geometry.isBufferGeometry; - - if ( isBufferGeometry ) { - - geometry = new THREE.Geometry().fromBufferGeometry( geometry ); - - } else { - - geometry = geometry.clone(); - - } - - geometry.mergeVertices( 6 ); - - var repeats = this.subdivisions; - - while ( repeats -- > 0 ) { - - this.smooth( geometry ); - - } - - geometry.computeFaceNormals(); - geometry.computeVertexNormals(); - - if ( isBufferGeometry ) { - - return new THREE.BufferGeometry().fromGeometry( geometry ); - - } else { - - return geometry; - - } - -}; - -( function () { - - // Some constants - var ABC = [ 'a', 'b', 'c' ]; - - - function getEdge( a, b, map ) { - - var vertexIndexA = Math.min( a, b ); - var vertexIndexB = Math.max( a, b ); - - var key = vertexIndexA + '_' + vertexIndexB; - - return map[ key ]; - - } - - - function processEdge( a, b, vertices, map, face, metaVertices ) { - - var vertexIndexA = Math.min( a, b ); - var vertexIndexB = Math.max( a, b ); - - var key = vertexIndexA + '_' + vertexIndexB; - - var edge; - - if ( key in map ) { - - edge = map[ key ]; - - } else { - - var vertexA = vertices[ vertexIndexA ]; - var vertexB = vertices[ vertexIndexB ]; - - edge = { - - a: vertexA, // pointer reference - b: vertexB, - newEdge: null, - // aIndex: a, // numbered reference - // bIndex: b, - faces: [] // pointers to face - - }; - - map[ key ] = edge; - - } - - edge.faces.push( face ); - - metaVertices[ a ].edges.push( edge ); - metaVertices[ b ].edges.push( edge ); - - - } - - function generateLookups( vertices, faces, metaVertices, edges ) { - - var i, il, face; - - for ( i = 0, il = vertices.length; i < il; i ++ ) { - - metaVertices[ i ] = { edges: [] }; - - } - - for ( i = 0, il = faces.length; i < il; i ++ ) { - - face = faces[ i ]; - - processEdge( face.a, face.b, vertices, edges, face, metaVertices ); - processEdge( face.b, face.c, vertices, edges, face, metaVertices ); - processEdge( face.c, face.a, vertices, edges, face, metaVertices ); - - } - - } - - function newFace( newFaces, a, b, c, materialIndex ) { - - newFaces.push( new THREE.Face3( a, b, c, undefined, undefined, materialIndex ) ); - - } - - function midpoint( a, b ) { - - return ( Math.abs( b - a ) / 2 ) + Math.min( a, b ); - - } - - function newUv( newUvs, a, b, c ) { - - newUvs.push( [ a.clone(), b.clone(), c.clone() ] ); - - } - - ///////////////////////////// - - // Performs one iteration of Subdivision - THREE.SubdivisionModifier.prototype.smooth = function ( geometry ) { - - var tmp = new THREE.Vector3(); - - var oldVertices, oldFaces, oldUvs; - var newVertices, newFaces, newUVs = []; - - var n, i, il, j, k; - var metaVertices, sourceEdges; - - // new stuff. - var sourceEdges, newEdgeVertices, newSourceVertices; - - oldVertices = geometry.vertices; // { x, y, z} - oldFaces = geometry.faces; // { a: oldVertex1, b: oldVertex2, c: oldVertex3 } - oldUvs = geometry.faceVertexUvs; - - var hasUvs = oldUvs[ 0 ] !== undefined && oldUvs[ 0 ].length > 0; - - if ( hasUvs ) { - - for ( var j = 0; j < oldUvs.length; j ++ ) { - - newUVs.push( [] ); - - } - - } - - /****************************************************** - * - * Step 0: Preprocess Geometry to Generate edges Lookup - * - *******************************************************/ - - metaVertices = new Array( oldVertices.length ); - sourceEdges = {}; // Edge => { oldVertex1, oldVertex2, faces[] } - - generateLookups( oldVertices, oldFaces, metaVertices, sourceEdges ); - - - /****************************************************** - * - * Step 1. - * For each edge, create a new Edge Vertex, - * then position it. - * - *******************************************************/ - - newEdgeVertices = []; - var other, currentEdge, newEdge, face; - var edgeVertexWeight, adjacentVertexWeight, connectedFaces; - - for ( i in sourceEdges ) { - - currentEdge = sourceEdges[ i ]; - newEdge = new THREE.Vector3(); - - edgeVertexWeight = 3 / 8; - adjacentVertexWeight = 1 / 8; - - connectedFaces = currentEdge.faces.length; - - // check how many linked faces. 2 should be correct. - if ( connectedFaces != 2 ) { - - // if length is not 2, handle condition - edgeVertexWeight = 0.5; - adjacentVertexWeight = 0; - - if ( connectedFaces != 1 ) { - - // console.warn( 'Subdivision Modifier: Number of connected faces != 2, is: ', connectedFaces, currentEdge ); - - } - - } - - newEdge.addVectors( currentEdge.a, currentEdge.b ).multiplyScalar( edgeVertexWeight ); - - tmp.set( 0, 0, 0 ); - - for ( j = 0; j < connectedFaces; j ++ ) { - - face = currentEdge.faces[ j ]; - - for ( k = 0; k < 3; k ++ ) { - - other = oldVertices[ face[ ABC[ k ] ] ]; - if ( other !== currentEdge.a && other !== currentEdge.b ) break; - - } - - tmp.add( other ); - - } - - tmp.multiplyScalar( adjacentVertexWeight ); - newEdge.add( tmp ); - - currentEdge.newEdge = newEdgeVertices.length; - newEdgeVertices.push( newEdge ); - - // console.log(currentEdge, newEdge); - - } - - /****************************************************** - * - * Step 2. - * Reposition each source vertices. - * - *******************************************************/ - - var beta, sourceVertexWeight, connectingVertexWeight; - var connectingEdge, connectingEdges, oldVertex, newSourceVertex; - newSourceVertices = []; - - for ( i = 0, il = oldVertices.length; i < il; i ++ ) { - - oldVertex = oldVertices[ i ]; - - // find all connecting edges (using lookupTable) - connectingEdges = metaVertices[ i ].edges; - n = connectingEdges.length; - - if ( n == 3 ) { - - beta = 3 / 16; - - } else if ( n > 3 ) { - - beta = 3 / ( 8 * n ); // Warren's modified formula - - } - - // Loop's original beta formula - // beta = 1 / n * ( 5/8 - Math.pow( 3/8 + 1/4 * Math.cos( 2 * Math. PI / n ), 2) ); - - sourceVertexWeight = 1 - n * beta; - connectingVertexWeight = beta; - - if ( n <= 2 ) { - - // crease and boundary rules - // console.warn('crease and boundary rules'); - - if ( n == 2 ) { - - // console.warn( '2 connecting edges', connectingEdges ); - sourceVertexWeight = 3 / 4; - connectingVertexWeight = 1 / 8; - - // sourceVertexWeight = 1; - // connectingVertexWeight = 0; - - } else if ( n == 1 ) { - - // console.warn( 'only 1 connecting edge' ); - - } else if ( n == 0 ) { - - // console.warn( '0 connecting edges' ); - - } - - } - - newSourceVertex = oldVertex.clone().multiplyScalar( sourceVertexWeight ); - - tmp.set( 0, 0, 0 ); - - for ( j = 0; j < n; j ++ ) { - - connectingEdge = connectingEdges[ j ]; - other = connectingEdge.a !== oldVertex ? connectingEdge.a : connectingEdge.b; - tmp.add( other ); - - } - - tmp.multiplyScalar( connectingVertexWeight ); - newSourceVertex.add( tmp ); - - newSourceVertices.push( newSourceVertex ); - - } - - - /****************************************************** - * - * Step 3. - * Generate Faces between source vertices - * and edge vertices. - * - *******************************************************/ - - newVertices = newSourceVertices.concat( newEdgeVertices ); - var sl = newSourceVertices.length, edge1, edge2, edge3; - newFaces = []; - - var uv, x0, x1, x2; - var x3 = new THREE.Vector2(); - var x4 = new THREE.Vector2(); - var x5 = new THREE.Vector2(); - - for ( i = 0, il = oldFaces.length; i < il; i ++ ) { - - face = oldFaces[ i ]; - - // find the 3 new edges vertex of each old face - - edge1 = getEdge( face.a, face.b, sourceEdges ).newEdge + sl; - edge2 = getEdge( face.b, face.c, sourceEdges ).newEdge + sl; - edge3 = getEdge( face.c, face.a, sourceEdges ).newEdge + sl; - - // create 4 faces. - - newFace( newFaces, edge1, edge2, edge3, face.materialIndex ); - newFace( newFaces, face.a, edge1, edge3, face.materialIndex ); - newFace( newFaces, face.b, edge2, edge1, face.materialIndex ); - newFace( newFaces, face.c, edge3, edge2, face.materialIndex ); - - // create 4 new uv's - - if ( hasUvs ) { - - for ( var j = 0; j < oldUvs.length; j ++ ) { - - uv = oldUvs[ j ][ i ]; - - x0 = uv[ 0 ]; - x1 = uv[ 1 ]; - x2 = uv[ 2 ]; - - x3.set( midpoint( x0.x, x1.x ), midpoint( x0.y, x1.y ) ); - x4.set( midpoint( x1.x, x2.x ), midpoint( x1.y, x2.y ) ); - x5.set( midpoint( x0.x, x2.x ), midpoint( x0.y, x2.y ) ); - - newUv( newUVs[ j ], x3, x4, x5 ); - newUv( newUVs[ j ], x0, x3, x5 ); - - newUv( newUVs[ j ], x1, x4, x3 ); - newUv( newUVs[ j ], x2, x5, x4 ); - - } - - } - - } - - // Overwrite old arrays - geometry.vertices = newVertices; - geometry.faces = newFaces; - if ( hasUvs ) geometry.faceVertexUvs = newUVs; - - // console.log('done'); - - }; - -} )(); diff --git a/examples/jsm/modifiers/SubdivisionModifier.d.ts b/examples/jsm/modifiers/SubdivisionModifier.d.ts deleted file mode 100644 index 74a1512e49f228..00000000000000 --- a/examples/jsm/modifiers/SubdivisionModifier.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { - BufferGeometry, - Geometry -} from '../../../src/Three'; - -export class SubdivisionModifier { - - constructor( subdivisions?: number ); - subdivisions: number; - - modify( geometry: Geometry | BufferGeometry ): Geometry | BufferGeometry; - smooth( geometry: Geometry ): void; - -} diff --git a/examples/jsm/modifiers/SubdivisionModifier.js b/examples/jsm/modifiers/SubdivisionModifier.js deleted file mode 100644 index bdaa1e3f2dc928..00000000000000 --- a/examples/jsm/modifiers/SubdivisionModifier.js +++ /dev/null @@ -1,431 +0,0 @@ -import { - BufferGeometry, - Face3, - Geometry, - Vector2, - Vector3 -} from '../../../build/three.module.js'; - -/** - * Subdivision Geometry Modifier - * using Loop Subdivision Scheme - * - * References: - * http://graphics.stanford.edu/~mdfisher/subdivision.html - * http://www.holmes3d.net/graphics/subdivision/ - * http://www.cs.rutgers.edu/~decarlo/readings/subdiv-sg00c.pdf - * - * Known Issues: - * - currently doesn't handle "Sharp Edges" - */ - -var SubdivisionModifier = function ( subdivisions ) { - - this.subdivisions = ( subdivisions === undefined ) ? 1 : subdivisions; - -}; - -// Applies the "modify" pattern -SubdivisionModifier.prototype.modify = function ( geometry ) { - - var isBufferGeometry = geometry.isBufferGeometry; - - if ( isBufferGeometry ) { - - geometry = new Geometry().fromBufferGeometry( geometry ); - - } else { - - geometry = geometry.clone(); - - } - - geometry.mergeVertices( 6 ); - - var repeats = this.subdivisions; - - while ( repeats -- > 0 ) { - - this.smooth( geometry ); - - } - - geometry.computeFaceNormals(); - geometry.computeVertexNormals(); - - if ( isBufferGeometry ) { - - return new BufferGeometry().fromGeometry( geometry ); - - } else { - - return geometry; - - } - -}; - -( function () { - - // Some constants - var ABC = [ 'a', 'b', 'c' ]; - - - function getEdge( a, b, map ) { - - var vertexIndexA = Math.min( a, b ); - var vertexIndexB = Math.max( a, b ); - - var key = vertexIndexA + '_' + vertexIndexB; - - return map[ key ]; - - } - - - function processEdge( a, b, vertices, map, face, metaVertices ) { - - var vertexIndexA = Math.min( a, b ); - var vertexIndexB = Math.max( a, b ); - - var key = vertexIndexA + '_' + vertexIndexB; - - var edge; - - if ( key in map ) { - - edge = map[ key ]; - - } else { - - var vertexA = vertices[ vertexIndexA ]; - var vertexB = vertices[ vertexIndexB ]; - - edge = { - - a: vertexA, // pointer reference - b: vertexB, - newEdge: null, - // aIndex: a, // numbered reference - // bIndex: b, - faces: [] // pointers to face - - }; - - map[ key ] = edge; - - } - - edge.faces.push( face ); - - metaVertices[ a ].edges.push( edge ); - metaVertices[ b ].edges.push( edge ); - - - } - - function generateLookups( vertices, faces, metaVertices, edges ) { - - var i, il, face; - - for ( i = 0, il = vertices.length; i < il; i ++ ) { - - metaVertices[ i ] = { edges: [] }; - - } - - for ( i = 0, il = faces.length; i < il; i ++ ) { - - face = faces[ i ]; - - processEdge( face.a, face.b, vertices, edges, face, metaVertices ); - processEdge( face.b, face.c, vertices, edges, face, metaVertices ); - processEdge( face.c, face.a, vertices, edges, face, metaVertices ); - - } - - } - - function newFace( newFaces, a, b, c, materialIndex ) { - - newFaces.push( new Face3( a, b, c, undefined, undefined, materialIndex ) ); - - } - - function midpoint( a, b ) { - - return ( Math.abs( b - a ) / 2 ) + Math.min( a, b ); - - } - - function newUv( newUvs, a, b, c ) { - - newUvs.push( [ a.clone(), b.clone(), c.clone() ] ); - - } - - ///////////////////////////// - - // Performs one iteration of Subdivision - SubdivisionModifier.prototype.smooth = function ( geometry ) { - - var tmp = new Vector3(); - - var oldVertices, oldFaces, oldUvs; - var newVertices, newFaces, newUVs = []; - - var n, i, il, j, k; - var metaVertices, sourceEdges; - - // new stuff. - var sourceEdges, newEdgeVertices, newSourceVertices; - - oldVertices = geometry.vertices; // { x, y, z} - oldFaces = geometry.faces; // { a: oldVertex1, b: oldVertex2, c: oldVertex3 } - oldUvs = geometry.faceVertexUvs; - - var hasUvs = oldUvs[ 0 ] !== undefined && oldUvs[ 0 ].length > 0; - - if ( hasUvs ) { - - for ( var j = 0; j < oldUvs.length; j ++ ) { - - newUVs.push( [] ); - - } - - } - - /****************************************************** - * - * Step 0: Preprocess Geometry to Generate edges Lookup - * - *******************************************************/ - - metaVertices = new Array( oldVertices.length ); - sourceEdges = {}; // Edge => { oldVertex1, oldVertex2, faces[] } - - generateLookups( oldVertices, oldFaces, metaVertices, sourceEdges ); - - - /****************************************************** - * - * Step 1. - * For each edge, create a new Edge Vertex, - * then position it. - * - *******************************************************/ - - newEdgeVertices = []; - var other, currentEdge, newEdge, face; - var edgeVertexWeight, adjacentVertexWeight, connectedFaces; - - for ( i in sourceEdges ) { - - currentEdge = sourceEdges[ i ]; - newEdge = new Vector3(); - - edgeVertexWeight = 3 / 8; - adjacentVertexWeight = 1 / 8; - - connectedFaces = currentEdge.faces.length; - - // check how many linked faces. 2 should be correct. - if ( connectedFaces != 2 ) { - - // if length is not 2, handle condition - edgeVertexWeight = 0.5; - adjacentVertexWeight = 0; - - if ( connectedFaces != 1 ) { - - // console.warn( 'Subdivision Modifier: Number of connected faces != 2, is: ', connectedFaces, currentEdge ); - - } - - } - - newEdge.addVectors( currentEdge.a, currentEdge.b ).multiplyScalar( edgeVertexWeight ); - - tmp.set( 0, 0, 0 ); - - for ( j = 0; j < connectedFaces; j ++ ) { - - face = currentEdge.faces[ j ]; - - for ( k = 0; k < 3; k ++ ) { - - other = oldVertices[ face[ ABC[ k ] ] ]; - if ( other !== currentEdge.a && other !== currentEdge.b ) break; - - } - - tmp.add( other ); - - } - - tmp.multiplyScalar( adjacentVertexWeight ); - newEdge.add( tmp ); - - currentEdge.newEdge = newEdgeVertices.length; - newEdgeVertices.push( newEdge ); - - // console.log(currentEdge, newEdge); - - } - - /****************************************************** - * - * Step 2. - * Reposition each source vertices. - * - *******************************************************/ - - var beta, sourceVertexWeight, connectingVertexWeight; - var connectingEdge, connectingEdges, oldVertex, newSourceVertex; - newSourceVertices = []; - - for ( i = 0, il = oldVertices.length; i < il; i ++ ) { - - oldVertex = oldVertices[ i ]; - - // find all connecting edges (using lookupTable) - connectingEdges = metaVertices[ i ].edges; - n = connectingEdges.length; - - if ( n == 3 ) { - - beta = 3 / 16; - - } else if ( n > 3 ) { - - beta = 3 / ( 8 * n ); // Warren's modified formula - - } - - // Loop's original beta formula - // beta = 1 / n * ( 5/8 - Math.pow( 3/8 + 1/4 * Math.cos( 2 * Math. PI / n ), 2) ); - - sourceVertexWeight = 1 - n * beta; - connectingVertexWeight = beta; - - if ( n <= 2 ) { - - // crease and boundary rules - // console.warn('crease and boundary rules'); - - if ( n == 2 ) { - - // console.warn( '2 connecting edges', connectingEdges ); - sourceVertexWeight = 3 / 4; - connectingVertexWeight = 1 / 8; - - // sourceVertexWeight = 1; - // connectingVertexWeight = 0; - - } else if ( n == 1 ) { - - // console.warn( 'only 1 connecting edge' ); - - } else if ( n == 0 ) { - - // console.warn( '0 connecting edges' ); - - } - - } - - newSourceVertex = oldVertex.clone().multiplyScalar( sourceVertexWeight ); - - tmp.set( 0, 0, 0 ); - - for ( j = 0; j < n; j ++ ) { - - connectingEdge = connectingEdges[ j ]; - other = connectingEdge.a !== oldVertex ? connectingEdge.a : connectingEdge.b; - tmp.add( other ); - - } - - tmp.multiplyScalar( connectingVertexWeight ); - newSourceVertex.add( tmp ); - - newSourceVertices.push( newSourceVertex ); - - } - - - /****************************************************** - * - * Step 3. - * Generate Faces between source vertices - * and edge vertices. - * - *******************************************************/ - - newVertices = newSourceVertices.concat( newEdgeVertices ); - var sl = newSourceVertices.length, edge1, edge2, edge3; - newFaces = []; - - var uv, x0, x1, x2; - var x3 = new Vector2(); - var x4 = new Vector2(); - var x5 = new Vector2(); - - for ( i = 0, il = oldFaces.length; i < il; i ++ ) { - - face = oldFaces[ i ]; - - // find the 3 new edges vertex of each old face - - edge1 = getEdge( face.a, face.b, sourceEdges ).newEdge + sl; - edge2 = getEdge( face.b, face.c, sourceEdges ).newEdge + sl; - edge3 = getEdge( face.c, face.a, sourceEdges ).newEdge + sl; - - // create 4 faces. - - newFace( newFaces, edge1, edge2, edge3, face.materialIndex ); - newFace( newFaces, face.a, edge1, edge3, face.materialIndex ); - newFace( newFaces, face.b, edge2, edge1, face.materialIndex ); - newFace( newFaces, face.c, edge3, edge2, face.materialIndex ); - - // create 4 new uv's - - if ( hasUvs ) { - - for ( var j = 0; j < oldUvs.length; j ++ ) { - - uv = oldUvs[ j ][ i ]; - - x0 = uv[ 0 ]; - x1 = uv[ 1 ]; - x2 = uv[ 2 ]; - - x3.set( midpoint( x0.x, x1.x ), midpoint( x0.y, x1.y ) ); - x4.set( midpoint( x1.x, x2.x ), midpoint( x1.y, x2.y ) ); - x5.set( midpoint( x0.x, x2.x ), midpoint( x0.y, x2.y ) ); - - newUv( newUVs[ j ], x3, x4, x5 ); - newUv( newUVs[ j ], x0, x3, x5 ); - - newUv( newUVs[ j ], x1, x4, x3 ); - newUv( newUVs[ j ], x2, x5, x4 ); - - } - - } - - } - - // Overwrite old arrays - geometry.vertices = newVertices; - geometry.faces = newFaces; - if ( hasUvs ) geometry.faceVertexUvs = newUVs; - - // console.log('done'); - - }; - -} )(); - -export { SubdivisionModifier }; diff --git a/examples/screenshots/webgl_modifier_subdivision.jpg b/examples/screenshots/webgl_modifier_subdivision.jpg deleted file mode 100644 index d2a25f4dfc64c6817abe421139e77e181184692c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19881 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 RxC|+nNA-~~+#vt|CIA>xX>b4l diff --git a/examples/webgl_modifier_subdivision.html b/examples/webgl_modifier_subdivision.html deleted file mode 100644 index 49aa9b43591acd..00000000000000 --- a/examples/webgl_modifier_subdivision.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - three.js webgl - modifier - Subdivisions using Loop Subdivision Scheme - - - - - -
- three.js - subdivision modifier -
- - - - - diff --git a/utils/modularize.js b/utils/modularize.js index 05df5b3fa096c3..da6c82e484dc1e 100644 --- a/utils/modularize.js +++ b/utils/modularize.js @@ -120,7 +120,6 @@ var files = [ { path: 'modifiers/EdgeSplitModifier.js', dependencies: [ { name: 'BufferGeometryUtils', path: 'utils/BufferGeometryUtils.js' } ], ignoreList: [ 'Geometry' ] }, { path: 'modifiers/SimplifyModifier.js', dependencies: [ { name: 'BufferGeometryUtils', path: 'utils/BufferGeometryUtils.js' } ], ignoreList: [] }, - { path: 'modifiers/SubdivisionModifier.js', dependencies: [], ignoreList: [] }, { path: 'modifiers/TessellateModifier.js', dependencies: [], ignoreList: [] }, { path: 'objects/Lensflare.js', dependencies: [], ignoreList: [] },