Spaces:
Running
Running
/** | |
* @author jonobr1 / http://jonobr1.com | |
* @author Mugen87 / https://github.com/Mugen87 | |
*/ | |
import { Geometry } from '../core/Geometry.js'; | |
import { BufferGeometry } from '../core/BufferGeometry.js'; | |
import { Float32BufferAttribute } from '../core/BufferAttribute.js'; | |
import { ShapeUtils } from '../extras/ShapeUtils.js'; | |
// ShapeGeometry | |
function ShapeGeometry( shapes, curveSegments ) { | |
Geometry.call( this ); | |
this.type = 'ShapeGeometry'; | |
if ( typeof curveSegments === 'object' ) { | |
console.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' ); | |
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; | |
ShapeGeometry.prototype.toJSON = function () { | |
var data = Geometry.prototype.toJSON.call( this ); | |
var shapes = this.parameters.shapes; | |
return toJSON( shapes, data ); | |
}; | |
// ShapeBufferGeometry | |
function ShapeBufferGeometry( shapes, curveSegments ) { | |
BufferGeometry.call( this ); | |
this.type = 'ShapeBufferGeometry'; | |
this.parameters = { | |
shapes: shapes, | |
curveSegments: curveSegments | |
}; | |
curveSegments = curveSegments || 12; | |
// buffers | |
var indices = []; | |
var vertices = []; | |
var normals = []; | |
var uvs = []; | |
// helper variables | |
var groupStart = 0; | |
var groupCount = 0; | |
// allow single and array values for "shapes" parameter | |
if ( Array.isArray( shapes ) === false ) { | |
addShape( shapes ); | |
} else { | |
for ( var i = 0; i < shapes.length; i ++ ) { | |
addShape( shapes[ i ] ); | |
this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support | |
groupStart += groupCount; | |
groupCount = 0; | |
} | |
} | |
// build geometry | |
this.setIndex( indices ); | |
this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); | |
this.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) ); | |
this.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) ); | |
// helper functions | |
function addShape( shape ) { | |
var i, l, shapeHole; | |
var indexOffset = vertices.length / 3; | |
var points = shape.extractPoints( curveSegments ); | |
var shapeVertices = points.shape; | |
var shapeHoles = points.holes; | |
// check direction of vertices | |
if ( ShapeUtils.isClockWise( shapeVertices ) === false ) { | |
shapeVertices = shapeVertices.reverse(); | |
} | |
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { | |
shapeHole = shapeHoles[ i ]; | |
if ( ShapeUtils.isClockWise( shapeHole ) === true ) { | |
shapeHoles[ i ] = shapeHole.reverse(); | |
} | |
} | |
var faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles ); | |
// join vertices of inner and outer paths to a single array | |
for ( i = 0, l = shapeHoles.length; i < l; i ++ ) { | |
shapeHole = shapeHoles[ i ]; | |
shapeVertices = shapeVertices.concat( shapeHole ); | |
} | |
// vertices, normals, uvs | |
for ( i = 0, l = shapeVertices.length; i < l; i ++ ) { | |
var vertex = shapeVertices[ i ]; | |
vertices.push( vertex.x, vertex.y, 0 ); | |
normals.push( 0, 0, 1 ); | |
uvs.push( vertex.x, vertex.y ); // world uvs | |
} | |
// incides | |
for ( i = 0, l = faces.length; i < l; i ++ ) { | |
var face = faces[ i ]; | |
var a = face[ 0 ] + indexOffset; | |
var b = face[ 1 ] + indexOffset; | |
var c = face[ 2 ] + indexOffset; | |
indices.push( a, b, c ); | |
groupCount += 3; | |
} | |
} | |
} | |
ShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype ); | |
ShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry; | |
ShapeBufferGeometry.prototype.toJSON = function () { | |
var data = BufferGeometry.prototype.toJSON.call( this ); | |
var shapes = this.parameters.shapes; | |
return toJSON( shapes, data ); | |
}; | |
// | |
function toJSON( shapes, data ) { | |
data.shapes = []; | |
if ( Array.isArray( shapes ) ) { | |
for ( var i = 0, l = shapes.length; i < l; i ++ ) { | |
var shape = shapes[ i ]; | |
data.shapes.push( shape.uuid ); | |
} | |
} else { | |
data.shapes.push( shapes.uuid ); | |
} | |
return data; | |
} | |
export { ShapeGeometry, ShapeBufferGeometry }; | |