fireball/lib/extras/core/Shape.js
2018-12-25 17:29:22 +03:30

116 lines
1.9 KiB
JavaScript

import { Path } from './Path.js';
import { _Math } from '../../math/Math.js';
/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Defines a 2d shape plane using paths.
**/
// STEP 1 Create a path.
// STEP 2 Turn path into shape.
// STEP 3 ExtrudeGeometry takes in Shape/Shapes
// STEP 3a - Extract points from each shape, turn to vertices
// STEP 3b - Triangulate each shape, add faces.
function Shape( points ) {
Path.call( this, points );
this.uuid = _Math.generateUUID();
this.type = 'Shape';
this.holes = [];
}
Shape.prototype = Object.assign( Object.create( Path.prototype ), {
constructor: Shape,
getPointsHoles: function ( divisions ) {
var holesPts = [];
for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
holesPts[ i ] = this.holes[ i ].getPoints( divisions );
}
return holesPts;
},
// get points of shape and holes (keypoints based on segments parameter)
extractPoints: function ( divisions ) {
return {
shape: this.getPoints( divisions ),
holes: this.getPointsHoles( divisions )
};
},
copy: function ( source ) {
Path.prototype.copy.call( this, source );
this.holes = [];
for ( var i = 0, l = source.holes.length; i < l; i ++ ) {
var hole = source.holes[ i ];
this.holes.push( hole.clone() );
}
return this;
},
toJSON: function () {
var data = Path.prototype.toJSON.call( this );
data.uuid = this.uuid;
data.holes = [];
for ( var i = 0, l = this.holes.length; i < l; i ++ ) {
var hole = this.holes[ i ];
data.holes.push( hole.toJSON() );
}
return data;
},
fromJSON: function ( json ) {
Path.prototype.fromJSON.call( this, json );
this.uuid = json.uuid;
this.holes = [];
for ( var i = 0, l = json.holes.length; i < l; i ++ ) {
var hole = json.holes[ i ];
this.holes.push( new Path().fromJSON( hole ) );
}
return this;
}
} );
export { Shape };