playcanvas
Version:
PlayCanvas WebGL game engine
99 lines (96 loc) • 2.96 kB
JavaScript
import { TorusGeometry } from '../../../scene/geometry/torus-geometry.js';
import { Mesh } from '../../../scene/mesh.js';
import { TriData } from '../tri-data.js';
import { Shape } from './shape.js';
const TORUS_RENDER_SEGMENTS = 80;
const TORUS_INTERSECT_SEGMENTS = 20;
class ArcShape extends Shape {
constructor(device, args = {}){
super(device, 'disk', args), this._tubeRadius = 0.01, this._ringRadius = 0.5, this._sectorAngle = 360, this._tolerance = 0.05;
this._tubeRadius = args.tubeRadius ?? this._tubeRadius;
this._ringRadius = args.ringRadius ?? this._ringRadius;
this._sectorAngle = args.sectorAngle ?? this._sectorAngle;
this._triDataCache = [
new TriData(this._createTorusGeometry(this._sectorAngle)),
new TriData(this._createTorusGeometry(360))
];
this.triData = [
this._triDataCache[0]
];
this._createRenderComponent(this.entity, [
this._createTorusMesh(this._sectorAngle),
this._createTorusMesh(360)
]);
this.show('sector');
this._update();
}
_createTorusGeometry(sectorAngle) {
return new TorusGeometry({
tubeRadius: this._tubeRadius + this._tolerance,
ringRadius: this._ringRadius,
sectorAngle: sectorAngle,
segments: TORUS_INTERSECT_SEGMENTS
});
}
_createTorusMesh(sectorAngle) {
const geom = new TorusGeometry({
tubeRadius: this._tubeRadius,
ringRadius: this._ringRadius,
sectorAngle: sectorAngle,
segments: TORUS_RENDER_SEGMENTS
});
return Mesh.fromGeometry(this.device, geom);
}
set tubeRadius(value) {
this._tubeRadius = value ?? this._tubeRadius;
this._update();
}
get tubeRadius() {
return this._tubeRadius;
}
set ringRadius(value) {
this._ringRadius = value ?? this._ringRadius;
this._update();
}
get ringRadius() {
return this._ringRadius;
}
set tolerance(value) {
this._tolerance = value ?? this._tolerance;
this._update();
}
get tolerance() {
return this._tolerance;
}
_update() {
this._triDataCache[0].fromGeometry(this._createTorusGeometry(this._sectorAngle));
this._triDataCache[1].fromGeometry(this._createTorusGeometry(360));
this.meshInstances[0].mesh = this._createTorusMesh(this._sectorAngle);
this.meshInstances[1].mesh = this._createTorusMesh(360);
}
show(state) {
switch(state){
case 'sector':
{
this.triData[0] = this._triDataCache[0];
this.meshInstances[0].visible = true;
this.meshInstances[1].visible = false;
break;
}
case 'ring':
{
this.triData[0] = this._triDataCache[1];
this.meshInstances[0].visible = false;
this.meshInstances[1].visible = true;
break;
}
case 'none':
{
this.meshInstances[0].visible = false;
this.meshInstances[1].visible = false;
break;
}
}
}
}
export { ArcShape };