whs
Version:
Super-fast 3D framework for Web Applications & Games. Based on Three.js
135 lines (124 loc) • 2.89 kB
JavaScript
import {
Mesh,
TorusKnotBufferGeometry,
TorusKnotGeometry
} from 'three';
import {MeshComponent} from '../../core/MeshComponent';
/**
* @class Torusknot
* @category components/meshes
* @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TorusKnotGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torusknot, and adding it to app</caption>
* new Torusknot({
* geometry: {
* radius:5,
* tube: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: {
* y: 100
* }
* }).addTo(app);
*/
class Torusknot extends MeshComponent {
/**
* Default values for parameters
* @member {Object} module:components/meshes.Torusknot#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 64,
* tubularSegments: 8,
* p: 2,
* q: 3
* }
* }
* </pre>
*/
static defaults = {
...MeshComponent.defaults,
geometry: {
radius: 100,
tube: 40,
radialSegments: 64,
tubularSegments: 8,
p: 2,
q: 3
}
};
/**
* Instructions
* @member {Object} module:components/meshes.Torusknot#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'p',
* 'q'
* ]
* }
* </pre>
*/
static instructions = {
...MeshComponent.instructions,
geometry: [
'radius',
'tube',
'radialSegments',
'tubularSegments',
'p',
'q'
]
};
constructor(params = {}) {
super(params, Torusknot.defaults, Torusknot.instructions);
if (params.build) {
this.build(params);
super.wrap();
}
}
/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Torusknot
*/
build(params = this.params) {
const {geometry, material} = this.applyBridge({
geometry: this.buildGeometry(params),
material: params.material
});
return this.applyBridge({mesh: new Mesh(geometry, material)}).mesh;
}
buildGeometry(params = {}) {
const GConstruct = params.buffer ? TorusKnotBufferGeometry : TorusKnotGeometry;
return new GConstruct(
params.geometry.radius,
params.geometry.tube,
params.geometry.radialSegments,
params.geometry.tubularSegments,
params.geometry.p,
params.geometry.q
);
}
}
export {
Torusknot
};