@babylonjs/core 8.37.3 → 8.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animation.d.ts +3 -1
- package/Animations/animation.js +5 -4
- package/Animations/animation.js.map +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.d.ts +4 -0
- package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
- package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
- package/Behaviors/Cameras/bouncingBehavior.d.ts +5 -0
- package/Behaviors/Cameras/bouncingBehavior.js +8 -0
- package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
- package/Behaviors/Cameras/framingBehavior.d.ts +4 -0
- package/Behaviors/Cameras/framingBehavior.js +7 -0
- package/Behaviors/Cameras/framingBehavior.js.map +1 -1
- package/Behaviors/Cameras/interpolatingBehavior.d.ts +7 -1
- package/Behaviors/Cameras/interpolatingBehavior.js +21 -6
- package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.d.ts +5 -0
- package/Behaviors/Meshes/attachToBoxBehavior.js +8 -1
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +5 -2
- package/Behaviors/Meshes/baseSixDofDragBehavior.js +8 -0
- package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/fadeInOutBehavior.d.ts +5 -0
- package/Behaviors/Meshes/fadeInOutBehavior.js +6 -0
- package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
- package/Behaviors/Meshes/handConstraintBehavior.d.ts +5 -0
- package/Behaviors/Meshes/handConstraintBehavior.js +8 -0
- package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
- package/Behaviors/Meshes/multiPointerScaleBehavior.d.ts +5 -0
- package/Behaviors/Meshes/multiPointerScaleBehavior.js +8 -0
- package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.js +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
- package/Behaviors/Meshes/surfaceMagnetismBehavior.d.ts +5 -0
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js +7 -0
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
- package/Behaviors/behavior.d.ts +4 -0
- package/Behaviors/behavior.js.map +1 -1
- package/Cameras/Inputs/geospatialCameraPointersInput.js +3 -5
- package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
- package/Cameras/geospatialCamera.d.ts +19 -1
- package/Cameras/geospatialCamera.js +117 -28
- package/Cameras/geospatialCamera.js.map +1 -1
- package/Cameras/geospatialCameraMovement.d.ts +7 -2
- package/Cameras/geospatialCameraMovement.js +46 -10
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +2 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js +5 -2
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
- package/Engines/WebGPU/webgpuTextureHelper.js +11 -0
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -0
- package/Engines/WebGPU/webgpuTextureManager.js +100 -9
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.js +6 -1
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.js +1 -1
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +7 -4
- package/Engines/webgpuEngine.js +45 -16
- package/Engines/webgpuEngine.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.d.ts +22 -5
- package/FrameGraph/Node/nodeRenderGraph.js +39 -18
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Passes/pass.d.ts +2 -0
- package/FrameGraph/Passes/pass.js +2 -0
- package/FrameGraph/Passes/pass.js.map +1 -1
- package/FrameGraph/Passes/renderPass.d.ts +2 -0
- package/FrameGraph/Passes/renderPass.js +4 -0
- package/FrameGraph/Passes/renderPass.js.map +1 -1
- package/FrameGraph/frameGraph.d.ts +13 -4
- package/FrameGraph/frameGraph.js +45 -5
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/frameGraphRenderTarget.d.ts +1 -0
- package/FrameGraph/frameGraphRenderTarget.js +3 -0
- package/FrameGraph/frameGraphRenderTarget.js.map +1 -1
- package/FrameGraph/frameGraphTask.d.ts +6 -0
- package/FrameGraph/frameGraphTask.js +15 -0
- package/FrameGraph/frameGraphTask.js.map +1 -1
- package/FrameGraph/frameGraphTypes.d.ts +2 -0
- package/FrameGraph/frameGraphTypes.js.map +1 -1
- package/Helpers/sceneHelpers.js +1 -1
- package/Helpers/sceneHelpers.js.map +1 -1
- package/Lights/index.d.ts +1 -0
- package/Lights/index.js +1 -0
- package/Lights/index.js.map +1 -1
- package/Lights/lightingVolume.d.ts +89 -0
- package/Lights/lightingVolume.js +426 -0
- package/Lights/lightingVolume.js.map +1 -0
- package/Materials/Node/nodeMaterial.js +8 -2
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/floatingOriginMatrixOverrides.js +6 -5
- package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
- package/Meshes/mesh.js +1 -1
- package/Meshes/mesh.js.map +1 -1
- package/Misc/screenshotTools.js +2 -8
- package/Misc/screenshotTools.js.map +1 -1
- package/Particles/Node/Blocks/index.d.ts +1 -0
- package/Particles/Node/Blocks/index.js +1 -0
- package/Particles/Node/Blocks/index.js.map +1 -1
- package/Particles/Node/Blocks/particleFloatToIntBlock.d.ts +46 -0
- package/Particles/Node/Blocks/particleFloatToIntBlock.js +120 -0
- package/Particles/Node/Blocks/particleFloatToIntBlock.js.map +1 -0
- package/Particles/Node/Blocks/systemBlock.d.ts +4 -4
- package/Particles/Node/Blocks/systemBlock.js +22 -16
- package/Particles/Node/Blocks/systemBlock.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.js +1 -1
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +61 -30
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/Particles/solidParticle.d.ts +9 -0
- package/Particles/solidParticle.js +11 -0
- package/Particles/solidParticle.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +28 -0
- package/Particles/solidParticleSystem.js +75 -0
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.d.ts +6 -0
- package/Particles/thinParticleSystem.js +21 -12
- package/Particles/thinParticleSystem.js.map +1 -1
- package/ShadersWGSL/lightingVolume.compute.d.ts +5 -0
- package/ShadersWGSL/lightingVolume.compute.js +27 -0
- package/ShadersWGSL/lightingVolume.compute.js.map +1 -0
- package/package.json +1 -1
- package/scene.js +6 -4
- package/scene.js.map +1 -1
|
@@ -4,6 +4,12 @@ import { Vector3 } from "../../Maths/math.vector.js";
|
|
|
4
4
|
* A behavior that when attached to a mesh will allow the mesh to be scaled
|
|
5
5
|
*/
|
|
6
6
|
export class MultiPointerScaleBehavior {
|
|
7
|
+
/**
|
|
8
|
+
* Attached node of this behavior
|
|
9
|
+
*/
|
|
10
|
+
get attachedNode() {
|
|
11
|
+
return this._ownerNode;
|
|
12
|
+
}
|
|
7
13
|
/**
|
|
8
14
|
* Instantiate a new behavior that when attached to a mesh will allow the mesh to be scaled
|
|
9
15
|
*/
|
|
@@ -16,6 +22,7 @@ export class MultiPointerScaleBehavior {
|
|
|
16
22
|
this._dragBehaviorA.moveAttached = false;
|
|
17
23
|
this._dragBehaviorB = new PointerDragBehavior({});
|
|
18
24
|
this._dragBehaviorB.moveAttached = false;
|
|
25
|
+
this._ownerNode = null;
|
|
19
26
|
}
|
|
20
27
|
/**
|
|
21
28
|
* The name of the behavior
|
|
@@ -92,6 +99,7 @@ export class MultiPointerScaleBehavior {
|
|
|
92
99
|
behavior.onDragObservable.clear();
|
|
93
100
|
this._ownerNode.removeBehavior(behavior);
|
|
94
101
|
}
|
|
102
|
+
this._ownerNode = null;
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
//# sourceMappingURL=multiPointerScaleBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiPointerScaleBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/multiPointerScaleBehavior.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAKlD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IASlC;;OAEG;IACH;
|
|
1
|
+
{"version":3,"file":"multiPointerScaleBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/multiPointerScaleBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Behavior } from \"../behavior\";\r\nimport { PointerDragBehavior } from \"./pointerDragBehavior\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be scaled\r\n */\r\nexport class MultiPointerScaleBehavior implements Behavior<Mesh> {\r\n private _dragBehaviorA: PointerDragBehavior;\r\n private _dragBehaviorB: PointerDragBehavior;\r\n private _startDistance = 0;\r\n private _initialScale = new Vector3(0, 0, 0);\r\n private _targetScale = new Vector3(0, 0, 0);\r\n private _ownerNode: Mesh;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public get attachedNode(): Nullable<Mesh> {\r\n return this._ownerNode;\r\n }\r\n\r\n /**\r\n * Instantiate a new behavior that when attached to a mesh will allow the mesh to be scaled\r\n */\r\n constructor() {\r\n this._dragBehaviorA = new PointerDragBehavior({});\r\n this._dragBehaviorA.moveAttached = false;\r\n this._dragBehaviorB = new PointerDragBehavior({});\r\n this._dragBehaviorB.moveAttached = false;\r\n this._ownerNode = null!;\r\n }\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"MultiPointerScale\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n private _getCurrentDistance() {\r\n return this._dragBehaviorA.lastDragPosition.subtract(this._dragBehaviorB.lastDragPosition).length();\r\n }\r\n\r\n /**\r\n * Attaches the scale behavior the passed in mesh\r\n * @param ownerNode The mesh that will be scaled around once attached\r\n */\r\n public attach(ownerNode: Mesh): void {\r\n this._ownerNode = ownerNode;\r\n\r\n // Create 2 drag behaviors such that each will only be triggered by a separate pointer\r\n this._dragBehaviorA.onDragStartObservable.add(() => {\r\n if (this._dragBehaviorA.dragging && this._dragBehaviorB.dragging) {\r\n if (this._dragBehaviorA.currentDraggingPointerId == this._dragBehaviorB.currentDraggingPointerId) {\r\n this._dragBehaviorA.releaseDrag();\r\n } else {\r\n this._initialScale.copyFrom(ownerNode.scaling);\r\n this._startDistance = this._getCurrentDistance();\r\n }\r\n }\r\n });\r\n this._dragBehaviorB.onDragStartObservable.add(() => {\r\n if (this._dragBehaviorA.dragging && this._dragBehaviorB.dragging) {\r\n if (this._dragBehaviorA.currentDraggingPointerId == this._dragBehaviorB.currentDraggingPointerId) {\r\n this._dragBehaviorB.releaseDrag();\r\n } else {\r\n this._initialScale.copyFrom(ownerNode.scaling);\r\n this._startDistance = this._getCurrentDistance();\r\n }\r\n }\r\n });\r\n\r\n // Once both drag behaviors are active scale based on the distance between the two pointers\r\n const dragBehaviors = [this._dragBehaviorA, this._dragBehaviorB];\r\n for (const behavior of dragBehaviors) {\r\n behavior.onDragObservable.add(() => {\r\n if (this._dragBehaviorA.dragging && this._dragBehaviorB.dragging) {\r\n const ratio = this._getCurrentDistance() / this._startDistance;\r\n this._initialScale.scaleToRef(ratio, this._targetScale);\r\n }\r\n });\r\n }\r\n\r\n ownerNode.addBehavior(this._dragBehaviorA);\r\n ownerNode.addBehavior(this._dragBehaviorB);\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this._dragBehaviorA.dragging && this._dragBehaviorB.dragging) {\r\n const change = this._targetScale.subtract(ownerNode.scaling).scaleInPlace(0.1);\r\n if (change.length() > 0.01) {\r\n ownerNode.scaling.addInPlace(change);\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n const dragBehaviors = [this._dragBehaviorA, this._dragBehaviorB];\r\n for (const behavior of dragBehaviors) {\r\n behavior.onDragStartObservable.clear();\r\n behavior.onDragObservable.clear();\r\n this._ownerNode.removeBehavior(behavior);\r\n }\r\n this._ownerNode = null!;\r\n }\r\n}\r\n"]}
|
|
@@ -222,13 +222,13 @@ export class SixDofDragBehavior extends BaseSixDofDragBehavior {
|
|
|
222
222
|
* Detaches the behavior from the mesh
|
|
223
223
|
*/
|
|
224
224
|
detach() {
|
|
225
|
-
super.detach();
|
|
226
225
|
if (this._ownerNode) {
|
|
227
226
|
this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);
|
|
228
227
|
}
|
|
229
228
|
if (this._virtualTransformNode) {
|
|
230
229
|
this._virtualTransformNode.dispose();
|
|
231
230
|
}
|
|
231
|
+
super.detach();
|
|
232
232
|
}
|
|
233
233
|
}
|
|
234
234
|
//# sourceMappingURL=sixDofDragBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sixDofDragBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public override get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public override attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n const children = ownerNode.getChildMeshes();\r\n for (const m of children) {\r\n m.isNearGrabbable = true;\r\n }\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._VirtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected override _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.rotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected override _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected override _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public override detach(): void {\r\n super.detach();\r\n\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"sixDofDragBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public override get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public override attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n const children = ownerNode.getChildMeshes();\r\n for (const m of children) {\r\n m.isNearGrabbable = true;\r\n }\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._VirtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected override _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.rotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected override _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected override _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public override detach(): void {\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n\r\n super.detach();\r\n }\r\n}\r\n"]}
|
|
@@ -2,6 +2,7 @@ import type { PickingInfo } from "../../Collisions/pickingInfo.js";
|
|
|
2
2
|
import type { AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
3
3
|
import type { Mesh } from "../../Meshes/mesh.js";
|
|
4
4
|
import type { Scene } from "../../scene.js";
|
|
5
|
+
import type { Nullable } from "../../types.js";
|
|
5
6
|
import type { Behavior } from "../behavior.js";
|
|
6
7
|
/**
|
|
7
8
|
* A behavior that allows a transform node to stick to a surface position/orientation
|
|
@@ -54,6 +55,10 @@ export declare class SurfaceMagnetismBehavior implements Behavior<Mesh> {
|
|
|
54
55
|
* Maximum distance for the node to stick to the surface
|
|
55
56
|
*/
|
|
56
57
|
maxStickingDistance: number;
|
|
58
|
+
/**
|
|
59
|
+
* Attached node of this behavior
|
|
60
|
+
*/
|
|
61
|
+
get attachedNode(): Nullable<Mesh>;
|
|
57
62
|
/**
|
|
58
63
|
* Attaches the behavior to a transform node
|
|
59
64
|
* @param target defines the target where the behavior is attached to
|
|
@@ -6,6 +6,7 @@ import { Quaternion, TmpVectors, Vector3 } from "../../Maths/math.vector.js";
|
|
|
6
6
|
*/
|
|
7
7
|
export class SurfaceMagnetismBehavior {
|
|
8
8
|
constructor() {
|
|
9
|
+
this._attachedMesh = null;
|
|
9
10
|
this._attachPointLocalOffset = new Vector3();
|
|
10
11
|
this._workingPosition = new Vector3();
|
|
11
12
|
this._workingQuaternion = new Quaternion();
|
|
@@ -51,6 +52,12 @@ export class SurfaceMagnetismBehavior {
|
|
|
51
52
|
* Function called when the behavior needs to be initialized (after attaching it to a target)
|
|
52
53
|
*/
|
|
53
54
|
init() { }
|
|
55
|
+
/**
|
|
56
|
+
* Attached node of this behavior
|
|
57
|
+
*/
|
|
58
|
+
get attachedNode() {
|
|
59
|
+
return this._attachedMesh;
|
|
60
|
+
}
|
|
54
61
|
/**
|
|
55
62
|
* Attaches the behavior to a transform node
|
|
56
63
|
* @param target defines the target where the behavior is attached to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surfaceMagnetismBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/surfaceMagnetismBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Behavior } from \"../behavior\";\r\n\r\n/**\r\n * A behavior that allows a transform node to stick to a surface position/orientation\r\n * @since 5.0.0\r\n */\r\nexport class SurfaceMagnetismBehavior implements Behavior<Mesh> {\r\n private _scene: Scene;\r\n private _attachedMesh: Nullable<Mesh>;\r\n private _attachPointLocalOffset: Vector3 = new Vector3();\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n private _hit = false;\r\n\r\n /**\r\n * Distance offset from the hit point to place the target at, along the hit normal.\r\n */\r\n public hitNormalOffset: number = 0.05;\r\n\r\n /**\r\n * Name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SurfaceMagnetism\";\r\n }\r\n\r\n /**\r\n * Spatial mapping meshes to collide with\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (after attaching it to a target)\r\n */\r\n public init(): void {}\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 250;\r\n\r\n /**\r\n * If true, pitch and roll are omitted.\r\n */\r\n public keepOrientationVertical = true;\r\n\r\n /**\r\n * Is this behavior reacting to pointer events\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Maximum distance for the node to stick to the surface\r\n */\r\n public maxStickingDistance = 0.8;\r\n\r\n /**\r\n * Attaches the behavior to a transform node\r\n * @param target defines the target where the behavior is attached to\r\n * @param scene the scene\r\n */\r\n public attach(target: Mesh, scene?: Scene): void {\r\n this._attachedMesh = target;\r\n this._scene = scene || target.getScene();\r\n if (!this._attachedMesh.rotationQuaternion) {\r\n this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z);\r\n }\r\n this.updateAttachPoint();\r\n\r\n this._workingPosition.copyFrom(this._attachedMesh.position);\r\n this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion);\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior\r\n */\r\n public detach(): void {\r\n this._attachedMesh = null;\r\n this._removeObservables();\r\n }\r\n\r\n private _getTargetPose(pickingInfo: PickingInfo): Nullable<{ position: Vector3; quaternion: Quaternion }> {\r\n if (!this._attachedMesh) {\r\n return null;\r\n }\r\n\r\n if (pickingInfo && pickingInfo.hit) {\r\n const pickedNormal = pickingInfo.getNormal(true, true);\r\n const pickedPoint = pickingInfo.pickedPoint;\r\n\r\n if (!pickedNormal || !pickedPoint) {\r\n return null;\r\n }\r\n pickedNormal.normalize();\r\n\r\n const worldTarget = TmpVectors.Vector3[0];\r\n worldTarget.copyFrom(pickedNormal);\r\n worldTarget.scaleInPlace(this.hitNormalOffset);\r\n worldTarget.addInPlace(pickedPoint);\r\n\r\n if (this._attachedMesh.parent) {\r\n TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert();\r\n Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget);\r\n }\r\n\r\n return {\r\n position: worldTarget,\r\n quaternion: Quaternion.RotationYawPitchRoll(\r\n -Math.atan2(pickedNormal.x, -pickedNormal.z),\r\n this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)),\r\n 0\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Updates the attach point with the current geometry extents of the attached mesh\r\n */\r\n public updateAttachPoint() {\r\n this._getAttachPointOffsetToRef(this._attachPointLocalOffset);\r\n }\r\n\r\n /**\r\n * Finds the intersection point of the given ray onto the meshes and updates the target.\r\n * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties.\r\n * If no mesh of `meshes` are hit, this does nothing.\r\n * @param pickInfo The input pickingInfo that will be used to intersect the meshes\r\n * @returns a boolean indicating if we found a hit to stick to\r\n */\r\n public findAndUpdateTarget(pickInfo: PickingInfo): boolean {\r\n this._hit = false;\r\n if (!pickInfo.ray) {\r\n return false;\r\n }\r\n\r\n const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0];\r\n\r\n if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) {\r\n const pose = this._getTargetPose(subPicking);\r\n if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) {\r\n this._workingPosition.copyFrom(pose.position);\r\n this._workingQuaternion.copyFrom(pose.quaternion);\r\n this._hit = true;\r\n }\r\n }\r\n\r\n return this._hit;\r\n }\r\n\r\n private _getAttachPointOffsetToRef(ref: Vector3) {\r\n if (!this._attachedMesh) {\r\n ref.setAll(0);\r\n return;\r\n }\r\n\r\n const storedQuat = TmpVectors.Quaternion[0];\r\n storedQuat.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n this._attachedMesh.rotationQuaternion!.copyFromFloats(0, 0, 0, 1);\r\n this._attachedMesh.computeWorldMatrix();\r\n const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors();\r\n const center = TmpVectors.Vector3[0];\r\n boundingMinMax.max.addToRef(boundingMinMax.min, center);\r\n center.scaleInPlace(0.5);\r\n center.z = boundingMinMax.max.z;\r\n // We max the z coordinate because we want the attach point to be on the back of the mesh\r\n const invWorld = TmpVectors.Matrix[0];\r\n this._attachedMesh.getWorldMatrix().invertToRef(invWorld);\r\n Vector3.TransformCoordinatesToRef(center, invWorld, ref);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(storedQuat);\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this._attachedMesh || !this._hit) {\r\n return;\r\n }\r\n\r\n const oldParent = this._attachedMesh.parent;\r\n this._attachedMesh.setParent(null);\r\n\r\n const worldOffset = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset);\r\n\r\n if (!this.interpolatePose) {\r\n this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const interpolatedPosition = new Vector3();\r\n Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition);\r\n this._attachedMesh.position.copyFrom(interpolatedPosition);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion!);\r\n\r\n this._attachedMesh.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) {\r\n this.findAndUpdateTarget(pointerInfo.pickInfo);\r\n }\r\n });\r\n\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n this._pointerObserver = null;\r\n this._onBeforeRender = null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"surfaceMagnetismBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/surfaceMagnetismBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport type { PointerInfo } from \"../../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Behavior } from \"../behavior\";\r\n\r\n/**\r\n * A behavior that allows a transform node to stick to a surface position/orientation\r\n * @since 5.0.0\r\n */\r\nexport class SurfaceMagnetismBehavior implements Behavior<Mesh> {\r\n private _scene: Scene;\r\n private _attachedMesh: Nullable<Mesh> = null;\r\n private _attachPointLocalOffset: Vector3 = new Vector3();\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n private _hit = false;\r\n\r\n /**\r\n * Distance offset from the hit point to place the target at, along the hit normal.\r\n */\r\n public hitNormalOffset: number = 0.05;\r\n\r\n /**\r\n * Name of the behavior\r\n */\r\n public get name(): string {\r\n return \"SurfaceMagnetism\";\r\n }\r\n\r\n /**\r\n * Spatial mapping meshes to collide with\r\n */\r\n public meshes: AbstractMesh[] = [];\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (after attaching it to a target)\r\n */\r\n public init(): void {}\r\n\r\n /**\r\n * Set to false if the node should strictly follow the camera without any interpolation time\r\n */\r\n public interpolatePose = true;\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 250;\r\n\r\n /**\r\n * If true, pitch and roll are omitted.\r\n */\r\n public keepOrientationVertical = true;\r\n\r\n /**\r\n * Is this behavior reacting to pointer events\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * Maximum distance for the node to stick to the surface\r\n */\r\n public maxStickingDistance = 0.8;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public get attachedNode(): Nullable<Mesh> {\r\n return this._attachedMesh;\r\n }\r\n\r\n /**\r\n * Attaches the behavior to a transform node\r\n * @param target defines the target where the behavior is attached to\r\n * @param scene the scene\r\n */\r\n public attach(target: Mesh, scene?: Scene): void {\r\n this._attachedMesh = target;\r\n this._scene = scene || target.getScene();\r\n if (!this._attachedMesh.rotationQuaternion) {\r\n this._attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._attachedMesh.rotation.y, this._attachedMesh.rotation.x, this._attachedMesh.rotation.z);\r\n }\r\n this.updateAttachPoint();\r\n\r\n this._workingPosition.copyFrom(this._attachedMesh.position);\r\n this._workingQuaternion.copyFrom(this._attachedMesh.rotationQuaternion);\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior\r\n */\r\n public detach(): void {\r\n this._attachedMesh = null;\r\n this._removeObservables();\r\n }\r\n\r\n private _getTargetPose(pickingInfo: PickingInfo): Nullable<{ position: Vector3; quaternion: Quaternion }> {\r\n if (!this._attachedMesh) {\r\n return null;\r\n }\r\n\r\n if (pickingInfo && pickingInfo.hit) {\r\n const pickedNormal = pickingInfo.getNormal(true, true);\r\n const pickedPoint = pickingInfo.pickedPoint;\r\n\r\n if (!pickedNormal || !pickedPoint) {\r\n return null;\r\n }\r\n pickedNormal.normalize();\r\n\r\n const worldTarget = TmpVectors.Vector3[0];\r\n worldTarget.copyFrom(pickedNormal);\r\n worldTarget.scaleInPlace(this.hitNormalOffset);\r\n worldTarget.addInPlace(pickedPoint);\r\n\r\n if (this._attachedMesh.parent) {\r\n TmpVectors.Matrix[0].copyFrom(this._attachedMesh.parent.getWorldMatrix()).invert();\r\n Vector3.TransformNormalToRef(worldTarget, TmpVectors.Matrix[0], worldTarget);\r\n }\r\n\r\n return {\r\n position: worldTarget,\r\n quaternion: Quaternion.RotationYawPitchRoll(\r\n -Math.atan2(pickedNormal.x, -pickedNormal.z),\r\n this.keepOrientationVertical ? 0 : Math.atan2(pickedNormal.y, Math.sqrt(pickedNormal.z * pickedNormal.z + pickedNormal.x * pickedNormal.x)),\r\n 0\r\n ),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Updates the attach point with the current geometry extents of the attached mesh\r\n */\r\n public updateAttachPoint() {\r\n this._getAttachPointOffsetToRef(this._attachPointLocalOffset);\r\n }\r\n\r\n /**\r\n * Finds the intersection point of the given ray onto the meshes and updates the target.\r\n * Transformation will be interpolated according to `interpolatePose` and `lerpTime` properties.\r\n * If no mesh of `meshes` are hit, this does nothing.\r\n * @param pickInfo The input pickingInfo that will be used to intersect the meshes\r\n * @returns a boolean indicating if we found a hit to stick to\r\n */\r\n public findAndUpdateTarget(pickInfo: PickingInfo): boolean {\r\n this._hit = false;\r\n if (!pickInfo.ray) {\r\n return false;\r\n }\r\n\r\n const subPicking = pickInfo.ray.intersectsMeshes(this.meshes)[0];\r\n\r\n if (this._attachedMesh && subPicking && subPicking.hit && subPicking.pickedMesh) {\r\n const pose = this._getTargetPose(subPicking);\r\n if (pose && Vector3.Distance(this._attachedMesh.position, pose.position) < this.maxStickingDistance) {\r\n this._workingPosition.copyFrom(pose.position);\r\n this._workingQuaternion.copyFrom(pose.quaternion);\r\n this._hit = true;\r\n }\r\n }\r\n\r\n return this._hit;\r\n }\r\n\r\n private _getAttachPointOffsetToRef(ref: Vector3) {\r\n if (!this._attachedMesh) {\r\n ref.setAll(0);\r\n return;\r\n }\r\n\r\n const storedQuat = TmpVectors.Quaternion[0];\r\n storedQuat.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n this._attachedMesh.rotationQuaternion!.copyFromFloats(0, 0, 0, 1);\r\n this._attachedMesh.computeWorldMatrix();\r\n const boundingMinMax = this._attachedMesh.getHierarchyBoundingVectors();\r\n const center = TmpVectors.Vector3[0];\r\n boundingMinMax.max.addToRef(boundingMinMax.min, center);\r\n center.scaleInPlace(0.5);\r\n center.z = boundingMinMax.max.z;\r\n // We max the z coordinate because we want the attach point to be on the back of the mesh\r\n const invWorld = TmpVectors.Matrix[0];\r\n this._attachedMesh.getWorldMatrix().invertToRef(invWorld);\r\n Vector3.TransformCoordinatesToRef(center, invWorld, ref);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(storedQuat);\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this._attachedMesh || !this._hit) {\r\n return;\r\n }\r\n\r\n const oldParent = this._attachedMesh.parent;\r\n this._attachedMesh.setParent(null);\r\n\r\n const worldOffset = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._attachPointLocalOffset, this._attachedMesh.getWorldMatrix(), worldOffset);\r\n\r\n if (!this.interpolatePose) {\r\n this._attachedMesh.position.copyFrom(this._workingPosition).subtractInPlace(worldOffset);\r\n this._attachedMesh.rotationQuaternion!.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const interpolatedPosition = new Vector3();\r\n Vector3.SmoothToRef(this._attachedMesh.position, this._workingPosition, elapsed, this.lerpTime, interpolatedPosition);\r\n this._attachedMesh.position.copyFrom(interpolatedPosition);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this._attachedMesh.rotationQuaternion!);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this._attachedMesh.rotationQuaternion!);\r\n\r\n this._attachedMesh.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._pointerObserver = this._scene.onPointerObservable.add((pointerInfo) => {\r\n if (this.enabled && pointerInfo.type == PointerEventTypes.POINTERMOVE && pointerInfo.pickInfo) {\r\n this.findAndUpdateTarget(pointerInfo.pickInfo);\r\n }\r\n });\r\n\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n this._scene.onPointerObservable.remove(this._pointerObserver);\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n this._pointerObserver = null;\r\n this._onBeforeRender = null;\r\n }\r\n}\r\n"]}
|
package/Behaviors/behavior.d.ts
CHANGED
|
@@ -18,6 +18,10 @@ export interface Behavior<T> {
|
|
|
18
18
|
* Called when the behavior is detached from its target
|
|
19
19
|
*/
|
|
20
20
|
detach(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Gets the current attached target
|
|
23
|
+
*/
|
|
24
|
+
attachedNode: Nullable<T>;
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
23
27
|
* Interface implemented by classes supporting behaviors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior.js","sourceRoot":"","sources":["../../../../dev/core/src/Behaviors/behavior.ts"],"names":[],"mappings":"","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Interface used to define a behavior\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface Behavior<T> {\r\n /** gets or sets behavior's name */\r\n name: string;\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (before attaching it to a target)\r\n */\r\n init(): void;\r\n /**\r\n * Called when the behavior is attached to a target\r\n * @param target defines the target where the behavior is attached to\r\n */\r\n attach(target: T): void;\r\n /**\r\n * Called when the behavior is detached from its target\r\n */\r\n detach(): void;\r\n}\r\n\r\n/**\r\n * Interface implemented by classes supporting behaviors\r\n */\r\nexport interface IBehaviorAware<T> {\r\n /**\r\n * Attach a behavior\r\n * @param behavior defines the behavior to attach\r\n * @returns the current host\r\n */\r\n addBehavior(behavior: Behavior<T>): T;\r\n /**\r\n * Remove a behavior from the current object\r\n * @param behavior defines the behavior to detach\r\n * @returns the current host\r\n */\r\n removeBehavior(behavior: Behavior<T>): T;\r\n /**\r\n * Gets a behavior using its name to search\r\n * @param name defines the name to search\r\n * @returns the behavior or null if not found\r\n */\r\n getBehaviorByName(name: string): Nullable<Behavior<T>>;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"behavior.js","sourceRoot":"","sources":["../../../../dev/core/src/Behaviors/behavior.ts"],"names":[],"mappings":"","sourcesContent":["import type { Nullable } from \"../types\";\r\n\r\n/**\r\n * Interface used to define a behavior\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface Behavior<T> {\r\n /** gets or sets behavior's name */\r\n name: string;\r\n\r\n /**\r\n * Function called when the behavior needs to be initialized (before attaching it to a target)\r\n */\r\n init(): void;\r\n /**\r\n * Called when the behavior is attached to a target\r\n * @param target defines the target where the behavior is attached to\r\n */\r\n attach(target: T): void;\r\n /**\r\n * Called when the behavior is detached from its target\r\n */\r\n detach(): void;\r\n /**\r\n * Gets the current attached target\r\n */\r\n attachedNode: Nullable<T>;\r\n}\r\n\r\n/**\r\n * Interface implemented by classes supporting behaviors\r\n */\r\nexport interface IBehaviorAware<T> {\r\n /**\r\n * Attach a behavior\r\n * @param behavior defines the behavior to attach\r\n * @returns the current host\r\n */\r\n addBehavior(behavior: Behavior<T>): T;\r\n /**\r\n * Remove a behavior from the current object\r\n * @param behavior defines the behavior to detach\r\n * @returns the current host\r\n */\r\n removeBehavior(behavior: Behavior<T>): T;\r\n /**\r\n * Gets a behavior using its name to search\r\n * @param name defines the name to search\r\n * @returns the behavior or null if not found\r\n */\r\n getBehaviorByName(name: string): Nullable<Behavior<T>>;\r\n}\r\n"]}
|
|
@@ -71,11 +71,9 @@ export class GeospatialCameraPointersInput extends OrbitCameraPointersInput {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
onDoubleTap(type) {
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const newRadius = this.camera.radius * 0.5; // Zoom to 50% of current distance
|
|
78
|
-
void this.camera.flyToAsync(undefined, undefined, newRadius, pickResult.pickedPoint);
|
|
74
|
+
const pickResult = this.camera._scene.pick(this.camera._scene.pointerX, this.camera._scene.pointerY, this.camera.pickPredicate);
|
|
75
|
+
if (pickResult.pickedPoint) {
|
|
76
|
+
void this.camera.flyToPointAsync(pickResult.pickedPoint);
|
|
79
77
|
}
|
|
80
78
|
}
|
|
81
79
|
onMultiTouch(pointA, pointB, previousPinchSquaredDistance, pinchSquaredDistance, previousMultiTouchPanPosition, multiTouchPanPosition) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geospatialCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/geospatialCameraPointersInput.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,6BAA8B,SAAQ,wBAAwB;IAGvD,YAAY;QACxB,OAAO,+BAA+B,CAAC;IAC3C,CAAC;IAEe,YAAY,CAAC,GAAkB;QAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,UAAiC,CAAC;QACtC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,EAAE,4CAA4C;gBAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC/D,MAAM;YACV,KAAK,CAAC,EAAE,4CAA4C;gBAChD,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnF,UAAU,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;gBAC9F,MAAM;YACV,KAAK,CAAC,EAAE,0EAA0E;gBAC9E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC9D,MAAM;YACV;gBACI,OAAO;QACf,CAAC;IACL,CAAC;IAEe,OAAO,CAAC,KAA6B,EAAE,OAAe,EAAE,OAAe;QACnF,4EAA4E;QAC5E,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,0CAA0C;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,QAAQ,MAAM,EAAE,CAAC;YACb,KAAK,CAAC,EAAE,2DAA2D;gBAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAChE,MAAM;YACV,KAAK,CAAC,CAAC,CAAC,8BAA8B;YACtC,KAAK,CAAC,EAAE,6BAA6B;gBACjC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACnC,MAAM;QACd,CAAC;IACL,CAAC;IAED;;;;OAIG;IACgB,iBAAiB,CAAC,4BAAoC,EAAE,oBAA4B;QACnG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC1H,CAAC;IAED;;;;;OAKG;IACgB,yBAAyB,CAAC,6BAAqD,EAAE,qBAA6C;QAC7I,IAAI,6BAA6B,IAAI,qBAAqB,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,qBAAqB,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC,CAAC;YAC7E,MAAM,UAAU,GAAG,qBAAqB,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAEe,WAAW,CAAC,IAAY;QACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"geospatialCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/geospatialCameraPointersInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GeospatialCamera } from \"../../Cameras/geospatialCamera\";\r\nimport type { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport type { IPointerEvent } from \"../../Events/deviceInputEvents\";\r\nimport type { PointerTouch } from \"../../Events/pointerEvents\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { OrbitCameraPointersInput } from \"./orbitCameraPointersInput\";\r\n\r\n/**\r\n * @experimental\r\n * Geospatial camera inputs can simulate dragging the globe around or tilting the camera around some point on the globe\r\n * This class will update the GeospatialCameraMovement class's movementDeltaCurrentFrame, and the camera is responsible for using these updates to calculate viewMatrix appropriately\r\n *\r\n * As of right now, the camera correction logic (to keep the camera geospatially oriented around the globe) is happening within the camera class when calculating viewmatrix\r\n * As this is experimental, it is possible we move that correction step to live within the input class (to enable non-corrected translations in the future), say if we want to allow the camera to move outside of the globe's orbit\r\n *\r\n * Left mouse button: drag globe\r\n * Middle mouse button: tilt globe around cursor location\r\n * Right mouse button: tilt globe around center of screen\r\n *\r\n */\r\nexport class GeospatialCameraPointersInput extends OrbitCameraPointersInput {\r\n public camera: GeospatialCamera;\r\n\r\n public override getClassName(): string {\r\n return \"GeospatialCameraPointersInput\";\r\n }\r\n\r\n public override onButtonDown(evt: IPointerEvent): void {\r\n this.camera.movement.activeInput = true;\r\n const scene = this.camera.getScene();\r\n let pickResult: Nullable<PickingInfo>;\r\n switch (evt.button) {\r\n case 0: // Left button - drag/pan globe under cursor\r\n this.camera.movement.startDrag(scene.pointerX, scene.pointerY);\r\n break;\r\n case 1: // Middle button - tilt camera around cursor\r\n pickResult = scene.pick(scene.pointerX, scene.pointerY, this.camera.pickPredicate);\r\n pickResult.pickedPoint && (this.camera.movement.alternateRotationPt = pickResult.pickedPoint);\r\n break;\r\n case 2: // Right button - tilt camera around center of screen, already the default\r\n this.camera.movement.alternateRotationPt = this.camera.center;\r\n break;\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n public override onTouch(point: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {\r\n // Single finger touch (no button property) or left button (button 0) = drag\r\n const button = point?.button ?? 0; // Default to button 0 (drag) if undefined\r\n const scene = this.camera.getScene();\r\n switch (button) {\r\n case 0: // Left button / single touch - drag/pan globe under cursor\r\n this.camera.movement.handleDrag(scene.pointerX, scene.pointerY);\r\n break;\r\n case 1: // Middle button - tilt camera\r\n case 2: // Right button - tilt camera\r\n this._handleTilt(offsetX, offsetY);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Move camera from multitouch (pinch) zoom distances.\r\n * @param previousPinchSquaredDistance\r\n * @param pinchSquaredDistance\r\n */\r\n protected override _computePinchZoom(previousPinchSquaredDistance: number, pinchSquaredDistance: number): void {\r\n this.camera.radius = (this.camera.radius * Math.sqrt(previousPinchSquaredDistance)) / Math.sqrt(pinchSquaredDistance);\r\n }\r\n\r\n /**\r\n * Move camera from multi touch panning positions.\r\n * In geospatialcamera, multi touch panning tilts the globe (whereas single touch will pan/drag it)\r\n * @param previousMultiTouchPanPosition\r\n * @param multiTouchPanPosition\r\n */\r\n protected override _computeMultiTouchPanning(previousMultiTouchPanPosition: Nullable<PointerTouch>, multiTouchPanPosition: Nullable<PointerTouch>): void {\r\n if (previousMultiTouchPanPosition && multiTouchPanPosition) {\r\n const moveDeltaX = multiTouchPanPosition.x - previousMultiTouchPanPosition.x;\r\n const moveDeltaY = multiTouchPanPosition.y - previousMultiTouchPanPosition.y;\r\n this._handleTilt(moveDeltaX, moveDeltaY);\r\n }\r\n }\r\n\r\n public override onDoubleTap(type: string): void {\r\n const pickResult = this.camera._scene.pick(this.camera._scene.pointerX, this.camera._scene.pointerY, this.camera.pickPredicate);\r\n if (pickResult.pickedPoint) {\r\n void this.camera.flyToPointAsync(pickResult.pickedPoint);\r\n }\r\n }\r\n\r\n public override onMultiTouch(\r\n pointA: Nullable<PointerTouch>,\r\n pointB: Nullable<PointerTouch>,\r\n previousPinchSquaredDistance: number,\r\n pinchSquaredDistance: number,\r\n previousMultiTouchPanPosition: Nullable<PointerTouch>,\r\n multiTouchPanPosition: Nullable<PointerTouch>\r\n ): void {\r\n this._shouldStartPinchZoom =\r\n this._twoFingerActivityCount < 20 && Math.abs(Math.sqrt(pinchSquaredDistance) - Math.sqrt(previousPinchSquaredDistance)) > this.camera.limits.pinchToPanMax;\r\n super.onMultiTouch(pointA, pointB, previousPinchSquaredDistance, pinchSquaredDistance, previousMultiTouchPanPosition, multiTouchPanPosition);\r\n }\r\n\r\n public override onButtonUp(_evt: IPointerEvent): void {\r\n this.camera.movement.stopDrag();\r\n this.camera.movement.alternateRotationPt = undefined;\r\n this.camera.movement.activeInput = false;\r\n super.onButtonUp(_evt);\r\n }\r\n\r\n private _handleTilt(deltaX: number, deltaY: number): void {\r\n this.camera.movement.rotationAccumulatedPixels.y -= deltaX; // yaw - looking side to side\r\n this.camera.movement.rotationAccumulatedPixels.x -= deltaY; // pitch - look up towards sky / down towards ground\r\n }\r\n}\r\n"]}
|
|
@@ -23,6 +23,7 @@ export declare class GeospatialCamera extends Camera {
|
|
|
23
23
|
/** Movement controller that turns input pixelDeltas into currentFrameDeltas used by camera*/
|
|
24
24
|
readonly movement: GeospatialCameraMovement;
|
|
25
25
|
private _tempPosition;
|
|
26
|
+
private _tempCenter;
|
|
26
27
|
private _viewMatrix;
|
|
27
28
|
private _isViewMatrixDirty;
|
|
28
29
|
private _lookAtVector;
|
|
@@ -95,9 +96,19 @@ export declare class GeospatialCamera extends Camera {
|
|
|
95
96
|
* @param targetCenter
|
|
96
97
|
* @param flightDurationMs
|
|
97
98
|
* @param easingFunction
|
|
99
|
+
* @param centerHopScale If supplied, will define the parabolic hop height scale for center animation to create a "bounce" effect
|
|
98
100
|
* @returns Promise that will return when the animation is complete (or interuppted by pointer input)
|
|
99
101
|
*/
|
|
100
|
-
flyToAsync(targetYaw?: number, targetPitch?: number, targetRadius?: number, targetCenter?: Vector3, flightDurationMs?: number, easingFunction?: EasingFunction): Promise<void>;
|
|
102
|
+
flyToAsync(targetYaw?: number, targetPitch?: number, targetRadius?: number, targetCenter?: Vector3, flightDurationMs?: number, easingFunction?: EasingFunction, centerHopScale?: number): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Helper function to move camera towards a given point by radiusScale% of radius (by default 50%)
|
|
105
|
+
* @param destination point to move towards
|
|
106
|
+
* @param radiusScale value between 0 and 1, % of radius to move
|
|
107
|
+
* @param durationMs duration of flight, default 1s
|
|
108
|
+
* @param easingFn optional easing function for flight interpolation of properties
|
|
109
|
+
* @param overshootRadiusScale optional scale to apply to the current radius to achieve a 'hop' animation
|
|
110
|
+
*/
|
|
111
|
+
flyToPointAsync(destination: Vector3, radiusScale?: number, durationMs?: number, easingFn?: EasingFunction, overshootRadiusScale?: number): Promise<void>;
|
|
101
112
|
private _limits;
|
|
102
113
|
get limits(): GeospatialLimits;
|
|
103
114
|
private _resetToDefault;
|
|
@@ -110,8 +121,15 @@ export declare class GeospatialCamera extends Camera {
|
|
|
110
121
|
* This rotation keeps the camera oriented towards the globe as it orbits around it. This is different from cameraCentricRotation which is when the camera rotates around its own axis
|
|
111
122
|
*/
|
|
112
123
|
private _applyGeocentricRotation;
|
|
124
|
+
private _getCenterAndRadiusFromZoomToPoint;
|
|
125
|
+
/**
|
|
126
|
+
* Apply zoom by moving the camera toward/away from a target point.
|
|
127
|
+
*/
|
|
113
128
|
private _applyZoom;
|
|
129
|
+
private _zoomToPoint;
|
|
130
|
+
private _zoomAlongLookAt;
|
|
114
131
|
_checkInputs(): void;
|
|
132
|
+
private _recalculateCenter;
|
|
115
133
|
attachControl(noPreventDefault?: boolean): void;
|
|
116
134
|
detachControl(): void;
|
|
117
135
|
}
|