UNPKG

@babylonjs/gui

Version:

Babylon.js GUI module =====================

57 lines 2.06 kB
import { Tools } from "@babylonjs/core/Misc/tools.js"; import { Matrix, TmpVectors, Vector3 } from "@babylonjs/core/Maths/math.vector.js"; import { VolumeBasedPanel } from "./volumeBasedPanel.js"; import { Container3D } from "./container3D.js"; import { Axis } from "@babylonjs/core/Maths/math.axis.js"; /** * Class used to create a container panel deployed on the surface of a cylinder */ export class CylinderPanel extends VolumeBasedPanel { constructor() { super(...arguments); this._radius = 5.0; } /** * Gets or sets the radius of the cylinder where to project controls (5 by default) */ get radius() { return this._radius; } set radius(value) { if (this._radius === value) { return; } this._radius = value; Tools.SetImmediate(() => { this._arrangeChildren(); }); } _mapGridNode(control, nodePosition) { const mesh = control.mesh; if (!mesh) { return; } const newPos = this._cylindricalMapping(nodePosition); control.position = newPos; switch (this.orientation) { case Container3D.FACEORIGIN_ORIENTATION: mesh.lookAt(new Vector3(2 * newPos.x, newPos.y, 2 * newPos.z)); break; case Container3D.FACEORIGINREVERSED_ORIENTATION: mesh.lookAt(new Vector3(-newPos.x, newPos.y, -newPos.z)); break; case Container3D.FACEFORWARD_ORIENTATION: break; case Container3D.FACEFORWARDREVERSED_ORIENTATION: mesh.rotate(Axis.Y, Math.PI, 0 /* Space.LOCAL */); break; } } _cylindricalMapping(source) { const newPos = new Vector3(0, source.y, this._radius); const yAngle = source.x / this._radius; Matrix.RotationYawPitchRollToRef(yAngle, 0, 0, TmpVectors.Matrix[0]); return Vector3.TransformNormal(newPos, TmpVectors.Matrix[0]); } } //# sourceMappingURL=cylinderPanel.js.map