|
@@ -27349,136 +27349,174 @@
|
|
|
LatheGeometry.prototype.constructor = LatheGeometry;
|
|
|
|
|
|
/**
|
|
|
- * @author jonobr1 / http://jonobr1.com
|
|
|
- *
|
|
|
- * Creates a one-sided polygonal geometry from a path shape. Similar to
|
|
|
- * ExtrudeGeometry.
|
|
|
- *
|
|
|
- * parameters = {
|
|
|
- *
|
|
|
- * curveSegments: <int>, // number of points on the curves. NOT USED AT THE MOMENT.
|
|
|
+ * @author Mugen87 / https://github.com/Mugen87
|
|
|
*
|
|
|
- * material: <int> // material index for front and back faces
|
|
|
- * uvGenerator: <Object> // object that provides UV generator functions
|
|
|
+ * Creates a one-sided polygonal geometry from one or more shapes.
|
|
|
*
|
|
|
- * }
|
|
|
**/
|
|
|
|
|
|
- function ShapeGeometry( shapes, options ) {
|
|
|
+ function ShapeBufferGeometry( shapes, curveSegments ) {
|
|
|
|
|
|
- Geometry.call( this );
|
|
|
+ BufferGeometry.call( this );
|
|
|
|
|
|
- this.type = 'ShapeGeometry';
|
|
|
+ this.type = 'ShapeBufferGeometry';
|
|
|
|
|
|
- if ( Array.isArray( shapes ) === false ) shapes = [ shapes ];
|
|
|
+ this.parameters = {
|
|
|
+ shapes: shapes,
|
|
|
+ curveSegments: curveSegments
|
|
|
+ };
|
|
|
|
|
|
- this.addShapeList( shapes, options );
|
|
|
+ curveSegments = curveSegments || 12;
|
|
|
|
|
|
- this.computeFaceNormals();
|
|
|
+ var vertices = [];
|
|
|
+ var normals = [];
|
|
|
+ var uvs = [];
|
|
|
+ var indices = [];
|
|
|
|
|
|
- }
|
|
|
+ var groupStart = 0;
|
|
|
+ var groupCount = 0;
|
|
|
|
|
|
- ShapeGeometry.prototype = Object.create( Geometry.prototype );
|
|
|
- ShapeGeometry.prototype.constructor = ShapeGeometry;
|
|
|
+ // allow single and array values for "shapes" parameter
|
|
|
|
|
|
- /**
|
|
|
- * Add an array of shapes to THREE.ShapeGeometry.
|
|
|
- */
|
|
|
- ShapeGeometry.prototype.addShapeList = function ( shapes, options ) {
|
|
|
+ if ( Array.isArray( shapes ) === false ) {
|
|
|
+
|
|
|
+ addShape( shapes );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ for ( var i = 0; i < shapes.length; i++ ) {
|
|
|
|
|
|
- for ( var i = 0, l = shapes.length; i < l; i ++ ) {
|
|
|
+ addShape( shapes[ i ] );
|
|
|
|
|
|
- this.addShape( shapes[ i ], options );
|
|
|
+ this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support
|
|
|
+
|
|
|
+ groupStart += groupCount;
|
|
|
+ groupCount = 0;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- return this;
|
|
|
+ // build geometry
|
|
|
|
|
|
- };
|
|
|
+ this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute )( indices, 1 ) );
|
|
|
+ this.addAttribute( 'position', Float32Attribute( vertices, 3 ) );
|
|
|
+ this.addAttribute( 'normal', Float32Attribute( normals, 3 ) );
|
|
|
+ this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );
|
|
|
|
|
|
- /**
|
|
|
- * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.
|
|
|
- */
|
|
|
- ShapeGeometry.prototype.addShape = function ( shape, options ) {
|
|
|
|
|
|
- if ( options === undefined ) options = {};
|
|
|
- var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
|
|
|
+ // helper functions
|
|
|
|
|
|
- var material = options.material;
|
|
|
- var uvgen = options.UVGenerator === undefined ? ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;
|
|
|
+ function addShape( shape ) {
|
|
|
|
|
|
- //
|
|
|
+ var i, l, shapeHole;
|
|
|
|
|
|
- var i, l, hole;
|
|
|
+ var indexOffset = vertices.length / 3;
|
|
|
+ var points = shape.extractPoints( curveSegments );
|
|
|
|
|
|
- var shapesOffset = this.vertices.length;
|
|
|
- var shapePoints = shape.extractPoints( curveSegments );
|
|
|
+ var shapeVertices = points.shape;
|
|
|
+ var shapeHoles = points.holes;
|
|
|
|
|
|
- var vertices = shapePoints.shape;
|
|
|
- var holes = shapePoints.holes;
|
|
|
+ // check direction of vertices
|
|
|
|
|
|
- var reverse = ! ShapeUtils.isClockWise( vertices );
|
|
|
+ if ( ShapeUtils.isClockWise( shapeVertices ) === false ) {
|
|
|
|
|
|
- if ( reverse ) {
|
|
|
+ shapeVertices = shapeVertices.reverse();
|
|
|
|
|
|
- vertices = vertices.reverse();
|
|
|
+ // also check if holes are in the opposite direction
|
|
|
|
|
|
- // Maybe we should also check if holes are in the opposite direction, just to be safe...
|
|
|
+ for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
|
|
|
|
|
- for ( i = 0, l = holes.length; i < l; i ++ ) {
|
|
|
+ shapeHole = shapeHoles[ i ];
|
|
|
|
|
|
- hole = holes[ i ];
|
|
|
+ if ( ShapeUtils.isClockWise( shapeHole ) === true ) {
|
|
|
|
|
|
- if ( ShapeUtils.isClockWise( hole ) ) {
|
|
|
+ shapeHoles[ i ] = shapeHole.reverse();
|
|
|
|
|
|
- holes[ i ] = hole.reverse();
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- reverse = false;
|
|
|
+ var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );
|
|
|
|
|
|
- }
|
|
|
+ // join vertices of inner and outer paths to a single array
|
|
|
|
|
|
- var faces = ShapeUtils.triangulateShape( vertices, holes );
|
|
|
+ for ( i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
|
|
|
|
|
- // Vertices
|
|
|
+ shapeHole = shapeHoles[ i ];
|
|
|
+ shapeVertices = shapeVertices.concat( shapeHole );
|
|
|
|
|
|
- for ( i = 0, l = holes.length; i < l; i ++ ) {
|
|
|
+ }
|
|
|
|
|
|
- hole = holes[ i ];
|
|
|
- vertices = vertices.concat( hole );
|
|
|
+ // vertices, normals, uvs
|
|
|
|
|
|
- }
|
|
|
+ for ( i = 0, l = shapeVertices.length; i < l; i ++ ) {
|
|
|
|
|
|
- //
|
|
|
+ var vertex = shapeVertices[ i ];
|
|
|
|
|
|
- var vert, vlen = vertices.length;
|
|
|
- var face, flen = faces.length;
|
|
|
+ vertices.push( vertex.x, vertex.y, 0 );
|
|
|
+ normals.push( 0, 0, 1 );
|
|
|
+ uvs.push( vertex.x, vertex.y ); // world uvs
|
|
|
|
|
|
- for ( i = 0; i < vlen; i ++ ) {
|
|
|
+ }
|
|
|
|
|
|
- vert = vertices[ i ];
|
|
|
+ // incides
|
|
|
+
|
|
|
+ for ( i = 0, l = faces.length; i < l; i ++ ) {
|
|
|
+
|
|
|
+ var face = faces[ i ];
|
|
|
|
|
|
- this.vertices.push( new Vector3( vert.x, vert.y, 0 ) );
|
|
|
+ var a = face[ 0 ] + indexOffset;
|
|
|
+ var b = face[ 1 ] + indexOffset;
|
|
|
+ var c = face[ 2 ] + indexOffset;
|
|
|
+
|
|
|
+ indices.push( a, b, c );
|
|
|
+ groupCount += 3;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- for ( i = 0; i < flen; i ++ ) {
|
|
|
+ }
|
|
|
+
|
|
|
+ ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );
|
|
|
+ ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @author jonobr1 / http://jonobr1.com
|
|
|
+ *
|
|
|
+ * Creates a one-sided polygonal geometry from a path shape.
|
|
|
+ *
|
|
|
+ **/
|
|
|
+
|
|
|
+ function ShapeGeometry( shapes, curveSegments ) {
|
|
|
+
|
|
|
+ Geometry.call( this );
|
|
|
+
|
|
|
+ this.type = 'ShapeGeometry';
|
|
|
|
|
|
- face = faces[ i ];
|
|
|
+ if ( typeof curveSegments === 'object' ) {
|
|
|
|
|
|
- var a = face[ 0 ] + shapesOffset;
|
|
|
- var b = face[ 1 ] + shapesOffset;
|
|
|
- var c = face[ 2 ] + shapesOffset;
|
|
|
+ console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );
|
|
|
|
|
|
- this.faces.push( new Face3( a, b, c, null, null, material ) );
|
|
|
- this.faceVertexUvs[ 0 ].push( uvgen.generateTopUV( this, a, b, c ) );
|
|
|
+ curveSegments = curveSegments.curveSegments;
|
|
|
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ this.parameters = {
|
|
|
+ shapes: shapes,
|
|
|
+ curveSegments: curveSegments
|
|
|
+ };
|
|
|
+
|
|
|
+ this.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );
|
|
|
+ this.mergeVertices();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ ShapeGeometry.prototype = Object.create( Geometry.prototype );
|
|
|
+ ShapeGeometry.prototype.constructor = ShapeGeometry;
|
|
|
|
|
|
/**
|
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
@@ -28125,6 +28163,7 @@
|
|
|
LatheGeometry: LatheGeometry,
|
|
|
LatheBufferGeometry: LatheBufferGeometry,
|
|
|
ShapeGeometry: ShapeGeometry,
|
|
|
+ ShapeBufferGeometry: ShapeBufferGeometry,
|
|
|
ExtrudeGeometry: ExtrudeGeometry,
|
|
|
EdgesGeometry: EdgesGeometry,
|
|
|
ConeGeometry: ConeGeometry,
|
|
@@ -42278,6 +42317,7 @@
|
|
|
exports.LatheGeometry = LatheGeometry;
|
|
|
exports.LatheBufferGeometry = LatheBufferGeometry;
|
|
|
exports.ShapeGeometry = ShapeGeometry;
|
|
|
+ exports.ShapeBufferGeometry = ShapeBufferGeometry;
|
|
|
exports.ExtrudeGeometry = ExtrudeGeometry;
|
|
|
exports.EdgesGeometry = EdgesGeometry;
|
|
|
exports.ConeGeometry = ConeGeometry;
|