Added rotation snapping.

This commit is contained in:
Michael Mainguy 2023-07-27 21:09:50 -05:00
parent 9d5cb0ab95
commit ecf28deffc
3 changed files with 96 additions and 2 deletions

69
package-lock.json generated
View File

@ -25,6 +25,7 @@
"loglevel": "^1.8.1", "loglevel": "^1.8.1",
"query-string": "^8.1.0", "query-string": "^8.1.0",
"ring-client-api": "^11.8.0", "ring-client-api": "^11.8.0",
"round": "^2.0.1",
"uuid": "^9.0.0", "uuid": "^9.0.0",
"vite-express": "^0.9.1" "vite-express": "^0.9.1"
}, },
@ -2701,6 +2702,17 @@
"node": ">=0.10.0" "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": { "node_modules/is-fullwidth-code-point": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "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": ">=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": { "node_modules/is-interactive": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@ -3239,6 +3259,14 @@
"node": ">=8" "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": { "node_modules/object-inspect": {
"version": "1.12.3", "version": "1.12.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
@ -3323,6 +3351,14 @@
"node": ">=8" "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": { "node_modules/parseqs": {
"version": "0.0.6", "version": "0.0.6",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
@ -3450,6 +3486,18 @@
"node": "^10 || ^12 || >=14" "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": { "node_modules/process": {
"version": "0.11.10", "version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@ -3781,6 +3829,27 @@
"fsevents": "~2.3.2" "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": { "node_modules/run-async": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",

View File

@ -27,6 +27,7 @@
"query-string": "^8.1.0", "query-string": "^8.1.0",
"vite-express": "^0.9.1", "vite-express": "^0.9.1",
"loglevel": "^1.8.1", "loglevel": "^1.8.1",
"round": "^2.0.1",
"express-http-proxy": "^1.6.3", "express-http-proxy": "^1.6.3",
"earcut": "^2.2.4", "earcut": "^2.2.4",
"uuid": "^9.0.0" "uuid": "^9.0.0"

View File

@ -1,5 +1,6 @@
import { import {
AbstractMesh, AbstractMesh,
Angle,
InstancedMesh, InstancedMesh,
Mesh, Mesh,
Scene, Scene,
@ -12,6 +13,8 @@ import {MeshConverter} from "../diagram/meshConverter";
import {DiagramManager} from "../diagram/diagramManager"; import {DiagramManager} from "../diagram/diagramManager";
import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity"; import {DiagramEvent, DiagramEventType} from "../diagram/diagramEntity";
import log from "loglevel"; import log from "loglevel";
import {AppConfig} from "../util/appConfig";
import round from "round";
export class Base { 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) { private initGrip(grip: WebXRControllerComponent) {
grip.onButtonStateChangedObservable.add(() => { grip.onButtonStateChangedObservable.add(() => {
if (grip.changes.pressed) { if (grip.changes.pressed) {
@ -124,16 +145,18 @@ export class Base {
return; return;
} }
} }
const snapped = Base.snapRotation(mesh.absoluteRotationQuaternion.toEulerAngles().clone());
if (this.previousParent) { if (this.previousParent) {
const p = this.scene.getMeshById(this.previousParent); const p = this.scene.getMeshById(this.previousParent);
if (p) { if (p) {
mesh && mesh.setParent(this.scene.getMeshById(this.previousParent)); mesh && mesh.setParent(this.scene.getMeshById(this.previousParent));
} else { } else {
mesh && mesh.setParent(null); mesh && mesh.setParent(null);
} }
} else { } else {
mesh && mesh.setParent(null) mesh && mesh.setParent(null);
mesh.rotation = snapped;
} }
const entity = MeshConverter.toDiagramEntity(mesh); const entity = MeshConverter.toDiagramEntity(mesh);
const event: DiagramEvent = { const event: DiagramEvent = {
@ -149,4 +172,5 @@ export class Base {
} }
}); });
} }
} }