@babylonjs/core 5.0.0-alpha.62 → 5.0.0-alpha.63
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/animationGroup.d.ts +4 -0
- package/Animations/animationGroup.js +18 -0
- package/Animations/animationGroup.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -1
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/handConstraintBehavior.js +16 -12
- package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
- package/Engines/engine.js +3 -8
- package/Engines/engine.js.map +1 -1
- package/Engines/renderTargetWrapper.d.ts +1 -1
- package/Engines/renderTargetWrapper.js +1 -1
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Inputs/scene.inputManager.js +5 -0
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/glowLayer.d.ts +8 -0
- package/Layers/glowLayer.js +7 -3
- package/Layers/glowLayer.js.map +1 -1
- package/Lights/light.js +3 -0
- package/Lights/light.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +1 -1
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +1 -1
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +1 -1
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/standardMaterial.js +1 -1
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/transformNode.js +19 -12
- package/Meshes/transformNode.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.d.ts +18 -3
- package/Misc/PerformanceViewer/performanceViewerCollector.js +7 -5
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/assetsManager.d.ts +4 -4
- package/Misc/assetsManager.js +2 -2
- package/Misc/assetsManager.js.map +1 -1
- package/Misc/basis.js +1 -0
- package/Misc/basis.js.map +1 -1
- package/Misc/coroutine.d.ts +3 -3
- package/Misc/coroutine.js +37 -24
- package/Misc/coroutine.js.map +1 -1
- package/Misc/interfaces/iPerfViewer.d.ts +4 -0
- package/Misc/interfaces/iPerfViewer.js.map +1 -1
- package/Misc/observableCoroutine.d.ts +4 -4
- package/Misc/observableCoroutine.js +19 -16
- package/Misc/observableCoroutine.js.map +1 -1
- package/Rendering/prePassRenderer.js +6 -6
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/default.fragment.js +1 -1
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/glowMapMerge.fragment.js +1 -1
- package/Shaders/glowMapMerge.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +1 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +26 -20
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/webXRFeaturesManager.js +1 -1
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/package.json +2 -2
- package/scene.d.ts +4 -0
- package/scene.js +4 -0
- package/scene.js.map +1 -1
|
@@ -74,6 +74,10 @@ export declare class AnimationGroup implements IDisposable {
|
|
|
74
74
|
* This observable will notify when all animations are playing.
|
|
75
75
|
*/
|
|
76
76
|
onAnimationGroupPlayObservable: Observable<AnimationGroup>;
|
|
77
|
+
/**
|
|
78
|
+
* Gets or sets an object used to store user defined information for the node
|
|
79
|
+
*/
|
|
80
|
+
metadata: any;
|
|
77
81
|
/**
|
|
78
82
|
* Gets the first frame
|
|
79
83
|
*/
|
|
@@ -2,6 +2,7 @@ import { Animation } from "./animation.js";
|
|
|
2
2
|
import { Observable } from "../Misc/observable.js";
|
|
3
3
|
import { EngineStore } from "../Engines/engineStore.js";
|
|
4
4
|
import "./animatable.js";
|
|
5
|
+
import { Tags } from '../Misc/tags.js';
|
|
5
6
|
/**
|
|
6
7
|
* This class defines the direct association between an animation and a target
|
|
7
8
|
*/
|
|
@@ -77,6 +78,10 @@ var AnimationGroup = /** @class */ (function () {
|
|
|
77
78
|
* This observable will notify when all animations are playing.
|
|
78
79
|
*/
|
|
79
80
|
this.onAnimationGroupPlayObservable = new Observable();
|
|
81
|
+
/**
|
|
82
|
+
* Gets or sets an object used to store user defined information for the node
|
|
83
|
+
*/
|
|
84
|
+
this.metadata = null;
|
|
80
85
|
this._scene = scene || EngineStore.LastCreatedScene;
|
|
81
86
|
this.uniqueId = this._scene.getUniqueId();
|
|
82
87
|
this._scene.addAnimationGroup(this);
|
|
@@ -527,6 +532,13 @@ var AnimationGroup = /** @class */ (function () {
|
|
|
527
532
|
var targetedAnimation = this.targetedAnimations[targetedAnimationIndex];
|
|
528
533
|
serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();
|
|
529
534
|
}
|
|
535
|
+
if (Tags && Tags.HasTags(this)) {
|
|
536
|
+
serializationObject.tags = Tags.GetTags(this);
|
|
537
|
+
}
|
|
538
|
+
// Metadata
|
|
539
|
+
if (this.metadata) {
|
|
540
|
+
serializationObject.metadata = this.metadata;
|
|
541
|
+
}
|
|
530
542
|
return serializationObject;
|
|
531
543
|
};
|
|
532
544
|
// Statics
|
|
@@ -558,6 +570,12 @@ var AnimationGroup = /** @class */ (function () {
|
|
|
558
570
|
if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {
|
|
559
571
|
animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);
|
|
560
572
|
}
|
|
573
|
+
if (Tags) {
|
|
574
|
+
Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);
|
|
575
|
+
}
|
|
576
|
+
if (parsedAnimationGroup.metadata !== undefined) {
|
|
577
|
+
animationGroup.metadata = parsedAnimationGroup.metadata;
|
|
578
|
+
}
|
|
561
579
|
return animationGroup;
|
|
562
580
|
};
|
|
563
581
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationGroup.js","sourceRoot":"","sources":["../../../sourceES6/core/Animations/animationGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,cAAc,CAAC;AAGtB;;GAEG;AACH;IAAA;IA6BA,CAAC;IAnBG;;;OAGG;IACI,wCAAY,GAAnB;QACI,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,qCAAS,GAAhB;QACI,IAAI,mBAAmB,GAAQ,EAAE,CAAC;QAClC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3D,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAE9C,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IACL,wBAAC;AAAD,CAAC,AA7BD,IA6BC;;AAED;;GAEG;AACH;IAmKI;;;;;;OAMG;IACH;IACI,sCAAsC;IAC/B,IAAY,EACnB,KAA6B;QAA7B,sBAAA,EAAA,YAA6B;QADtB,SAAI,GAAJ,IAAI,CAAQ;QAzKf,wBAAmB,GAAG,IAAI,KAAK,EAAqB,CAAC;QACrD,iBAAY,GAAG,IAAI,KAAK,EAAc,CAAC;QACvC,UAAK,GAAG,MAAM,CAAC,SAAS,CAAC;QACzB,QAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QAGxB,gBAAW,GAAG,CAAC,CAAC;QAChB,mBAAc,GAAG,KAAK,CAAC;QACvB,gBAAW,GAAG,KAAK,CAAC;QAE5B,cAAc;QACP,qBAAgB,GAA4B,IAAI,CAAC;QAOxD;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAEtE;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAEvE;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAEzE;;WAEG;QACI,kCAA6B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAExE;;WAEG;QACI,oCAA+B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAE1E;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAkB,CAAC;QA6HrE,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC,gBAAiB,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IA5HD,sBAAW,gCAAI;QAHf;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;;;OAAA;IAKD,sBAAW,8BAAE;QAHb;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,GAAG,CAAC;QACpB,CAAC;;;OAAA;IAKD,sBAAW,qCAAS;QAHpB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAKD,sBAAW,qCAAS;QAHpB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,CAAC;;;OAAA;IAKD,sBAAW,sCAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED;;WAEG;aACH,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aAC5C;QACL,CAAC;;;OAhBA;IAqBD,sBAAW,yCAAa;QAHxB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAc;YACnC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAE5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1C,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;aAClD;QACL,CAAC;;;OAbA;IAkBD,sBAAW,sCAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAc;YAChC,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aAC5C;QACL,CAAC;;;OAbA;IAkBD,sBAAW,8CAAkB;QAH7B;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;;;OAAA;IAKD,sBAAW,uCAAW;QAHtB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;;;OAAA;IAKD,sBAAW,oCAAQ;QAHnB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;;;OAAA;IAmBD;;;;;OAKG;IACI,6CAAoB,GAA3B,UAA4B,SAAoB,EAAE,MAAW;QACzD,IAAI,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAChD,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;QACxC,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC;QAElC,IAAI,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAC9B;QAED,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;YACxC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SAC1C;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEjD,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACI,kCAAS,GAAhB,UAAiB,UAAmC,EAAE,QAAiC;QAAtE,2BAAA,EAAA,iBAAmC;QAAE,yBAAA,EAAA,eAAiC;QACnF,IAAI,UAAU,IAAI,IAAI,EAAE;YAAE,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;SAAE;QACpD,IAAI,QAAQ,IAAI,IAAI,EAAE;YAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;SAAE;QAE9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAClE,IAAI,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACjD,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEnC,IAAI,QAAQ,CAAC,KAAK,GAAG,UAAU,EAAE;gBAC7B,IAAI,MAAM,GAAkB;oBACxB,KAAK,EAAE,UAAU;oBACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,aAAa,EAAE,QAAQ,CAAC,aAAa;iBACxC,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;aAC7B;YAED,IAAI,MAAM,CAAC,KAAK,GAAG,QAAQ,EAAE;gBACzB,IAAI,MAAM,GAAkB;oBACxB,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;iBACtC,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrB;SACJ;QAED,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QAEpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAKO,qCAAY,GAApB,UAAqB,UAAsB,EAAE,iBAAoC,EAAE,KAAa;QAAhG,iBAiBC;QAhBG,UAAU,CAAC,eAAe,GAAG;YACzB,KAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAElE,IAAI,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBACjC,OAAO;aACV;YAED,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAEvC,KAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,KAAI,CAAC,mBAAmB,KAAK,KAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;gBAC9D,KAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,KAAI,CAAC,CAAC;gBAC1D,KAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAC7B,KAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;aACjC;QACL,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACI,8BAAK,GAAZ,UAAa,IAAY,EAAE,UAAc,EAAE,IAAa,EAAE,EAAW,EAAE,UAAoB;QAA3F,iBAwCC;QAxCY,qBAAA,EAAA,YAAY;QAAE,2BAAA,EAAA,cAAc;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1D,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;;YAG1B,IAAM,iBAAiB,GAAG,OAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1D,IAAI,UAAU,GAAG,OAAK,MAAM,CAAC,oBAAoB,CAC7C,iBAAiB,CAAC,MAAM,EACxB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAC7B,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAK,KAAK,EACtC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAK,GAAG,EAChC,IAAI,EACJ,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAK,WAAW,CAC3D,CAAC;YACF,UAAU,CAAC,cAAc,GAAG;gBACxB,KAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;gBACjE,KAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC,CAAC;YAEF,OAAK,YAAY,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACxD,OAAK,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;QAnBvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE;;SAoBnE;QAED,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,8BAAK,GAAZ;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,+BAA+B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE3D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,6BAAI,GAAX,UAAY,IAAc;QACtB,8CAA8C;QAC9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YAChF,IAAI,IAAI,KAAK,SAAS,EAAE;gBACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC7B;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;SAClB;aAAM;YACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACtC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,8BAAK,GAAZ;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,gCAAO,GAAd;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,OAAO,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,6BAAI,GAAX;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACrC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,mDAA0B,GAAjC,UAAkC,MAAc;QAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;SAC9B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,8CAAqB,GAA5B,UAA6B,IAA0B;QACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC7B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,kCAAS,GAAhB,UAAiB,KAAa;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,gCAAO,GAAd;QACI,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,oBAAoB;QACpB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAChD;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAM,OAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,OAAK,GAAG,CAAC,CAAC,EAAE;gBACZ,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAK,EAAE,CAAC,CAAC,CAAC;aAC1D;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAChC;QAED,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,CAAC;QAC7C,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC;IAEO,kDAAyB,GAAjC,UAAkC,UAAsB;QACpD,8CAA8C;QAC9C,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;YACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SACpC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC5D;IACL,CAAC;IAED;;;;;;OAMG;IACI,8BAAK,GAAZ,UAAa,OAAe,EAAE,eAAyC,EAAE,eAAuB;QAAvB,gCAAA,EAAA,uBAAuB;QAC5F,IAAI,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAErE,KAA4B,UAAwB,EAAxB,KAAA,IAAI,CAAC,mBAAmB,EAAxB,cAAwB,EAAxB,IAAwB,EAAE;YAAjD,IAAI,eAAe,SAAA;YACpB,QAAQ,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,EACzG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SAC3F;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,kCAAS,GAAhB;QACI,IAAI,mBAAmB,GAAQ,EAAE,CAAC;QAElC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC5C,KAAK,IAAI,sBAAsB,GAAG,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE;YACpH,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YACxE,mBAAmB,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;SAClG;QAED,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED,UAAU;IACV;;;;;OAKG;IACW,oBAAK,GAAnB,UAAoB,oBAAyB,EAAE,KAAY;QACvD,IAAI,cAAc,GAAG,IAAI,cAAc,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrE,IAAI,iBAAiB,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACnE,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACpC,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE,EAAE,yBAAyB;gBACjF,IAAI,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,WAAW,EAAE;oBACb,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;iBAC/D;aACJ;iBACI;gBACD,IAAI,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAEvC,IAAI,UAAU,IAAI,IAAI,EAAE;oBACpB,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;iBAC9D;aACJ;SACJ;QAED,IAAI,oBAAoB,CAAC,IAAI,KAAK,IAAI,IAAI,oBAAoB,CAAC,EAAE,KAAK,IAAI,EAAE;YACxE,cAAc,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAChF;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;;;;;OAQG;IACW,oCAAqB,GAAnC,UAAoC,oBAAoC,EAAE,cAAkB,EAAE,KAAc,EAAE,aAAqB,EAAE,UAAmB;QAA9E,+BAAA,EAAA,kBAAkB;QAAkB,8BAAA,EAAA,qBAAqB;QAC/H,IAAI,cAAc,GAAG,oBAAoB,CAAC;QAC1C,IAAI,aAAa,EAAE;YACf,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;SAClF;QAED,IAAI,kBAAkB,GAAG,cAAc,CAAC,kBAAkB,CAAC;QAC3D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC5D,IAAI,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAClD,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;SACvF;QAED,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC;QAEjC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,qCAAY,GAAnB;QACI,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,iCAAQ,GAAf,UAAgB,WAAqB;QACjC,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,WAAW,EAAE;YACb,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;YAC3B,GAAG,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC;YACzC,GAAG,IAAI,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC;YAC3C,GAAG,IAAI,+BAA+B,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACzE,GAAG,IAAI,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC;SACvD;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAEL,qBAAC;AAAD,CAAC,AAnoBD,IAmoBC","sourcesContent":["import { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport { IAnimationKey } from \"./animationKey\";\r\n\r\nimport { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport \"./animatable\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array<TargetedAnimation>();\r\n private _animatables = new Array<Animatable>();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * Gets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n /**\r\n * Gets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array<TargetedAnimation> {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array<Animatable> {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/how_to/group\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable<Scene> = null) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n let targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n let keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable<number> = null, endFrame: Nullable<number> = null): AnimationGroup {\r\n if (beginFrame == null) { beginFrame = this._from; }\r\n if (endFrame == null) { endFrame = this._to; }\r\n\r\n for (var index = 0; index < this._targetedAnimations.length; index++) {\r\n let targetedAnimation = this._targetedAnimations[index];\r\n let keys = targetedAnimation.animation.getKeys();\r\n let startKey = keys[0];\r\n let endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n let newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n let newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._targetedAnimations.length) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n\r\n for (var index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n let animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n var list = this._animatables.slice();\r\n for (var index = 0; index < list.length; index++) {\r\n list[index].stop();\r\n }\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n * @param weight defines the weight to use\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable<Animatable>): AnimationGroup {\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @return the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations = [];\r\n this._animatables = [];\r\n\r\n // Remove from scene\r\n var index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n let idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n let newGroup = new AnimationGroup(newName || this.name, this._scene);\r\n\r\n for (var targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target);\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.targetedAnimations = [];\r\n for (var targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n var targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n var animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene);\r\n for (var i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n var targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n var animation = Animation.Parse(targetedAnimation.animation);\r\n var id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") { // morph target animation\r\n let morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n }\r\n else {\r\n var targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame = 0, range?: string, cloneOriginal = false, clonedName?: string): AnimationGroup {\r\n let animationGroup = sourceAnimationGroup;\r\n if (cloneOriginal) {\r\n animationGroup = sourceAnimationGroup.clone(clonedName || animationGroup.name);\r\n }\r\n\r\n let targetedAnimations = animationGroup.targetedAnimations;\r\n for (var index = 0; index < targetedAnimations.length; index++) {\r\n let targetedAnimation = targetedAnimations[index];\r\n Animation.MakeAnimationAdditive(targetedAnimation.animation, referenceFrame, range);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n var ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"animationGroup.js","sourceRoot":"","sources":["../../../sourceES6/core/Animations/animationGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport { IAnimationKey } from \"./animationKey\";\r\n\r\nimport { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport \"./animatable\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\nimport { Tags } from '../Misc/tags';\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array<TargetedAnimation>();\r\n private _animatables = new Array<Animatable>();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * Gets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n /**\r\n * Gets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array<TargetedAnimation> {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array<Animatable> {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/how_to/group\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable<Scene> = null) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n let targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n let keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable<number> = null, endFrame: Nullable<number> = null): AnimationGroup {\r\n if (beginFrame == null) { beginFrame = this._from; }\r\n if (endFrame == null) { endFrame = this._to; }\r\n\r\n for (var index = 0; index < this._targetedAnimations.length; index++) {\r\n let targetedAnimation = this._targetedAnimations[index];\r\n let keys = targetedAnimation.animation.getKeys();\r\n let startKey = keys[0];\r\n let endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n let newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n let newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._targetedAnimations.length) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n\r\n for (var index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n let animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n var list = this._animatables.slice();\r\n for (var index = 0; index < list.length; index++) {\r\n list[index].stop();\r\n }\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n * @param weight defines the weight to use\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable<Animatable>): AnimationGroup {\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @return the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (var index = 0; index < this._animatables.length; index++) {\r\n let animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations = [];\r\n this._animatables = [];\r\n\r\n // Remove from scene\r\n var index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n let idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n let newGroup = new AnimationGroup(newName || this.name, this._scene);\r\n\r\n for (var targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target);\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.targetedAnimations = [];\r\n for (var targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n var targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n var animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene);\r\n for (var i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n var targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n var animation = Animation.Parse(targetedAnimation.animation);\r\n var id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") { // morph target animation\r\n let morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n }\r\n else {\r\n var targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);\r\n }\r\n\r\n if (parsedAnimationGroup.metadata !== undefined) {\r\n animationGroup.metadata = parsedAnimationGroup.metadata;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame = 0, range?: string, cloneOriginal = false, clonedName?: string): AnimationGroup {\r\n let animationGroup = sourceAnimationGroup;\r\n if (cloneOriginal) {\r\n animationGroup = sourceAnimationGroup.clone(clonedName || animationGroup.name);\r\n }\r\n\r\n let targetedAnimations = animationGroup.targetedAnimations;\r\n for (var index = 0; index < targetedAnimations.length; index++) {\r\n let targetedAnimation = targetedAnimations[index];\r\n Animation.MakeAnimationAdditive(targetedAnimation.animation, referenceFrame, range);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n var ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -290,7 +290,7 @@ var FollowBehavior = /** @class */ (function () {
|
|
|
290
290
|
return (angle * 180) / Math.PI > this.orientToCameraDeadzoneDegrees;
|
|
291
291
|
};
|
|
292
292
|
FollowBehavior.prototype._updateLeashing = function (camera) {
|
|
293
|
-
if (this.attachedNode) {
|
|
293
|
+
if (this.attachedNode && this._enabled) {
|
|
294
294
|
var oldParent = this.attachedNode.parent;
|
|
295
295
|
this.attachedNode.setParent(null);
|
|
296
296
|
var worldMatrix = this.attachedNode.getWorldMatrix();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"followBehavior.js","sourceRoot":"","sources":["../../../../sourceES6/core/Behaviors/Meshes/followBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { Behavior } from \"../behavior\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Nullable } from \"../../types\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { Matrix, Quaternion, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will follow a camera\r\n * @since 5.0.0\r\n */\r\nexport class FollowBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n\r\n // Memory cache to avoid GC usage\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVectors: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n private _tmpMatrix: Matrix = new Matrix();\r\n private _tmpInvertView: Matrix = new Matrix();\r\n private _tmpForward: Vector3 = new Vector3();\r\n private _tmpNodeForward: Vector3 = new Vector3();\r\n private _tmpPosition: Vector3 = new Vector3();\r\n\r\n private _followedCamera: Nullable<Camera>;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _recenterNextUpdate = true;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public attachedNode: Nullable<TransformNode>;\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 = 500;\r\n\r\n /**\r\n * If the behavior should ignore the pitch and roll of the camera.\r\n */\r\n public ignoreCameraPitchAndRoll = false;\r\n\r\n /**\r\n * Pitch offset from camera (relative to Max Distance)\r\n * Is only effective if `ignoreCameraPitchAndRoll` is set to `true`.\r\n */\r\n public pitchOffset = 15;\r\n\r\n /**\r\n * The vertical angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewVerticalDegrees = 30;\r\n\r\n /**\r\n * The horizontal angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewHorizontalDegrees = 30;\r\n /**\r\n * The attached node will not reorient until the angle between its forward vector and the vector to the camera is greater than this value\r\n */\r\n public orientToCameraDeadzoneDegrees = 60;\r\n /**\r\n * Option to ignore distance clamping\r\n */\r\n public ignoreDistanceClamp = false;\r\n /**\r\n * Option to ignore angle clamping\r\n */\r\n public ignoreAngleClamp = false;\r\n /**\r\n * Max vertical distance between the attachedNode and camera\r\n */\r\n public verticalMaxDistance = 0;\r\n /**\r\n * Default distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public defaultDistance = 0.8;\r\n /**\r\n * Max distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public maximumDistance = 2;\r\n /**\r\n * Min distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public minimumDistance = 0.3;\r\n\r\n /**\r\n * Ignore vertical movement and lock the Y position of the object.\r\n */\r\n public useFixedVerticalOffset = false;\r\n\r\n /**\r\n * Fixed vertical position offset distance.\r\n */\r\n public fixedVerticalOffset = 0;\r\n\r\n /**\r\n * Enables/disables the behavior\r\n * @hidden\r\n */\r\n public _enabled = true;\r\n\r\n /**\r\n * The camera that should be followed by this behavior\r\n */\r\n public get followedCamera(): Nullable<Camera> {\r\n return this._followedCamera || this._scene.activeCamera;\r\n }\r\n\r\n public set followedCamera(camera: Nullable<Camera>) {\r\n this._followedCamera = camera;\r\n }\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"Follow\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() { }\r\n\r\n /**\r\n * Attaches the follow behavior\r\n * @param ownerNode The mesh that will be following once attached\r\n * @param followedCamera The camera that should be followed by the node\r\n */\r\n public attach(ownerNode: TransformNode, followedCamera?: Camera): void {\r\n this._scene = ownerNode.getScene();\r\n this.attachedNode = ownerNode;\r\n\r\n if (followedCamera) {\r\n this.followedCamera = followedCamera;\r\n }\r\n\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this.attachedNode = null;\r\n this._removeObservables();\r\n }\r\n\r\n /**\r\n * Recenters the attached node in front of the camera on the next update\r\n */\r\n public recenter() {\r\n this._recenterNextUpdate = true;\r\n }\r\n\r\n private _angleBetweenVectorAndPlane(vector: Vector3, normal: Vector3) {\r\n // Work on copies\r\n this._tmpVectors[0].copyFrom(vector);\r\n vector = this._tmpVectors[0];\r\n this._tmpVectors[1].copyFrom(normal);\r\n normal = this._tmpVectors[1];\r\n\r\n vector.normalize();\r\n normal.normalize();\r\n\r\n return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal));\r\n }\r\n\r\n private _length2D(vector: Vector3) {\r\n return Math.sqrt(vector.x * vector.x + vector.z * vector.z);\r\n }\r\n\r\n private _distanceClamp(currentToTarget: Vector3, moveToDefault: boolean = false) {\r\n let minDistance = this.minimumDistance;\r\n let maxDistance = this.maximumDistance;\r\n const defaultDistance = this.defaultDistance;\r\n\r\n const direction = this._tmpVectors[0];\r\n direction.copyFrom(currentToTarget);\r\n let currentDistance = direction.length();\r\n direction.normalizeFromLength(currentDistance);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n // If we don't account for pitch offset, the casted object will float up/down as the reference\r\n // gets closer to it because we will still be casting in the direction of the pitched offset.\r\n // To fix this, only modify the XZ position of the object.\r\n minDistance = this._length2D(direction) * minDistance;\r\n maxDistance = this._length2D(direction) * maxDistance;\r\n\r\n const currentDistance2D = this._length2D(currentToTarget);\r\n direction.scaleInPlace(currentDistance / currentDistance2D);\r\n currentDistance = currentDistance2D;\r\n }\r\n\r\n let clampedDistance = currentDistance;\r\n\r\n if (moveToDefault) {\r\n clampedDistance = defaultDistance;\r\n } else {\r\n clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance);\r\n }\r\n\r\n currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance);\r\n\r\n return currentDistance !== clampedDistance;\r\n }\r\n\r\n private _applyVerticalClamp(currentToTarget: Vector3) {\r\n if (this.verticalMaxDistance !== 0) {\r\n currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance);\r\n }\r\n }\r\n\r\n private _toOrientationQuatToRef(vector: Vector3, quaternion: Quaternion) {\r\n Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion);\r\n }\r\n\r\n private _applyPitchOffset(invertView: Matrix) {\r\n const forward = this._tmpVectors[0];\r\n const right = this._tmpVectors[1];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n right.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n forward.y = 0;\r\n forward.normalize();\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n Quaternion.RotationAxisToRef(right, (this.pitchOffset * Math.PI) / 180, this._tmpQuaternion);\r\n forward.rotateByQuaternionToRef(this._tmpQuaternion, forward);\r\n this._toOrientationQuatToRef(forward, this._tmpQuaternion);\r\n this._tmpQuaternion.toRotationMatrix(this._tmpMatrix);\r\n\r\n // Since we already extracted position from the invert view matrix, we can\r\n // disregard the position part of the matrix in the copy\r\n invertView.copyFrom(this._tmpMatrix);\r\n }\r\n\r\n private _angularClamp(invertView: Matrix, currentToTarget: Vector3): boolean {\r\n const forward = this._tmpVectors[5];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const right = this._tmpVectors[6];\r\n right.copyFromFloats(1, 0, 0);\r\n\r\n // forward and right are related to camera frame of reference\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n // Up is global Z\r\n const up = Vector3.UpReadOnly;\r\n\r\n const dist = currentToTarget.length();\r\n\r\n if (dist < Epsilon) {\r\n return false;\r\n }\r\n\r\n let angularClamped = false;\r\n const rotationQuat = this._tmpQuaternion;\r\n\r\n // X-axis leashing\r\n if (this.ignoreCameraPitchAndRoll) {\r\n const angle = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n Quaternion.RotationAxisToRef(right, angle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n } else {\r\n const angle = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n const minMaxAngle = ((this.maxViewVerticalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n }\r\n\r\n // Y-axis leashing\r\n const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1);\r\n const minMaxAngle = ((this.maxViewHorizontalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n\r\n return angularClamped;\r\n }\r\n\r\n private _orientationClamp(currentToTarget: Vector3, rotationQuaternion: Quaternion) {\r\n // Construct a rotation quat from up vector and target vector\r\n const toFollowed = this._tmpVectors[0];\r\n toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize();\r\n\r\n const up = this._tmpVectors[1];\r\n const right = this._tmpVectors[2];\r\n // We use global up vector to orient the following node (global +Y)\r\n up.copyFromFloats(0, 1, 0);\r\n\r\n // Gram-Schmidt to create an orthonormal frame\r\n Vector3.CrossToRef(toFollowed, up, right);\r\n const length = right.length();\r\n\r\n if (length < Epsilon) {\r\n return;\r\n }\r\n\r\n right.normalizeFromLength(length);\r\n\r\n Vector3.CrossToRef(right, toFollowed, up);\r\n if (this.attachedNode?.getScene().useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion);\r\n }\r\n }\r\n\r\n private _passedOrientationDeadzone(currentToTarget: Vector3, forward: Vector3) {\r\n const leashToFollow = this._tmpVectors[5];\r\n leashToFollow.copyFrom(currentToTarget);\r\n leashToFollow.normalize();\r\n\r\n const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly));\r\n return (angle * 180) / Math.PI > this.orientToCameraDeadzoneDegrees;\r\n }\r\n\r\n private _updateLeashing(camera: Camera) {\r\n if (this.attachedNode) {\r\n let oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n const worldMatrix = this.attachedNode.getWorldMatrix();\r\n const currentToTarget = this._workingPosition;\r\n const rotationQuaternion = this._workingQuaternion;\r\n const pivot = this.attachedNode.getPivotPoint();\r\n const invertView = this._tmpInvertView;\r\n invertView.copyFrom(camera.getViewMatrix());\r\n invertView.invert();\r\n\r\n Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget);\r\n const position = this._tmpPosition;\r\n position.copyFromFloats(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(position, worldMatrix, position);\r\n position.scaleInPlace(-1).subtractInPlace(pivot);\r\n currentToTarget.subtractInPlace(camera.globalPosition);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n this._applyPitchOffset(invertView);\r\n }\r\n\r\n let angularClamped = false;\r\n const forward = this._tmpForward;\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n\r\n const nodeForward = this._tmpNodeForward;\r\n nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward);\r\n\r\n if (this._recenterNextUpdate) {\r\n currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance);\r\n } else {\r\n if (this.ignoreAngleClamp) {\r\n const currentDistance = currentToTarget.length();\r\n currentToTarget.copyFrom(forward).scaleInPlace(currentDistance);\r\n } else {\r\n angularClamped = this._angularClamp(invertView, currentToTarget);\r\n }\r\n }\r\n\r\n let distanceClamped = false;\r\n if (!this.ignoreDistanceClamp) {\r\n distanceClamped = this._distanceClamp(currentToTarget, angularClamped);\r\n this._applyVerticalClamp(currentToTarget);\r\n }\r\n\r\n if (this.useFixedVerticalOffset) {\r\n currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset;\r\n }\r\n\r\n if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) {\r\n this._orientationClamp(currentToTarget, rotationQuaternion);\r\n }\r\n\r\n this._workingPosition.subtractInPlace(pivot);\r\n this._recenterNextUpdate = false;\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this.attachedNode || !this.followedCamera || !this._enabled) {\r\n return;\r\n }\r\n\r\n if (!this.attachedNode.rotationQuaternion) {\r\n this.attachedNode.rotationQuaternion = Quaternion.Identity();\r\n }\r\n\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n if (!this.interpolatePose) {\r\n this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition);\r\n this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const currentDirection = new Vector3();\r\n currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition);\r\n Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection);\r\n currentDirection.addInPlace(this.followedCamera.globalPosition);\r\n this.attachedNode.position.copyFrom(currentDirection);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this.attachedNode.rotationQuaternion);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion);\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this.followedCamera) {\r\n return;\r\n }\r\n\r\n const tick = Date.now();\r\n this._updateLeashing(this.followedCamera);\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n if (this._onBeforeRender) {\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"followBehavior.js","sourceRoot":"","sources":["../../../../sourceES6/core/Behaviors/Meshes/followBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { Behavior } from \"../behavior\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Nullable } from \"../../types\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { Matrix, Quaternion, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Epsilon } from \"../../Maths/math.constants\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will follow a camera\r\n * @since 5.0.0\r\n */\r\nexport class FollowBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n\r\n // Memory cache to avoid GC usage\r\n private _tmpQuaternion: Quaternion = new Quaternion();\r\n private _tmpVectors: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n private _tmpMatrix: Matrix = new Matrix();\r\n private _tmpInvertView: Matrix = new Matrix();\r\n private _tmpForward: Vector3 = new Vector3();\r\n private _tmpNodeForward: Vector3 = new Vector3();\r\n private _tmpPosition: Vector3 = new Vector3();\r\n\r\n private _followedCamera: Nullable<Camera>;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n\r\n private _workingPosition: Vector3 = new Vector3();\r\n private _workingQuaternion: Quaternion = new Quaternion();\r\n private _lastTick: number = -1;\r\n private _recenterNextUpdate = true;\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public attachedNode: Nullable<TransformNode>;\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 = 500;\r\n\r\n /**\r\n * If the behavior should ignore the pitch and roll of the camera.\r\n */\r\n public ignoreCameraPitchAndRoll = false;\r\n\r\n /**\r\n * Pitch offset from camera (relative to Max Distance)\r\n * Is only effective if `ignoreCameraPitchAndRoll` is set to `true`.\r\n */\r\n public pitchOffset = 15;\r\n\r\n /**\r\n * The vertical angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewVerticalDegrees = 30;\r\n\r\n /**\r\n * The horizontal angle from the camera forward axis to the owner will not exceed this value\r\n */\r\n public maxViewHorizontalDegrees = 30;\r\n /**\r\n * The attached node will not reorient until the angle between its forward vector and the vector to the camera is greater than this value\r\n */\r\n public orientToCameraDeadzoneDegrees = 60;\r\n /**\r\n * Option to ignore distance clamping\r\n */\r\n public ignoreDistanceClamp = false;\r\n /**\r\n * Option to ignore angle clamping\r\n */\r\n public ignoreAngleClamp = false;\r\n /**\r\n * Max vertical distance between the attachedNode and camera\r\n */\r\n public verticalMaxDistance = 0;\r\n /**\r\n * Default distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public defaultDistance = 0.8;\r\n /**\r\n * Max distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public maximumDistance = 2;\r\n /**\r\n * Min distance from eye to attached node, i.e. the sphere radius\r\n */\r\n public minimumDistance = 0.3;\r\n\r\n /**\r\n * Ignore vertical movement and lock the Y position of the object.\r\n */\r\n public useFixedVerticalOffset = false;\r\n\r\n /**\r\n * Fixed vertical position offset distance.\r\n */\r\n public fixedVerticalOffset = 0;\r\n\r\n /**\r\n * Enables/disables the behavior\r\n * @hidden\r\n */\r\n public _enabled = true;\r\n\r\n /**\r\n * The camera that should be followed by this behavior\r\n */\r\n public get followedCamera(): Nullable<Camera> {\r\n return this._followedCamera || this._scene.activeCamera;\r\n }\r\n\r\n public set followedCamera(camera: Nullable<Camera>) {\r\n this._followedCamera = camera;\r\n }\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"Follow\";\r\n }\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() { }\r\n\r\n /**\r\n * Attaches the follow behavior\r\n * @param ownerNode The mesh that will be following once attached\r\n * @param followedCamera The camera that should be followed by the node\r\n */\r\n public attach(ownerNode: TransformNode, followedCamera?: Camera): void {\r\n this._scene = ownerNode.getScene();\r\n this.attachedNode = ownerNode;\r\n\r\n if (followedCamera) {\r\n this.followedCamera = followedCamera;\r\n }\r\n\r\n this._addObservables();\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this.attachedNode = null;\r\n this._removeObservables();\r\n }\r\n\r\n /**\r\n * Recenters the attached node in front of the camera on the next update\r\n */\r\n public recenter() {\r\n this._recenterNextUpdate = true;\r\n }\r\n\r\n private _angleBetweenVectorAndPlane(vector: Vector3, normal: Vector3) {\r\n // Work on copies\r\n this._tmpVectors[0].copyFrom(vector);\r\n vector = this._tmpVectors[0];\r\n this._tmpVectors[1].copyFrom(normal);\r\n normal = this._tmpVectors[1];\r\n\r\n vector.normalize();\r\n normal.normalize();\r\n\r\n return Math.PI / 2 - Math.acos(Vector3.Dot(vector, normal));\r\n }\r\n\r\n private _length2D(vector: Vector3) {\r\n return Math.sqrt(vector.x * vector.x + vector.z * vector.z);\r\n }\r\n\r\n private _distanceClamp(currentToTarget: Vector3, moveToDefault: boolean = false) {\r\n let minDistance = this.minimumDistance;\r\n let maxDistance = this.maximumDistance;\r\n const defaultDistance = this.defaultDistance;\r\n\r\n const direction = this._tmpVectors[0];\r\n direction.copyFrom(currentToTarget);\r\n let currentDistance = direction.length();\r\n direction.normalizeFromLength(currentDistance);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n // If we don't account for pitch offset, the casted object will float up/down as the reference\r\n // gets closer to it because we will still be casting in the direction of the pitched offset.\r\n // To fix this, only modify the XZ position of the object.\r\n minDistance = this._length2D(direction) * minDistance;\r\n maxDistance = this._length2D(direction) * maxDistance;\r\n\r\n const currentDistance2D = this._length2D(currentToTarget);\r\n direction.scaleInPlace(currentDistance / currentDistance2D);\r\n currentDistance = currentDistance2D;\r\n }\r\n\r\n let clampedDistance = currentDistance;\r\n\r\n if (moveToDefault) {\r\n clampedDistance = defaultDistance;\r\n } else {\r\n clampedDistance = Scalar.Clamp(currentDistance, minDistance, maxDistance);\r\n }\r\n\r\n currentToTarget.copyFrom(direction).scaleInPlace(clampedDistance);\r\n\r\n return currentDistance !== clampedDistance;\r\n }\r\n\r\n private _applyVerticalClamp(currentToTarget: Vector3) {\r\n if (this.verticalMaxDistance !== 0) {\r\n currentToTarget.y = Scalar.Clamp(currentToTarget.y, -this.verticalMaxDistance, this.verticalMaxDistance);\r\n }\r\n }\r\n\r\n private _toOrientationQuatToRef(vector: Vector3, quaternion: Quaternion) {\r\n Quaternion.RotationYawPitchRollToRef(Math.atan2(vector.x, vector.z), Math.atan2(vector.y, Math.sqrt(vector.z * vector.z + vector.x * vector.x)), 0, quaternion);\r\n }\r\n\r\n private _applyPitchOffset(invertView: Matrix) {\r\n const forward = this._tmpVectors[0];\r\n const right = this._tmpVectors[1];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n right.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n forward.y = 0;\r\n forward.normalize();\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n Quaternion.RotationAxisToRef(right, (this.pitchOffset * Math.PI) / 180, this._tmpQuaternion);\r\n forward.rotateByQuaternionToRef(this._tmpQuaternion, forward);\r\n this._toOrientationQuatToRef(forward, this._tmpQuaternion);\r\n this._tmpQuaternion.toRotationMatrix(this._tmpMatrix);\r\n\r\n // Since we already extracted position from the invert view matrix, we can\r\n // disregard the position part of the matrix in the copy\r\n invertView.copyFrom(this._tmpMatrix);\r\n }\r\n\r\n private _angularClamp(invertView: Matrix, currentToTarget: Vector3): boolean {\r\n const forward = this._tmpVectors[5];\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n const right = this._tmpVectors[6];\r\n right.copyFromFloats(1, 0, 0);\r\n\r\n // forward and right are related to camera frame of reference\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n Vector3.TransformNormalToRef(right, invertView, right);\r\n\r\n // Up is global Z\r\n const up = Vector3.UpReadOnly;\r\n\r\n const dist = currentToTarget.length();\r\n\r\n if (dist < Epsilon) {\r\n return false;\r\n }\r\n\r\n let angularClamped = false;\r\n const rotationQuat = this._tmpQuaternion;\r\n\r\n // X-axis leashing\r\n if (this.ignoreCameraPitchAndRoll) {\r\n const angle = Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n Quaternion.RotationAxisToRef(right, angle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n } else {\r\n const angle = -Vector3.GetAngleBetweenVectorsOnPlane(currentToTarget, forward, right);\r\n const minMaxAngle = ((this.maxViewVerticalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(right, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n }\r\n\r\n // Y-axis leashing\r\n const angle = this._angleBetweenVectorAndPlane(currentToTarget, right) * (this._scene.useRightHandedSystem ? -1 : 1);\r\n const minMaxAngle = ((this.maxViewHorizontalDegrees * Math.PI) / 180) * 0.5;\r\n if (angle < -minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle - minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n } else if (angle > minMaxAngle) {\r\n Quaternion.RotationAxisToRef(up, -angle + minMaxAngle, rotationQuat);\r\n currentToTarget.rotateByQuaternionToRef(rotationQuat, currentToTarget);\r\n angularClamped = true;\r\n }\r\n\r\n return angularClamped;\r\n }\r\n\r\n private _orientationClamp(currentToTarget: Vector3, rotationQuaternion: Quaternion) {\r\n // Construct a rotation quat from up vector and target vector\r\n const toFollowed = this._tmpVectors[0];\r\n toFollowed.copyFrom(currentToTarget).scaleInPlace(-1).normalize();\r\n\r\n const up = this._tmpVectors[1];\r\n const right = this._tmpVectors[2];\r\n // We use global up vector to orient the following node (global +Y)\r\n up.copyFromFloats(0, 1, 0);\r\n\r\n // Gram-Schmidt to create an orthonormal frame\r\n Vector3.CrossToRef(toFollowed, up, right);\r\n const length = right.length();\r\n\r\n if (length < Epsilon) {\r\n return;\r\n }\r\n\r\n right.normalizeFromLength(length);\r\n\r\n Vector3.CrossToRef(right, toFollowed, up);\r\n if (this.attachedNode?.getScene().useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toFollowed, up, rotationQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toFollowed, up, rotationQuaternion);\r\n }\r\n }\r\n\r\n private _passedOrientationDeadzone(currentToTarget: Vector3, forward: Vector3) {\r\n const leashToFollow = this._tmpVectors[5];\r\n leashToFollow.copyFrom(currentToTarget);\r\n leashToFollow.normalize();\r\n\r\n const angle = Math.abs(Vector3.GetAngleBetweenVectorsOnPlane(forward, leashToFollow, Vector3.UpReadOnly));\r\n return (angle * 180) / Math.PI > this.orientToCameraDeadzoneDegrees;\r\n }\r\n\r\n private _updateLeashing(camera: Camera) {\r\n if (this.attachedNode && this._enabled) {\r\n let oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n const worldMatrix = this.attachedNode.getWorldMatrix();\r\n const currentToTarget = this._workingPosition;\r\n const rotationQuaternion = this._workingQuaternion;\r\n const pivot = this.attachedNode.getPivotPoint();\r\n const invertView = this._tmpInvertView;\r\n invertView.copyFrom(camera.getViewMatrix());\r\n invertView.invert();\r\n\r\n Vector3.TransformCoordinatesToRef(pivot, worldMatrix, currentToTarget);\r\n const position = this._tmpPosition;\r\n position.copyFromFloats(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(position, worldMatrix, position);\r\n position.scaleInPlace(-1).subtractInPlace(pivot);\r\n currentToTarget.subtractInPlace(camera.globalPosition);\r\n\r\n if (this.ignoreCameraPitchAndRoll) {\r\n this._applyPitchOffset(invertView);\r\n }\r\n\r\n let angularClamped = false;\r\n const forward = this._tmpForward;\r\n forward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(forward, invertView, forward);\r\n\r\n const nodeForward = this._tmpNodeForward;\r\n nodeForward.copyFromFloats(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(nodeForward, worldMatrix, nodeForward);\r\n\r\n if (this._recenterNextUpdate) {\r\n currentToTarget.copyFrom(forward).scaleInPlace(this.defaultDistance);\r\n } else {\r\n if (this.ignoreAngleClamp) {\r\n const currentDistance = currentToTarget.length();\r\n currentToTarget.copyFrom(forward).scaleInPlace(currentDistance);\r\n } else {\r\n angularClamped = this._angularClamp(invertView, currentToTarget);\r\n }\r\n }\r\n\r\n let distanceClamped = false;\r\n if (!this.ignoreDistanceClamp) {\r\n distanceClamped = this._distanceClamp(currentToTarget, angularClamped);\r\n this._applyVerticalClamp(currentToTarget);\r\n }\r\n\r\n if (this.useFixedVerticalOffset) {\r\n currentToTarget.y = position.y - camera.globalPosition.y + this.fixedVerticalOffset;\r\n }\r\n\r\n if (angularClamped || distanceClamped || this._passedOrientationDeadzone(currentToTarget, nodeForward) || this._recenterNextUpdate) {\r\n this._orientationClamp(currentToTarget, rotationQuaternion);\r\n }\r\n\r\n this._workingPosition.subtractInPlace(pivot);\r\n this._recenterNextUpdate = false;\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n }\r\n\r\n private _updateTransformToGoal(elapsed: number) {\r\n if (!this.attachedNode || !this.followedCamera || !this._enabled) {\r\n return;\r\n }\r\n\r\n if (!this.attachedNode.rotationQuaternion) {\r\n this.attachedNode.rotationQuaternion = Quaternion.Identity();\r\n }\r\n\r\n const oldParent = this.attachedNode.parent;\r\n this.attachedNode.setParent(null);\r\n\r\n if (!this.interpolatePose) {\r\n this.attachedNode.position.copyFrom(this.followedCamera.globalPosition).addInPlace(this._workingPosition);\r\n this.attachedNode.rotationQuaternion.copyFrom(this._workingQuaternion);\r\n return;\r\n }\r\n\r\n // position\r\n const currentDirection = new Vector3();\r\n currentDirection.copyFrom(this.attachedNode.position).subtractInPlace(this.followedCamera.globalPosition);\r\n Vector3.SmoothToRef(currentDirection, this._workingPosition, elapsed, this.lerpTime, currentDirection);\r\n currentDirection.addInPlace(this.followedCamera.globalPosition);\r\n this.attachedNode.position.copyFrom(currentDirection);\r\n\r\n // rotation\r\n const currentRotation = new Quaternion();\r\n currentRotation.copyFrom(this.attachedNode.rotationQuaternion);\r\n Quaternion.SmoothToRef(currentRotation, this._workingQuaternion, elapsed, this.lerpTime, this.attachedNode.rotationQuaternion);\r\n\r\n this.attachedNode.setParent(oldParent);\r\n }\r\n\r\n private _addObservables() {\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this._scene.onBeforeRenderObservable.add(() => {\r\n if (!this.followedCamera) {\r\n return;\r\n }\r\n\r\n const tick = Date.now();\r\n this._updateLeashing(this.followedCamera);\r\n this._updateTransformToGoal(tick - this._lastTick);\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n if (this._onBeforeRender) {\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -149,6 +149,7 @@ var HandConstraintBehavior = /** @class */ (function () {
|
|
|
149
149
|
var middleMetacarpal = hand.getJointMesh("middle-finger-metacarpal" /* MIDDLE_FINGER_METACARPAL */);
|
|
150
150
|
var wrist = hand.getJointMesh("wrist" /* WRIST */);
|
|
151
151
|
if (wrist && middleMetacarpal && pinkyMetacarpal) {
|
|
152
|
+
var handPose = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };
|
|
152
153
|
// palm forward
|
|
153
154
|
var up = TmpVectors.Vector3[0];
|
|
154
155
|
var forward = TmpVectors.Vector3[1];
|
|
@@ -158,12 +159,8 @@ var HandConstraintBehavior = /** @class */ (function () {
|
|
|
158
159
|
// Create vectors for a rotation quaternion, where forward points out from the palm
|
|
159
160
|
Vector3.CrossToRef(up, forward, forward);
|
|
160
161
|
Vector3.CrossToRef(forward, up, left);
|
|
161
|
-
|
|
162
|
-
return
|
|
163
|
-
quaternion: quaternion,
|
|
164
|
-
position: middleMetacarpal.absolutePosition,
|
|
165
|
-
controllerId: hand.xrController.uniqueId
|
|
166
|
-
};
|
|
162
|
+
Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);
|
|
163
|
+
return handPose;
|
|
167
164
|
}
|
|
168
165
|
}
|
|
169
166
|
return null;
|
|
@@ -224,19 +221,18 @@ var HandConstraintBehavior = /** @class */ (function () {
|
|
|
224
221
|
var elapsed = Date.now() - lastTick;
|
|
225
222
|
Vector3.SmoothToRef(_this._node.position, targetPosition, elapsed, _this.lerpTime, _this._node.position);
|
|
226
223
|
Quaternion.SmoothToRef(_this._node.rotationQuaternion, targetRotation, elapsed, _this.lerpTime, _this._node.rotationQuaternion);
|
|
227
|
-
_this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.
|
|
224
|
+
_this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;
|
|
228
225
|
}
|
|
229
|
-
_this._setVisibility();
|
|
226
|
+
_this._setVisibility(pose);
|
|
230
227
|
lastTick = Date.now();
|
|
231
228
|
});
|
|
232
229
|
};
|
|
233
|
-
HandConstraintBehavior.prototype._setVisibility = function () {
|
|
230
|
+
HandConstraintBehavior.prototype._setVisibility = function (pose) {
|
|
234
231
|
var palmVisible = true;
|
|
235
232
|
var gazeVisible = true;
|
|
236
233
|
var camera = this._scene.activeCamera;
|
|
237
234
|
if (camera) {
|
|
238
235
|
var cameraForward = camera.getForwardRay();
|
|
239
|
-
var pose = this._getHandPose();
|
|
240
236
|
if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS ||
|
|
241
237
|
this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {
|
|
242
238
|
gazeVisible = false;
|
|
@@ -286,8 +282,16 @@ var HandConstraintBehavior = /** @class */ (function () {
|
|
|
286
282
|
* @param xr xr experience
|
|
287
283
|
*/
|
|
288
284
|
HandConstraintBehavior.prototype.linkToXRExperience = function (xr) {
|
|
289
|
-
|
|
290
|
-
|
|
285
|
+
try {
|
|
286
|
+
this._eyeTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING);
|
|
287
|
+
}
|
|
288
|
+
catch (_a) { }
|
|
289
|
+
try {
|
|
290
|
+
this._handTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING);
|
|
291
|
+
}
|
|
292
|
+
catch (_b) {
|
|
293
|
+
alert("Hand tracking must be enabled for the Hand Menu to work");
|
|
294
|
+
}
|
|
291
295
|
};
|
|
292
296
|
return HandConstraintBehavior;
|
|
293
297
|
}());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handConstraintBehavior.js","sourceRoot":"","sources":["../../../../sourceES6/core/Behaviors/Meshes/handConstraintBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport { WebXRHandTracking, XRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport { Behavior } from \"../behavior\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Ray } from \"../../Culling/ray\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable<WebXREyeTracking>;\r\n private _handTracking: Nullable<WebXRHandTracking>;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\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 = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose() {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(XRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(XRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(XRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n const quaternion = Quaternion.FromLookDirectionLH(forward, up);\r\n\r\n return {\r\n quaternion,\r\n position: middleMetacarpal.absolutePosition,\r\n controllerId: hand.xrController.uniqueId\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() { }\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.controllerId;\r\n }\r\n\r\n this._setVisibility();\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility() {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n const pose = this._getHandPose();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS ||\r\n this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < (this.gazeProximityRadius * this.gazeProximityRadius)) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP ||\r\n this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > ((this.palmUpStrictness * 2) - 1)) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper) {\r\n this._eyeTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n this._handTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"handConstraintBehavior.js","sourceRoot":"","sources":["../../../../sourceES6/core/Behaviors/Meshes/handConstraintBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport { WebXRHandTracking, XRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport { Behavior } from \"../behavior\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Ray } from \"../../Culling/ray\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\ntype HandPoseInfo = {\r\n position: Vector3;\r\n quaternion: Quaternion;\r\n id: string;\r\n};\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable<WebXREyeTracking>;\r\n private _handTracking: Nullable<WebXRHandTracking>;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\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 = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose(): Nullable<HandPoseInfo> {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(XRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(XRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(XRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n let handPose: HandPoseInfo = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };\r\n\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);\r\n\r\n return handPose;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() { }\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;\r\n }\r\n\r\n this._setVisibility(pose);\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility(pose: Nullable<HandPoseInfo>) {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS ||\r\n this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < (this.gazeProximityRadius * this.gazeProximityRadius)) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP ||\r\n this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > ((this.palmUpStrictness * 2) - 1)) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper) {\r\n try {\r\n this._eyeTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n } catch {}\r\n\r\n try {\r\n this._handTracking = xr.featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n } catch {\r\n alert(\"Hand tracking must be enabled for the Hand Menu to work\");\r\n }\r\n }\r\n}\r\n"]}
|
package/Engines/engine.js
CHANGED
|
@@ -346,15 +346,10 @@ var Engine = /** @class */ (function (_super) {
|
|
|
346
346
|
_this._windowIsBackground = false;
|
|
347
347
|
};
|
|
348
348
|
this._onCanvasPointerOut = function (ev) {
|
|
349
|
-
// Check
|
|
349
|
+
// Check that the element at the point of the pointer out isn't the canvas and if it isn't, notify observers
|
|
350
350
|
// Note: This is a workaround for a bug with Safari
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
var pointerX = ev.clientX - rect.left;
|
|
354
|
-
var pointerY = ev.clientY - rect.top;
|
|
355
|
-
if (pointerX < 0 || pointerX > rect.width || pointerY < 0 || pointerY > rect.height) {
|
|
356
|
-
_this.onCanvasPointerOutObservable.notifyObservers(ev);
|
|
357
|
-
}
|
|
351
|
+
if (document.elementFromPoint(ev.clientX, ev.clientY) !== canvas) {
|
|
352
|
+
_this.onCanvasPointerOutObservable.notifyObservers(ev);
|
|
358
353
|
}
|
|
359
354
|
};
|
|
360
355
|
if (IsWindowObjectExist()) {
|