diff --git a/package-lock.json b/package-lock.json index 5f1a030..170a974 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "loglevel": "^1.8.1", "query-string": "^8.1.0", "ring-client-api": "^11.8.0", + "round": "^2.0.1", "uuid": "^9.0.0", "vite-express": "^0.9.1" }, @@ -2701,6 +2702,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha512-e+gU0KGrlbqjEcV80SAqg4g7PQYOm3/IrdwAJ+kPwHqGhLKhtuTJGGxGtrsc8RXlHt2A8Vlnv+79Vq2B1GQasg==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2734,6 +2746,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-integer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", + "dependencies": { + "is-finite": "^1.0.0" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -3239,6 +3259,14 @@ "node": ">=8" } }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -3323,6 +3351,14 @@ "node": ">=8" } }, + "node_modules/parse-exponential": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-exponential/-/parse-exponential-1.0.1.tgz", + "integrity": "sha512-QUa7PaOc7O6ei3hb0NmADJGrDYLbPBdcSKFUBGfwlMdHsrg8LOsliPEkpP0qHSKQOyzyyxCB00fxJKcP75Gl7w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", @@ -3450,6 +3486,18 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/precision": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/precision/-/precision-1.0.1.tgz", + "integrity": "sha512-cBMxnM2nzEF1xx75NhhOaKjsDNt92WUZv17t/p3wrvCfA+2RL0twbgfvXvgDbxxsfUUb5C5he5tla8Xa2ny1Ew==", + "dependencies": { + "is-finite": "~1.0.1", + "parse-exponential": "~1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3781,6 +3829,27 @@ "fsevents": "~2.3.2" } }, + "node_modules/round": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/round/-/round-2.0.1.tgz", + "integrity": "sha512-wzT6PF3wNEd2PCLTBQxteheeSwViBrD89E1XZjl4sj505C4LwTpqOQSNXLEROHDQw35NoylYbMxoUhgf2hb4qw==", + "dependencies": { + "precision": "~1.0.0", + "round-precision": "~1.0.0" + } + }, + "node_modules/round-precision": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/round-precision/-/round-precision-1.0.0.tgz", + "integrity": "sha512-L2a0XDSNeaaBTEGmzuENMK4T8c0HqKYeS3pCDurW4MRPo8O6LeCLqVPWUt5+xW9rrEcG9QaYrAFcApEFXKziyw==", + "dependencies": { + "is-finite": "~1.0.1", + "is-integer": "~1.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", diff --git a/package.json b/package.json index bc9915d..cad3840 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "query-string": "^8.1.0", "vite-express": "^0.9.1", "loglevel": "^1.8.1", + "round": "^2.0.1", "express-http-proxy": "^1.6.3", "earcut": "^2.2.4", "uuid": "^9.0.0" diff --git a/src/controllers/base.ts b/src/controllers/base.ts index 1b92daf..bbb1da4 100644 --- a/src/controllers/base.ts +++ b/src/controllers/base.ts @@ -1,5 +1,6 @@ import { AbstractMesh, + Angle, InstancedMesh, Mesh, Scene, @@ -12,6 +13,8 @@ import {MeshConverter} from "../diagram/meshConverter"; import {DiagramManager} from "../diagram/diagramManager"; import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity"; import log from "loglevel"; +import {AppConfig} from "../util/appConfig"; +import round from "round"; export class Base { @@ -63,6 +66,24 @@ export class Base { } + static snapRotation(rotation): Vector3 { + const config = AppConfig.config; + if (config.rotateSnap == 0) { + return rotation; + } + rotation.x = this.calcDegreesToSnap(rotation.x, config.rotateSnap); + rotation.y = this.calcDegreesToSnap(rotation.y, config.rotateSnap); + rotation.z = this.calcDegreesToSnap(rotation.z, config.rotateSnap); + return rotation; + } + + static calcDegreesToSnap(val, snap) { + const deg = Angle.FromRadians(val).degrees(); + const snappedDegrees = round(deg, snap); + log.getLogger('Base').debug("deg", val, deg, snappedDegrees, snap); + return Angle.FromDegrees(snappedDegrees).radians(); + } + private initGrip(grip: WebXRControllerComponent) { grip.onButtonStateChangedObservable.add(() => { if (grip.changes.pressed) { @@ -124,16 +145,18 @@ export class Base { return; } } - + const snapped = Base.snapRotation(mesh.absoluteRotationQuaternion.toEulerAngles().clone()); if (this.previousParent) { const p = this.scene.getMeshById(this.previousParent); if (p) { mesh && mesh.setParent(this.scene.getMeshById(this.previousParent)); } else { mesh && mesh.setParent(null); + } } else { - mesh && mesh.setParent(null) + mesh && mesh.setParent(null); + mesh.rotation = snapped; } const entity = MeshConverter.toDiagramEntity(mesh); const event: DiagramEvent = { @@ -149,4 +172,5 @@ export class Base { } }); } + } \ No newline at end of file