@babylonjs/viewer 5.0.0-beta.3 → 5.0.0-beta.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"viewerModel.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/model/viewerModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { IDisposable } from \"@babylonjs/core/scene\";\nimport { ISceneLoaderPlugin, ISceneLoaderPluginAsync } from \"@babylonjs/core/Loading/sceneLoader\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\nimport { IParticleSystem } from \"@babylonjs/core/Particles/IParticleSystem\";\nimport { Skeleton } from \"@babylonjs/core/Bones/skeleton\";\nimport { Observable } from \"@babylonjs/core/Misc/observable\";\nimport { ISceneLoaderProgressEvent } from \"@babylonjs/core/Loading/sceneLoader\";\nimport { AnimationGroup } from \"@babylonjs/core/Animations/animationGroup\";\nimport { Animation, Animatable, CircleEase, BackEase, BounceEase, CubicEase, ElasticEase, ExponentialEase, PowerEase, QuadraticEase, QuarticEase, QuinticEase, SineEase } from \"@babylonjs/core/Animations/index\";\nimport { Nullable } from \"@babylonjs/core/types\";\nimport { Quaternion, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\nimport { Tags } from \"@babylonjs/core/Misc/tags\";\nimport { Material } from \"@babylonjs/core/Materials/material\";\nimport { PBRMaterial } from \"@babylonjs/core/Materials/PBR/pbrMaterial\";\nimport { MultiMaterial } from \"@babylonjs/core/Materials/multiMaterial\";\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { GLTFFileLoader } from \"@babylonjs/loaders/glTF/index\";\nimport { IAsset } from \"babylonjs-gltf2interface\";\nimport { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\nimport { IModelAnimationConfiguration } from \"../configuration/interfaces/modelAnimationConfiguration\";\nimport { IModelAnimation, GroupModelAnimation, AnimationPlayMode, ModelAnimationConfiguration, EasingFunction, AnimationState } from \"./modelAnimation\";\n\nimport { deepmerge, extendClassWithConfig } from '../helper/';\nimport { ObservablesManager } from \"../managers/observablesManager\";\nimport { ConfigurationContainer } from \"../configuration/configurationContainer\";\n\n/**\n * The current state of the model\n */\nexport enum ModelState {\n INIT,\n LOADING,\n LOADED,\n ENTRY,\n ENTRYDONE,\n COMPLETE,\n CANCELED,\n ERROR\n}\n\n/**\n * The viewer model is a container for all assets representing a sngle loaded model.\n */\nexport class ViewerModel implements IDisposable {\n /**\n * The loader used to load this model.\n */\n public loader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\n\n private _animations: Array<IModelAnimation>;\n\n /**\n * the list of meshes that are a part of this model\n */\n private _meshes: Array<AbstractMesh> = [];\n /**\n * This model's root mesh (the parent of all other meshes).\n * This mesh does not(!) exist in the meshes array.\n */\n public rootMesh: AbstractMesh;\n\n private _pivotMesh: AbstractMesh;\n /**\n * ParticleSystems connected to this model\n */\n public particleSystems: Array<IParticleSystem> = [];\n /**\n * Skeletons defined in this model\n */\n public skeletons: Array<Skeleton> = [];\n /**\n * The current model animation.\n * On init, this will be undefined.\n */\n public currentAnimation: IModelAnimation;\n\n /**\n * Observers registered here will be executed when the model is done loading\n */\n public onLoadedObservable: Observable<ViewerModel>;\n /**\n * Observers registered here will be executed when the loader notified of a progress event\n */\n public onLoadProgressObservable: Observable<ISceneLoaderProgressEvent>;\n /**\n * Observers registered here will be executed when the loader notified of an error.\n */\n public onLoadErrorObservable: Observable<{ message: string; exception: any }>;\n\n /**\n * Will be executed after the model finished loading and complete, including entry animation and lod\n */\n public onCompleteObservable: Observable<ViewerModel>;\n /**\n * Observers registered here will be executed every time the model is being configured.\n * This can be used to extend the model's configuration without extending the class itself\n */\n public onAfterConfigure: Observable<ViewerModel>;\n\n /**\n * The current model state (loaded, error, etc)\n */\n public state: ModelState;\n /**\n * A loadID provided by the modelLoader, unique to ths (Abstract)Viewer instance.\n */\n public loadId: number;\n\n public loadInfo: IAsset;\n private _loadedUrl: string;\n private _modelConfiguration: IModelConfiguration;\n\n private _loaderDone: boolean = false;\n\n private _entryAnimation: ModelAnimationConfiguration;\n private _exitAnimation: ModelAnimationConfiguration;\n private _scaleTransition: Animation;\n private _animatables: Array<Animatable> = [];\n private _frameRate: number = 60;\n\n private _shadowsRenderedAfterLoad: boolean = false;\n\n constructor(private _observablesManager: ObservablesManager, modelConfiguration: IModelConfiguration, private _configurationContainer?: ConfigurationContainer) {\n this.onLoadedObservable = new Observable();\n this.onLoadErrorObservable = new Observable();\n this.onLoadProgressObservable = new Observable();\n this.onCompleteObservable = new Observable();\n this.onAfterConfigure = new Observable();\n\n this.state = ModelState.INIT;\n\n let scene = this._configurationContainer && this._configurationContainer.scene;\n\n this.rootMesh = new AbstractMesh(\"modelRootMesh\", scene);\n this._pivotMesh = new AbstractMesh(\"pivotMesh\", scene);\n this._pivotMesh.parent = this.rootMesh;\n // rotate 180, gltf fun\n this._pivotMesh.rotation.y += Math.PI;\n\n this._scaleTransition = new Animation(\"scaleAnimation\", \"scaling\", this._frameRate, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\n\n this._animations = [];\n //create a copy of the configuration to make sure it doesn't change even after it is changed in the viewer\n this._modelConfiguration = deepmerge((this._configurationContainer && this._configurationContainer.configuration.model) || {}, modelConfiguration);\n\n if (this._observablesManager) { this._observablesManager.onModelAddedObservable.notifyObservers(this); }\n\n if (this._modelConfiguration.entryAnimation) {\n this.rootMesh.setEnabled(false);\n }\n\n this.onLoadedObservable.add(() => {\n this.updateConfiguration(this._modelConfiguration);\n if (this._observablesManager) { this._observablesManager.onModelLoadedObservable.notifyObservers(this); }\n this._initAnimations();\n });\n\n this.onCompleteObservable.add(() => {\n this.state = ModelState.COMPLETE;\n });\n }\n\n public get shadowsRenderedAfterLoad() {\n return this._shadowsRenderedAfterLoad;\n }\n\n public set shadowsRenderedAfterLoad(rendered: boolean) {\n if (!rendered) {\n throw new Error(\"can only be enabled\");\n } else {\n this._shadowsRenderedAfterLoad = rendered;\n }\n }\n\n public getViewerId() {\n return this._configurationContainer && this._configurationContainer.viewerId;\n }\n\n /**\n * Is this model enabled?\n */\n public get enabled() {\n return this.rootMesh.isEnabled();\n }\n\n /**\n * Set whether this model is enabled or not.\n */\n public set enabled(enable: boolean) {\n this.rootMesh.setEnabled(enable);\n }\n\n public set loaderDone(done: boolean) {\n this._loaderDone = done;\n this._checkCompleteState();\n }\n\n private _checkCompleteState() {\n if (this._loaderDone && (this.state === ModelState.ENTRYDONE)) {\n this._modelComplete();\n }\n }\n\n /**\n * Add a mesh to this model.\n * Any mesh that has no parent will be provided with the root mesh as its new parent.\n *\n * @param mesh the new mesh to add\n * @param triggerLoaded should this mesh trigger the onLoaded observable. Used when adding meshes manually.\n */\n public addMesh(mesh: AbstractMesh, triggerLoaded?: boolean) {\n if (!mesh.parent) {\n mesh.parent = this._pivotMesh;\n }\n\n if (mesh.getClassName() !== \"InstancedMesh\") {\n mesh.receiveShadows = !!this.configuration.receiveShadows;\n }\n\n this._meshes.push(mesh);\n if (triggerLoaded) {\n return this.onLoadedObservable.notifyObserversWithPromise(this);\n }\n }\n\n /**\n * get the list of meshes (excluding the root mesh)\n */\n public get meshes() {\n return this._meshes;\n }\n\n /**\n * Get the model's configuration\n */\n public get configuration(): IModelConfiguration {\n return this._modelConfiguration;\n }\n\n /**\n * (Re-)set the model's entire configuration\n * @param newConfiguration the new configuration to replace the new one\n */\n public set configuration(newConfiguration: IModelConfiguration) {\n this._modelConfiguration = newConfiguration;\n this._configureModel();\n }\n\n /**\n * Update the current configuration with new values.\n * Configuration will not be overwritten, but merged with the new configuration.\n * Priority is to the new configuration\n * @param newConfiguration the configuration to be merged into the current configuration;\n */\n public updateConfiguration(newConfiguration: Partial<IModelConfiguration>) {\n this._modelConfiguration = deepmerge(this._modelConfiguration, newConfiguration);\n this._configureModel();\n }\n\n private _initAnimations() {\n // check if this is not a gltf loader and init the animations\n if (this.skeletons.length) {\n this.skeletons.forEach((skeleton, idx) => {\n let ag = new AnimationGroup(\"animation-\" + idx, this._configurationContainer && this._configurationContainer.scene);\n let add = false;\n skeleton.getAnimatables().forEach((a) => {\n if (a.animations && a.animations[0]) {\n ag.addTargetedAnimation(a.animations[0], a);\n add = true;\n }\n });\n if (add) {\n this.addAnimationGroup(ag);\n }\n });\n }\n\n let completeCallback = () => {\n\n };\n\n if (this._modelConfiguration.animation) {\n if (this._modelConfiguration.animation.playOnce) {\n this._animations.forEach((a) => {\n a.playMode = AnimationPlayMode.ONCE;\n });\n }\n if (this._modelConfiguration.animation.autoStart && this._animations.length) {\n let animationName = this._modelConfiguration.animation.autoStart === true ?\n this._animations[0].name : this._modelConfiguration.animation.autoStart;\n\n completeCallback = () => {\n this.playAnimation(animationName);\n };\n }\n }\n\n this._enterScene(completeCallback);\n }\n\n /**\n * Animates the model from the current position to the default position\n * @param completeCallback A function to call when the animation has completed\n */\n private _enterScene(completeCallback?: () => void): void {\n const scene = this.rootMesh.getScene();\n let previousValue = scene.animationPropertiesOverride!.enableBlending;\n let callback = () => {\n this.state = ModelState.ENTRYDONE;\n scene.animationPropertiesOverride!.enableBlending = previousValue;\n this._checkCompleteState();\n if (completeCallback) { completeCallback(); }\n };\n if (!this._entryAnimation) {\n callback();\n return;\n }\n this.rootMesh.setEnabled(true);\n // disable blending for the sake of the entry animation;\n scene.animationPropertiesOverride!.enableBlending = false;\n this._applyAnimation(this._entryAnimation, true, callback);\n }\n\n /**\n * Animates the model from the current position to the exit-screen position\n * @param completeCallback A function to call when the animation has completed\n */\n private _exitScene(completeCallback: () => void): void {\n if (!this._exitAnimation) {\n completeCallback();\n return;\n }\n\n this._applyAnimation(this._exitAnimation, false, completeCallback);\n }\n\n private _modelComplete() {\n //reapply material defines to be sure:\n let meshes = this._pivotMesh.getChildMeshes(false);\n meshes.filter((m) => m.material).forEach((mesh) => {\n this._applyModelMaterialConfiguration(mesh.material!);\n });\n this.state = ModelState.COMPLETE;\n this.onCompleteObservable.notifyObservers(this);\n }\n\n /**\n * Add a new animation group to this model.\n * @param animationGroup the new animation group to be added\n */\n public addAnimationGroup(animationGroup: AnimationGroup) {\n this._animations.push(new GroupModelAnimation(animationGroup));\n }\n\n /**\n * Get the ModelAnimation array\n */\n public getAnimations(): Array<IModelAnimation> {\n return this._animations;\n }\n\n /**\n * Get the animations' names. Using the names you can play a specific animation.\n */\n public getAnimationNames(): Array<string> {\n return this._animations.map((a) => a.name);\n }\n\n /**\n * Get an animation by the provided name. Used mainly when playing n animation.\n * @param name the name of the animation to find\n */\n protected _getAnimationByName(name: string): Nullable<IModelAnimation> {\n // can't use .find, noe available on IE\n let filtered = this._animations.filter((a) => a.name === name.trim());\n // what the next line means - if two animations have the same name, they will not be returned!\n if (filtered.length === 1) {\n return filtered[0];\n } else {\n return null;\n }\n }\n\n /**\n * Choose an initialized animation using its name and start playing it\n * @param name the name of the animation to play\n * @returns The model aniamtion to be played.\n */\n public playAnimation(name: string): IModelAnimation {\n let animation = this.setCurrentAnimationByName(name);\n if (animation) {\n animation.start();\n }\n return animation;\n }\n\n public setCurrentAnimationByName(name: string) {\n let animation = this._getAnimationByName(name.trim());\n if (animation) {\n if (this.currentAnimation && this.currentAnimation.state !== AnimationState.STOPPED) {\n this.currentAnimation.stop();\n }\n this.currentAnimation = animation;\n return animation;\n } else {\n throw new Error(\"animation not found - \" + name);\n }\n }\n\n private _configureModel() {\n // this can be changed to the meshes that have rootMesh a parent without breaking anything.\n let meshesWithNoParent: Array<AbstractMesh> = [this.rootMesh]; //this._meshes.filter(m => m.parent === this.rootMesh);\n let updateMeshesWithNoParent = (variable: string, value: any, param?: string) => {\n meshesWithNoParent.forEach((mesh) => {\n if (param) {\n mesh[variable][param] = value;\n } else {\n mesh[variable] = value;\n }\n });\n };\n let updateXYZ = (variable: string, configValues: { x: number, y: number, z: number, w?: number }) => {\n if (configValues.x !== undefined) {\n updateMeshesWithNoParent(variable, configValues.x, 'x');\n }\n if (configValues.y !== undefined) {\n updateMeshesWithNoParent(variable, configValues.y, 'y');\n }\n if (configValues.z !== undefined) {\n updateMeshesWithNoParent(variable, configValues.z, 'z');\n }\n if (configValues.w !== undefined) {\n updateMeshesWithNoParent(variable, configValues.w, 'w');\n }\n };\n\n if (this._modelConfiguration.normalize) {\n let center = false;\n let unitSize = false;\n let parentIndex;\n if (this._modelConfiguration.normalize === true) {\n center = true;\n unitSize = true;\n } else {\n center = !!this._modelConfiguration.normalize.center;\n unitSize = !!this._modelConfiguration.normalize.unitSize;\n parentIndex = this._modelConfiguration.normalize.parentIndex;\n }\n\n let meshesToNormalize: Array<AbstractMesh> = [];\n if (parentIndex !== undefined) {\n meshesToNormalize.push(this._meshes[parentIndex]);\n } else {\n meshesToNormalize = this._pivotMesh.getChildMeshes(true).length === 1 ? [this._pivotMesh] : meshesWithNoParent;\n }\n\n if (unitSize) {\n meshesToNormalize.forEach((mesh) => {\n mesh.normalizeToUnitCube(true);\n mesh.computeWorldMatrix(true);\n });\n }\n if (center) {\n meshesToNormalize.forEach((mesh) => {\n const boundingInfo = mesh.getHierarchyBoundingVectors(true);\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\n const halfSizeVec = sizeVec.scale(0.5);\n const center = boundingInfo.min.add(halfSizeVec);\n mesh.position = center.scale(-1);\n\n mesh.position.y += halfSizeVec.y;\n\n // Recompute Info.\n mesh.computeWorldMatrix(true);\n });\n }\n } else {\n // if centered, should be done here\n }\n\n // position?\n if (this._modelConfiguration.position) {\n updateXYZ('position', this._modelConfiguration.position);\n }\n if (this._modelConfiguration.rotation) {\n //quaternion?\n if (this._modelConfiguration.rotation.w) {\n meshesWithNoParent.forEach((mesh) => {\n if (!mesh.rotationQuaternion) {\n mesh.rotationQuaternion = new Quaternion();\n }\n });\n updateXYZ('rotationQuaternion', this._modelConfiguration.rotation);\n } else {\n updateXYZ('rotation', this._modelConfiguration.rotation);\n }\n }\n\n if (this._modelConfiguration.rotationOffsetAxis) {\n let rotationAxis = new Vector3(this._modelConfiguration.rotationOffsetAxis.x, this._modelConfiguration.rotationOffsetAxis.y, this._modelConfiguration.rotationOffsetAxis.z);\n\n meshesWithNoParent.forEach((m) => {\n if (this._modelConfiguration.rotationOffsetAngle) {\n m.rotate(rotationAxis, this._modelConfiguration.rotationOffsetAngle);\n }\n });\n\n }\n\n if (this._modelConfiguration.scaling) {\n updateXYZ('scaling', this._modelConfiguration.scaling);\n }\n\n if (this._modelConfiguration.castShadow) {\n this._meshes.forEach((mesh) => {\n Tags.AddTagsTo(mesh, 'castShadow');\n });\n }\n\n let meshes = this._pivotMesh.getChildMeshes(false);\n meshes.filter((m) => m.material).forEach((mesh) => {\n this._applyModelMaterialConfiguration(mesh.material!);\n });\n\n if (this._modelConfiguration.entryAnimation) {\n this._entryAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.entryAnimation);\n }\n\n if (this._modelConfiguration.exitAnimation) {\n this._exitAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.exitAnimation);\n }\n\n this.onAfterConfigure.notifyObservers(this);\n }\n\n private _modelAnimationConfigurationToObject(animConfig: IModelAnimationConfiguration): ModelAnimationConfiguration {\n let anim: ModelAnimationConfiguration = {\n time: 0.5\n };\n if (animConfig.scaling) {\n anim.scaling = Vector3.Zero();\n }\n if (animConfig.easingFunction !== undefined) {\n anim.easingFunction = animConfig.easingFunction;\n }\n if (animConfig.easingMode !== undefined) {\n anim.easingMode = animConfig.easingMode;\n }\n extendClassWithConfig(anim, animConfig);\n return anim;\n }\n\n /**\n * Apply a material configuration to a material\n * @param material Material to apply configuration to\n * @hidden\n */\n public _applyModelMaterialConfiguration(material: Material) {\n if (!this._modelConfiguration.material) { return; }\n\n extendClassWithConfig(material, this._modelConfiguration.material);\n\n if (material instanceof PBRMaterial) {\n if (this._modelConfiguration.material.directIntensity !== undefined) {\n material.directIntensity = this._modelConfiguration.material.directIntensity;\n }\n\n if (this._modelConfiguration.material.emissiveIntensity !== undefined) {\n material.emissiveIntensity = this._modelConfiguration.material.emissiveIntensity;\n }\n\n if (this._modelConfiguration.material.environmentIntensity !== undefined) {\n material.environmentIntensity = this._modelConfiguration.material.environmentIntensity;\n }\n\n if (this._modelConfiguration.material.directEnabled !== undefined) {\n material.disableLighting = !this._modelConfiguration.material.directEnabled;\n }\n if (this._configurationContainer && this._configurationContainer.reflectionColor) {\n material.reflectionColor = this._configurationContainer.reflectionColor.clone();\n }\n }\n else if (material instanceof MultiMaterial) {\n for (let i = 0; i < material.subMaterials.length; i++) {\n const subMaterial = material.subMaterials[i];\n if (subMaterial) {\n this._applyModelMaterialConfiguration(subMaterial);\n }\n }\n }\n }\n\n /**\n * Start entry/exit animation given an animation configuration\n * @param animationConfiguration Entry/Exit animation configuration\n * @param isEntry Pass true if the animation is an entry animation\n * @param completeCallback Callback to execute when the animation completes\n */\n private _applyAnimation(animationConfiguration: ModelAnimationConfiguration, isEntry: boolean, completeCallback?: () => void) {\n let animations: Animation[] = [];\n\n //scale\n if (animationConfiguration.scaling) {\n\n let scaleStart: Vector3 = isEntry ? animationConfiguration.scaling : new Vector3(1, 1, 1);\n let scaleEnd: Vector3 = isEntry ? new Vector3(1, 1, 1) : animationConfiguration.scaling;\n\n if (!scaleStart.equals(scaleEnd)) {\n this.rootMesh.scaling = scaleStart;\n this._setLinearKeys(\n this._scaleTransition,\n this.rootMesh.scaling,\n scaleEnd,\n animationConfiguration.time\n );\n animations.push(this._scaleTransition);\n }\n }\n\n //Start the animation(s)\n this.transitionTo(\n animations,\n animationConfiguration.time,\n this._createEasingFunction(animationConfiguration.easingFunction),\n animationConfiguration.easingMode,\n () => { if (completeCallback) { completeCallback(); } }\n );\n }\n\n /**\n * Begin @animations with the specified @easingFunction\n * @param animations The BABYLON Animations to begin\n * @param duration of transition, in seconds\n * @param easingFunction An easing function to apply\n * @param easingMode A easing mode to apply to the easingFunction\n * @param onAnimationEnd Call back trigger at the end of the animation.\n */\n public transitionTo(\n animations: Animation[],\n duration: number,\n easingFunction: any,\n easingMode: number = 2, // BABYLON.EasingFunction.EASINGMODE_EASEINOUT,\n onAnimationEnd: () => void): void {\n\n if (easingFunction) {\n for (let animation of animations) {\n easingFunction.setEasingMode(easingMode);\n animation.setEasingFunction(easingFunction);\n }\n }\n\n //Stop any current animations before starting the new one - merging not yet supported.\n this.stopAllAnimations();\n\n this.rootMesh.animations = animations;\n\n if (this.rootMesh.getScene().beginAnimation !== undefined) {\n let animatable: Animatable = this.rootMesh.getScene().beginAnimation(this.rootMesh, 0, this._frameRate * duration, false, 1, () => {\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n });\n this._animatables.push(animatable);\n }\n }\n\n /**\n * Sets key values on an Animation from first to last frame.\n * @param animation The Babylon animation object to set keys on\n * @param startValue The value of the first key\n * @param endValue The value of the last key\n * @param duration The duration of the animation, used to determine the end frame\n */\n private _setLinearKeys(animation: Animation, startValue: any, endValue: any, duration: number) {\n animation.setKeys([\n {\n frame: 0,\n value: startValue\n },\n {\n frame: this._frameRate * duration,\n value: endValue\n }\n ]);\n }\n\n /**\n * Creates and returns a Babylon easing funtion object based on a string representing the Easing function\n * @param easingFunctionID The enum of the easing funtion to create\n * @return The newly created Babylon easing function object\n */\n private _createEasingFunction(easingFunctionID?: number): any {\n let easingFunction;\n\n switch (easingFunctionID) {\n case EasingFunction.CircleEase:\n easingFunction = new CircleEase();\n break;\n case EasingFunction.BackEase:\n easingFunction = new BackEase(0.3);\n break;\n case EasingFunction.BounceEase:\n easingFunction = new BounceEase();\n break;\n case EasingFunction.CubicEase:\n easingFunction = new CubicEase();\n break;\n case EasingFunction.ElasticEase:\n easingFunction = new ElasticEase();\n break;\n case EasingFunction.ExponentialEase:\n easingFunction = new ExponentialEase();\n break;\n case EasingFunction.PowerEase:\n easingFunction = new PowerEase();\n break;\n case EasingFunction.QuadraticEase:\n easingFunction = new QuadraticEase();\n break;\n case EasingFunction.QuarticEase:\n easingFunction = new QuarticEase();\n break;\n case EasingFunction.QuinticEase:\n easingFunction = new QuinticEase();\n break;\n case EasingFunction.SineEase:\n easingFunction = new SineEase();\n break;\n default:\n Tools.Log(\"No ease function found\");\n break;\n }\n\n return easingFunction;\n }\n\n /**\n * Stops and removes all animations that have been applied to the model\n */\n public stopAllAnimations(): void {\n if (this.rootMesh) {\n this.rootMesh.animations = [];\n }\n if (this.currentAnimation) {\n this.currentAnimation.stop();\n }\n while (this._animatables.length) {\n this._animatables[0].onAnimationEnd = null;\n this._animatables[0].stop();\n this._animatables.shift();\n }\n }\n\n /**\n * Will remove this model from the viewer (but NOT dispose it).\n */\n public remove() {\n this.stopAllAnimations();\n\n // hide it\n this.rootMesh.isVisible = false;\n if (this._observablesManager) { this._observablesManager.onModelRemovedObservable.notifyObservers(this); }\n }\n\n /**\n * Dispose this model, including all of its associated assets.\n */\n public dispose() {\n this.remove();\n this.onAfterConfigure.clear();\n this.onLoadedObservable.clear();\n this.onLoadErrorObservable.clear();\n this.onLoadProgressObservable.clear();\n if (this.loader && this.loader.name === \"gltf\") {\n (<GLTFFileLoader>this.loader).dispose();\n }\n this.particleSystems.forEach((ps) => ps.dispose());\n this.particleSystems.length = 0;\n this.skeletons.forEach((s) => s.dispose());\n this.skeletons.length = 0;\n this._animations.forEach((ag) => ag.dispose());\n this._animations.length = 0;\n this.rootMesh.dispose(false, true);\n }\n}\n"]}
1
+ {"version":3,"file":"viewerModel.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/model/viewerModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { IDisposable } from \"@babylonjs/core/scene\";\nimport { ISceneLoaderPlugin, ISceneLoaderPluginAsync } from \"@babylonjs/core/Loading/sceneLoader\";\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\nimport { IParticleSystem } from \"@babylonjs/core/Particles/IParticleSystem\";\nimport { Skeleton } from \"@babylonjs/core/Bones/skeleton\";\nimport { Observable } from \"@babylonjs/core/Misc/observable\";\nimport { ISceneLoaderProgressEvent } from \"@babylonjs/core/Loading/sceneLoader\";\nimport { AnimationGroup } from \"@babylonjs/core/Animations/animationGroup\";\nimport { Animation, Animatable, CircleEase, BackEase, BounceEase, CubicEase, ElasticEase, ExponentialEase, PowerEase, QuadraticEase, QuarticEase, QuinticEase, SineEase } from \"@babylonjs/core/Animations/index\";\nimport { Nullable } from \"@babylonjs/core/types\";\nimport { Quaternion, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\nimport { Tags } from \"@babylonjs/core/Misc/tags\";\nimport { Material } from \"@babylonjs/core/Materials/material\";\nimport { PBRMaterial } from \"@babylonjs/core/Materials/PBR/pbrMaterial\";\nimport { MultiMaterial } from \"@babylonjs/core/Materials/multiMaterial\";\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\nimport { GLTFFileLoader } from \"@babylonjs/loaders/glTF/index\";\nimport { IAsset } from \"babylonjs-gltf2interface\";\nimport { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\nimport { IModelAnimationConfiguration } from \"../configuration/interfaces/modelAnimationConfiguration\";\nimport { IModelAnimation, GroupModelAnimation, AnimationPlayMode, ModelAnimationConfiguration, EasingFunction, AnimationState } from \"./modelAnimation\";\nimport { deepmerge, extendClassWithConfig } from '../helper/index';\nimport { ObservablesManager } from \"../managers/observablesManager\";\nimport { ConfigurationContainer } from \"../configuration/configurationContainer\";\n\n/**\n * The current state of the model\n */\nexport enum ModelState {\n INIT,\n LOADING,\n LOADED,\n ENTRY,\n ENTRYDONE,\n COMPLETE,\n CANCELED,\n ERROR\n}\n\n/**\n * The viewer model is a container for all assets representing a sngle loaded model.\n */\nexport class ViewerModel implements IDisposable {\n /**\n * The loader used to load this model.\n */\n public loader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\n\n private _animations: Array<IModelAnimation>;\n\n /**\n * the list of meshes that are a part of this model\n */\n private _meshes: Array<AbstractMesh> = [];\n /**\n * This model's root mesh (the parent of all other meshes).\n * This mesh does not(!) exist in the meshes array.\n */\n public rootMesh: AbstractMesh;\n\n private _pivotMesh: AbstractMesh;\n /**\n * ParticleSystems connected to this model\n */\n public particleSystems: Array<IParticleSystem> = [];\n /**\n * Skeletons defined in this model\n */\n public skeletons: Array<Skeleton> = [];\n /**\n * The current model animation.\n * On init, this will be undefined.\n */\n public currentAnimation: IModelAnimation;\n\n /**\n * Observers registered here will be executed when the model is done loading\n */\n public onLoadedObservable: Observable<ViewerModel>;\n /**\n * Observers registered here will be executed when the loader notified of a progress event\n */\n public onLoadProgressObservable: Observable<ISceneLoaderProgressEvent>;\n /**\n * Observers registered here will be executed when the loader notified of an error.\n */\n public onLoadErrorObservable: Observable<{ message: string; exception: any }>;\n\n /**\n * Will be executed after the model finished loading and complete, including entry animation and lod\n */\n public onCompleteObservable: Observable<ViewerModel>;\n /**\n * Observers registered here will be executed every time the model is being configured.\n * This can be used to extend the model's configuration without extending the class itself\n */\n public onAfterConfigure: Observable<ViewerModel>;\n\n /**\n * The current model state (loaded, error, etc)\n */\n public state: ModelState;\n /**\n * A loadID provided by the modelLoader, unique to ths (Abstract)Viewer instance.\n */\n public loadId: number;\n\n public loadInfo: IAsset;\n private _loadedUrl: string;\n private _modelConfiguration: IModelConfiguration;\n\n private _loaderDone: boolean = false;\n\n private _entryAnimation: ModelAnimationConfiguration;\n private _exitAnimation: ModelAnimationConfiguration;\n private _scaleTransition: Animation;\n private _animatables: Array<Animatable> = [];\n private _frameRate: number = 60;\n\n private _shadowsRenderedAfterLoad: boolean = false;\n\n constructor(private _observablesManager: ObservablesManager, modelConfiguration: IModelConfiguration, private _configurationContainer?: ConfigurationContainer) {\n this.onLoadedObservable = new Observable();\n this.onLoadErrorObservable = new Observable();\n this.onLoadProgressObservable = new Observable();\n this.onCompleteObservable = new Observable();\n this.onAfterConfigure = new Observable();\n\n this.state = ModelState.INIT;\n\n let scene = this._configurationContainer && this._configurationContainer.scene;\n\n this.rootMesh = new AbstractMesh(\"modelRootMesh\", scene);\n this._pivotMesh = new AbstractMesh(\"pivotMesh\", scene);\n this._pivotMesh.parent = this.rootMesh;\n // rotate 180, gltf fun\n this._pivotMesh.rotation.y += Math.PI;\n\n this._scaleTransition = new Animation(\"scaleAnimation\", \"scaling\", this._frameRate, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\n\n this._animations = [];\n //create a copy of the configuration to make sure it doesn't change even after it is changed in the viewer\n this._modelConfiguration = deepmerge((this._configurationContainer && this._configurationContainer.configuration.model) || {}, modelConfiguration);\n\n if (this._observablesManager) { this._observablesManager.onModelAddedObservable.notifyObservers(this); }\n\n if (this._modelConfiguration.entryAnimation) {\n this.rootMesh.setEnabled(false);\n }\n\n this.onLoadedObservable.add(() => {\n this.updateConfiguration(this._modelConfiguration);\n if (this._observablesManager) { this._observablesManager.onModelLoadedObservable.notifyObservers(this); }\n this._initAnimations();\n });\n\n this.onCompleteObservable.add(() => {\n this.state = ModelState.COMPLETE;\n });\n }\n\n public get shadowsRenderedAfterLoad() {\n return this._shadowsRenderedAfterLoad;\n }\n\n public set shadowsRenderedAfterLoad(rendered: boolean) {\n if (!rendered) {\n throw new Error(\"can only be enabled\");\n } else {\n this._shadowsRenderedAfterLoad = rendered;\n }\n }\n\n public getViewerId() {\n return this._configurationContainer && this._configurationContainer.viewerId;\n }\n\n /**\n * Is this model enabled?\n */\n public get enabled() {\n return this.rootMesh.isEnabled();\n }\n\n /**\n * Set whether this model is enabled or not.\n */\n public set enabled(enable: boolean) {\n this.rootMesh.setEnabled(enable);\n }\n\n public set loaderDone(done: boolean) {\n this._loaderDone = done;\n this._checkCompleteState();\n }\n\n private _checkCompleteState() {\n if (this._loaderDone && (this.state === ModelState.ENTRYDONE)) {\n this._modelComplete();\n }\n }\n\n /**\n * Add a mesh to this model.\n * Any mesh that has no parent will be provided with the root mesh as its new parent.\n *\n * @param mesh the new mesh to add\n * @param triggerLoaded should this mesh trigger the onLoaded observable. Used when adding meshes manually.\n */\n public addMesh(mesh: AbstractMesh, triggerLoaded?: boolean) {\n if (!mesh.parent) {\n mesh.parent = this._pivotMesh;\n }\n\n if (mesh.getClassName() !== \"InstancedMesh\") {\n mesh.receiveShadows = !!this.configuration.receiveShadows;\n }\n\n this._meshes.push(mesh);\n if (triggerLoaded) {\n return this.onLoadedObservable.notifyObserversWithPromise(this);\n }\n }\n\n /**\n * get the list of meshes (excluding the root mesh)\n */\n public get meshes() {\n return this._meshes;\n }\n\n /**\n * Get the model's configuration\n */\n public get configuration(): IModelConfiguration {\n return this._modelConfiguration;\n }\n\n /**\n * (Re-)set the model's entire configuration\n * @param newConfiguration the new configuration to replace the new one\n */\n public set configuration(newConfiguration: IModelConfiguration) {\n this._modelConfiguration = newConfiguration;\n this._configureModel();\n }\n\n /**\n * Update the current configuration with new values.\n * Configuration will not be overwritten, but merged with the new configuration.\n * Priority is to the new configuration\n * @param newConfiguration the configuration to be merged into the current configuration;\n */\n public updateConfiguration(newConfiguration: Partial<IModelConfiguration>) {\n this._modelConfiguration = deepmerge(this._modelConfiguration, newConfiguration);\n this._configureModel();\n }\n\n private _initAnimations() {\n // check if this is not a gltf loader and init the animations\n if (this.skeletons.length) {\n this.skeletons.forEach((skeleton, idx) => {\n let ag = new AnimationGroup(\"animation-\" + idx, this._configurationContainer && this._configurationContainer.scene);\n let add = false;\n skeleton.getAnimatables().forEach((a) => {\n if (a.animations && a.animations[0]) {\n ag.addTargetedAnimation(a.animations[0], a);\n add = true;\n }\n });\n if (add) {\n this.addAnimationGroup(ag);\n }\n });\n }\n\n let completeCallback = () => {\n\n };\n\n if (this._modelConfiguration.animation) {\n if (this._modelConfiguration.animation.playOnce) {\n this._animations.forEach((a) => {\n a.playMode = AnimationPlayMode.ONCE;\n });\n }\n if (this._modelConfiguration.animation.autoStart && this._animations.length) {\n let animationName = this._modelConfiguration.animation.autoStart === true ?\n this._animations[0].name : this._modelConfiguration.animation.autoStart;\n\n completeCallback = () => {\n this.playAnimation(animationName);\n };\n }\n }\n\n this._enterScene(completeCallback);\n }\n\n /**\n * Animates the model from the current position to the default position\n * @param completeCallback A function to call when the animation has completed\n */\n private _enterScene(completeCallback?: () => void): void {\n const scene = this.rootMesh.getScene();\n let previousValue = scene.animationPropertiesOverride!.enableBlending;\n let callback = () => {\n this.state = ModelState.ENTRYDONE;\n scene.animationPropertiesOverride!.enableBlending = previousValue;\n this._checkCompleteState();\n if (completeCallback) { completeCallback(); }\n };\n if (!this._entryAnimation) {\n callback();\n return;\n }\n this.rootMesh.setEnabled(true);\n // disable blending for the sake of the entry animation;\n scene.animationPropertiesOverride!.enableBlending = false;\n this._applyAnimation(this._entryAnimation, true, callback);\n }\n\n /**\n * Animates the model from the current position to the exit-screen position\n * @param completeCallback A function to call when the animation has completed\n */\n private _exitScene(completeCallback: () => void): void {\n if (!this._exitAnimation) {\n completeCallback();\n return;\n }\n\n this._applyAnimation(this._exitAnimation, false, completeCallback);\n }\n\n private _modelComplete() {\n //reapply material defines to be sure:\n let meshes = this._pivotMesh.getChildMeshes(false);\n meshes.filter((m) => m.material).forEach((mesh) => {\n this._applyModelMaterialConfiguration(mesh.material!);\n });\n this.state = ModelState.COMPLETE;\n this.onCompleteObservable.notifyObservers(this);\n }\n\n /**\n * Add a new animation group to this model.\n * @param animationGroup the new animation group to be added\n */\n public addAnimationGroup(animationGroup: AnimationGroup) {\n this._animations.push(new GroupModelAnimation(animationGroup));\n }\n\n /**\n * Get the ModelAnimation array\n */\n public getAnimations(): Array<IModelAnimation> {\n return this._animations;\n }\n\n /**\n * Get the animations' names. Using the names you can play a specific animation.\n */\n public getAnimationNames(): Array<string> {\n return this._animations.map((a) => a.name);\n }\n\n /**\n * Get an animation by the provided name. Used mainly when playing n animation.\n * @param name the name of the animation to find\n */\n protected _getAnimationByName(name: string): Nullable<IModelAnimation> {\n // can't use .find, noe available on IE\n let filtered = this._animations.filter((a) => a.name === name.trim());\n // what the next line means - if two animations have the same name, they will not be returned!\n if (filtered.length === 1) {\n return filtered[0];\n } else {\n return null;\n }\n }\n\n /**\n * Choose an initialized animation using its name and start playing it\n * @param name the name of the animation to play\n * @returns The model aniamtion to be played.\n */\n public playAnimation(name: string): IModelAnimation {\n let animation = this.setCurrentAnimationByName(name);\n if (animation) {\n animation.start();\n }\n return animation;\n }\n\n public setCurrentAnimationByName(name: string) {\n let animation = this._getAnimationByName(name.trim());\n if (animation) {\n if (this.currentAnimation && this.currentAnimation.state !== AnimationState.STOPPED) {\n this.currentAnimation.stop();\n }\n this.currentAnimation = animation;\n return animation;\n } else {\n throw new Error(\"animation not found - \" + name);\n }\n }\n\n private _configureModel() {\n // this can be changed to the meshes that have rootMesh a parent without breaking anything.\n let meshesWithNoParent: Array<AbstractMesh> = [this.rootMesh]; //this._meshes.filter(m => m.parent === this.rootMesh);\n let updateMeshesWithNoParent = (variable: string, value: any, param?: string) => {\n meshesWithNoParent.forEach((mesh) => {\n if (param) {\n mesh[variable][param] = value;\n } else {\n mesh[variable] = value;\n }\n });\n };\n let updateXYZ = (variable: string, configValues: { x: number, y: number, z: number, w?: number }) => {\n if (configValues.x !== undefined) {\n updateMeshesWithNoParent(variable, configValues.x, 'x');\n }\n if (configValues.y !== undefined) {\n updateMeshesWithNoParent(variable, configValues.y, 'y');\n }\n if (configValues.z !== undefined) {\n updateMeshesWithNoParent(variable, configValues.z, 'z');\n }\n if (configValues.w !== undefined) {\n updateMeshesWithNoParent(variable, configValues.w, 'w');\n }\n };\n\n if (this._modelConfiguration.normalize) {\n let center = false;\n let unitSize = false;\n let parentIndex;\n if (this._modelConfiguration.normalize === true) {\n center = true;\n unitSize = true;\n } else {\n center = !!this._modelConfiguration.normalize.center;\n unitSize = !!this._modelConfiguration.normalize.unitSize;\n parentIndex = this._modelConfiguration.normalize.parentIndex;\n }\n\n let meshesToNormalize: Array<AbstractMesh> = [];\n if (parentIndex !== undefined) {\n meshesToNormalize.push(this._meshes[parentIndex]);\n } else {\n meshesToNormalize = this._pivotMesh.getChildMeshes(true).length === 1 ? [this._pivotMesh] : meshesWithNoParent;\n }\n\n if (unitSize) {\n meshesToNormalize.forEach((mesh) => {\n mesh.normalizeToUnitCube(true);\n mesh.computeWorldMatrix(true);\n });\n }\n if (center) {\n meshesToNormalize.forEach((mesh) => {\n const boundingInfo = mesh.getHierarchyBoundingVectors(true);\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\n const halfSizeVec = sizeVec.scale(0.5);\n const center = boundingInfo.min.add(halfSizeVec);\n mesh.position = center.scale(-1);\n\n mesh.position.y += halfSizeVec.y;\n\n // Recompute Info.\n mesh.computeWorldMatrix(true);\n });\n }\n } else {\n // if centered, should be done here\n }\n\n // position?\n if (this._modelConfiguration.position) {\n updateXYZ('position', this._modelConfiguration.position);\n }\n if (this._modelConfiguration.rotation) {\n //quaternion?\n if (this._modelConfiguration.rotation.w) {\n meshesWithNoParent.forEach((mesh) => {\n if (!mesh.rotationQuaternion) {\n mesh.rotationQuaternion = new Quaternion();\n }\n });\n updateXYZ('rotationQuaternion', this._modelConfiguration.rotation);\n } else {\n updateXYZ('rotation', this._modelConfiguration.rotation);\n }\n }\n\n if (this._modelConfiguration.rotationOffsetAxis) {\n let rotationAxis = new Vector3(this._modelConfiguration.rotationOffsetAxis.x, this._modelConfiguration.rotationOffsetAxis.y, this._modelConfiguration.rotationOffsetAxis.z);\n\n meshesWithNoParent.forEach((m) => {\n if (this._modelConfiguration.rotationOffsetAngle) {\n m.rotate(rotationAxis, this._modelConfiguration.rotationOffsetAngle);\n }\n });\n\n }\n\n if (this._modelConfiguration.scaling) {\n updateXYZ('scaling', this._modelConfiguration.scaling);\n }\n\n if (this._modelConfiguration.castShadow) {\n this._meshes.forEach((mesh) => {\n Tags.AddTagsTo(mesh, 'castShadow');\n });\n }\n\n let meshes = this._pivotMesh.getChildMeshes(false);\n meshes.filter((m) => m.material).forEach((mesh) => {\n this._applyModelMaterialConfiguration(mesh.material!);\n });\n\n if (this._modelConfiguration.entryAnimation) {\n this._entryAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.entryAnimation);\n }\n\n if (this._modelConfiguration.exitAnimation) {\n this._exitAnimation = this._modelAnimationConfigurationToObject(this._modelConfiguration.exitAnimation);\n }\n\n this.onAfterConfigure.notifyObservers(this);\n }\n\n private _modelAnimationConfigurationToObject(animConfig: IModelAnimationConfiguration): ModelAnimationConfiguration {\n let anim: ModelAnimationConfiguration = {\n time: 0.5\n };\n if (animConfig.scaling) {\n anim.scaling = Vector3.Zero();\n }\n if (animConfig.easingFunction !== undefined) {\n anim.easingFunction = animConfig.easingFunction;\n }\n if (animConfig.easingMode !== undefined) {\n anim.easingMode = animConfig.easingMode;\n }\n extendClassWithConfig(anim, animConfig);\n return anim;\n }\n\n /**\n * Apply a material configuration to a material\n * @param material Material to apply configuration to\n * @hidden\n */\n public _applyModelMaterialConfiguration(material: Material) {\n if (!this._modelConfiguration.material) { return; }\n\n extendClassWithConfig(material, this._modelConfiguration.material);\n\n if (material instanceof PBRMaterial) {\n if (this._modelConfiguration.material.directIntensity !== undefined) {\n material.directIntensity = this._modelConfiguration.material.directIntensity;\n }\n\n if (this._modelConfiguration.material.emissiveIntensity !== undefined) {\n material.emissiveIntensity = this._modelConfiguration.material.emissiveIntensity;\n }\n\n if (this._modelConfiguration.material.environmentIntensity !== undefined) {\n material.environmentIntensity = this._modelConfiguration.material.environmentIntensity;\n }\n\n if (this._modelConfiguration.material.directEnabled !== undefined) {\n material.disableLighting = !this._modelConfiguration.material.directEnabled;\n }\n if (this._configurationContainer && this._configurationContainer.reflectionColor) {\n material.reflectionColor = this._configurationContainer.reflectionColor.clone();\n }\n }\n else if (material instanceof MultiMaterial) {\n for (let i = 0; i < material.subMaterials.length; i++) {\n const subMaterial = material.subMaterials[i];\n if (subMaterial) {\n this._applyModelMaterialConfiguration(subMaterial);\n }\n }\n }\n }\n\n /**\n * Start entry/exit animation given an animation configuration\n * @param animationConfiguration Entry/Exit animation configuration\n * @param isEntry Pass true if the animation is an entry animation\n * @param completeCallback Callback to execute when the animation completes\n */\n private _applyAnimation(animationConfiguration: ModelAnimationConfiguration, isEntry: boolean, completeCallback?: () => void) {\n let animations: Animation[] = [];\n\n //scale\n if (animationConfiguration.scaling) {\n\n let scaleStart: Vector3 = isEntry ? animationConfiguration.scaling : new Vector3(1, 1, 1);\n let scaleEnd: Vector3 = isEntry ? new Vector3(1, 1, 1) : animationConfiguration.scaling;\n\n if (!scaleStart.equals(scaleEnd)) {\n this.rootMesh.scaling = scaleStart;\n this._setLinearKeys(\n this._scaleTransition,\n this.rootMesh.scaling,\n scaleEnd,\n animationConfiguration.time\n );\n animations.push(this._scaleTransition);\n }\n }\n\n //Start the animation(s)\n this.transitionTo(\n animations,\n animationConfiguration.time,\n this._createEasingFunction(animationConfiguration.easingFunction),\n animationConfiguration.easingMode,\n () => { if (completeCallback) { completeCallback(); } }\n );\n }\n\n /**\n * Begin @animations with the specified @easingFunction\n * @param animations The BABYLON Animations to begin\n * @param duration of transition, in seconds\n * @param easingFunction An easing function to apply\n * @param easingMode A easing mode to apply to the easingFunction\n * @param onAnimationEnd Call back trigger at the end of the animation.\n */\n public transitionTo(\n animations: Animation[],\n duration: number,\n easingFunction: any,\n easingMode: number = 2, // BABYLON.EasingFunction.EASINGMODE_EASEINOUT,\n onAnimationEnd: () => void): void {\n\n if (easingFunction) {\n for (let animation of animations) {\n easingFunction.setEasingMode(easingMode);\n animation.setEasingFunction(easingFunction);\n }\n }\n\n //Stop any current animations before starting the new one - merging not yet supported.\n this.stopAllAnimations();\n\n this.rootMesh.animations = animations;\n\n if (this.rootMesh.getScene().beginAnimation !== undefined) {\n let animatable: Animatable = this.rootMesh.getScene().beginAnimation(this.rootMesh, 0, this._frameRate * duration, false, 1, () => {\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n });\n this._animatables.push(animatable);\n }\n }\n\n /**\n * Sets key values on an Animation from first to last frame.\n * @param animation The Babylon animation object to set keys on\n * @param startValue The value of the first key\n * @param endValue The value of the last key\n * @param duration The duration of the animation, used to determine the end frame\n */\n private _setLinearKeys(animation: Animation, startValue: any, endValue: any, duration: number) {\n animation.setKeys([\n {\n frame: 0,\n value: startValue\n },\n {\n frame: this._frameRate * duration,\n value: endValue\n }\n ]);\n }\n\n /**\n * Creates and returns a Babylon easing funtion object based on a string representing the Easing function\n * @param easingFunctionID The enum of the easing funtion to create\n * @return The newly created Babylon easing function object\n */\n private _createEasingFunction(easingFunctionID?: number): any {\n let easingFunction;\n\n switch (easingFunctionID) {\n case EasingFunction.CircleEase:\n easingFunction = new CircleEase();\n break;\n case EasingFunction.BackEase:\n easingFunction = new BackEase(0.3);\n break;\n case EasingFunction.BounceEase:\n easingFunction = new BounceEase();\n break;\n case EasingFunction.CubicEase:\n easingFunction = new CubicEase();\n break;\n case EasingFunction.ElasticEase:\n easingFunction = new ElasticEase();\n break;\n case EasingFunction.ExponentialEase:\n easingFunction = new ExponentialEase();\n break;\n case EasingFunction.PowerEase:\n easingFunction = new PowerEase();\n break;\n case EasingFunction.QuadraticEase:\n easingFunction = new QuadraticEase();\n break;\n case EasingFunction.QuarticEase:\n easingFunction = new QuarticEase();\n break;\n case EasingFunction.QuinticEase:\n easingFunction = new QuinticEase();\n break;\n case EasingFunction.SineEase:\n easingFunction = new SineEase();\n break;\n default:\n Tools.Log(\"No ease function found\");\n break;\n }\n\n return easingFunction;\n }\n\n /**\n * Stops and removes all animations that have been applied to the model\n */\n public stopAllAnimations(): void {\n if (this.rootMesh) {\n this.rootMesh.animations = [];\n }\n if (this.currentAnimation) {\n this.currentAnimation.stop();\n }\n while (this._animatables.length) {\n this._animatables[0].onAnimationEnd = null;\n this._animatables[0].stop();\n this._animatables.shift();\n }\n }\n\n /**\n * Will remove this model from the viewer (but NOT dispose it).\n */\n public remove() {\n this.stopAllAnimations();\n\n // hide it\n this.rootMesh.isVisible = false;\n if (this._observablesManager) { this._observablesManager.onModelRemovedObservable.notifyObservers(this); }\n }\n\n /**\n * Dispose this model, including all of its associated assets.\n */\n public dispose() {\n this.remove();\n this.onAfterConfigure.clear();\n this.onLoadedObservable.clear();\n this.onLoadErrorObservable.clear();\n this.onLoadProgressObservable.clear();\n if (this.loader && this.loader.name === \"gltf\") {\n (<GLTFFileLoader>this.loader).dispose();\n }\n this.particleSystems.forEach((ps) => ps.dispose());\n this.particleSystems.length = 0;\n this.skeletons.forEach((s) => s.dispose());\n this.skeletons.length = 0;\n this._animations.forEach((ag) => ag.dispose());\n this._animations.length = 0;\n this.rootMesh.dispose(false, true);\n }\n}\n"]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  },
5
5
  "name": "@babylonjs/viewer",
6
6
  "description": "A simple-to-use viewer based on BabylonJS to display 3D elements natively",
7
- "version": "5.0.0-beta.3",
7
+ "version": "5.0.0-beta.7",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -218,10 +218,10 @@
218
218
  "deepmerge": "~2.1.1",
219
219
  "handlebars": "~4.0.11",
220
220
  "pepjs": "~0.4.3",
221
- "@babylonjs/core": "5.0.0-beta.3",
222
- "@babylonjs/loaders": "5.0.0-beta.3",
223
- "babylonjs-gltf2interface": "5.0.0-beta.3",
224
- "babylonjs-viewer-assets": "5.0.0-beta.3",
221
+ "@babylonjs/core": "5.0.0-beta.7",
222
+ "@babylonjs/loaders": "5.0.0-beta.7",
223
+ "babylonjs-gltf2interface": "5.0.0-beta.7",
224
+ "babylonjs-viewer-assets": "5.0.0-beta.7",
225
225
  "tslib": "^2.3.1"
226
226
  },
227
227
  "module": "index.js",
@@ -47,7 +47,7 @@ var PrintButtonPlugin = /** @class */ (function (_super) {
47
47
  window.open(printUrl, "_self");
48
48
  }
49
49
  };
50
- PrintButtonPlugin.HtmlTemplate = "\n{{#unless hidePrint}}\n<style>\n\n/* Show only if it's a windows 10 printer */\n.print-icon.not-win-10 {\n display: none;\n}\n\n.print-icon:after {\n font-size: 16px;\n content: \"\\E914\";\n}\n\n</style>\n<button class=\"print-button " + (window.navigator.userAgent.indexOf("Windows NT 10.0") === -1 ? "no-win-10" : "") + "\" title=\"{{text.printButton}}\">\n <span class=\"icon print-icon\"></span>\n </button>\n {{/unless}}\n";
50
+ PrintButtonPlugin.HtmlTemplate = "\n{{#unless hidePrint}}\n<style>\n\n/* Show only if it's a windows 10 printer */\n.print-icon.not-win-10 {\n display: none;\n}\n\n.print-icon:after {\n font-size: 16px;\n content: \"\\E914\";\n}\n\n</style>\n<button class=\"print-button ".concat(window.navigator.userAgent.indexOf("Windows NT 10.0") === -1 ? "no-win-10" : "", "\" title=\"{{text.printButton}}\">\n <span class=\"icon print-icon\"></span>\n </button>\n {{/unless}}\n");
51
51
  return PrintButtonPlugin;
52
52
  }(AbstractViewerNavbarButton));
53
53
  export { PrintButtonPlugin };
@@ -1 +1 @@
1
- {"version":3,"file":"printButton.js","sourceRoot":"","sources":["../../../../../sourceES6/viewer/src/templating/plugins/printButton.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAEnD;IAAuC,qCAA0B;IAI7D,2BAAoB,OAAsB;QAA1C,YACI,kBAAM,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC,SAsBjE;QAvBmB,aAAO,GAAP,OAAO,CAAe;QAGtC,KAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAC,KAAK;YAC3C,KAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;gBACzB,IAAI,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;gBACrF,IAAI,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAEvF,gBAAgB;gBAChB,IAAI,WAAS,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC9E,IAAI,WAAS,GAAG,KAAK,CAAC;gBACtB,8BAA8B;gBAC9B,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;oBACtC,IAAI,WAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;wBAC/B,WAAS,GAAG,IAAI,CAAC;qBACpB;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,WAAS,EAAE;oBACX,KAAI,CAAC,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;iBAC9C;aACJ;QACL,CAAC,CAAC,CAAC;;IACP,CAAC;IAED,mCAAO,GAAP,UAAQ,KAAoB;QACxB,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClC;IACL,CAAC;IAEgB,8BAAY,GAAW,6PAed,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,kHAI5G,CAAC;IACF,wBAAC;CAAA,AAxDD,CAAuC,0BAA0B,GAwDhE;SAxDY,iBAAiB","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport { EventCallback } from \"../templateManager\";\r\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\r\n\r\nexport class PrintButtonPlugin extends AbstractViewerNavbarButton {\r\n\r\n private _currentModelUrl: string;\r\n\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"print\", \"print-button\", PrintButtonPlugin.HtmlTemplate);\r\n\r\n this._viewer.onModelLoadedObservable.add((model) => {\r\n this._currentModelUrl = \"\";\r\n if (model.configuration.url) {\r\n let filename = Tools.GetFilename(model.configuration.url) || model.configuration.url;\r\n let baseUrl = model.configuration.root || Tools.GetFolderPath(model.configuration.url);\r\n\r\n //gltf, obj, stl\r\n let extension = model.configuration.loader || filename.split(\".\").pop() || \"\";\r\n let printable = false;\r\n // not using .some sue to IE11\r\n [\"gltf\", \"glb\", \"obj\", \"stl\"].forEach((ext) => {\r\n if (extension.indexOf(ext) !== -1) {\r\n printable = true;\r\n }\r\n });\r\n if (printable) {\r\n this._currentModelUrl = baseUrl + filename;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onEvent(event: EventCallback): void {\r\n if (this._currentModelUrl) {\r\n let printUrl = this._currentModelUrl.replace(/https?:\\/\\//, \"com.microsoft.builder3d://\");\r\n window.open(printUrl, \"_self\");\r\n }\r\n }\r\n\r\n protected static HtmlTemplate: string = `\r\n{{#unless hidePrint}}\r\n<style>\r\n\r\n/* Show only if it's a windows 10 printer */\r\n.print-icon.not-win-10 {\r\n display: none;\r\n}\r\n\r\n.print-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\E914\";\r\n}\r\n\r\n</style>\r\n<button class=\"print-button ${window.navigator.userAgent.indexOf(\"Windows NT 10.0\") === -1 ? \"no-win-10\" : \"\"}\" title=\"{{text.printButton}}\">\r\n <span class=\"icon print-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}
1
+ {"version":3,"file":"printButton.js","sourceRoot":"","sources":["../../../../../sourceES6/viewer/src/templating/plugins/printButton.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAGrE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAEnD;IAAuC,qCAA0B;IAI7D,2BAAoB,OAAsB;QAA1C,YACI,kBAAM,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC,SAsBjE;QAvBmB,aAAO,GAAP,OAAO,CAAe;QAGtC,KAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAC,KAAK;YAC3C,KAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;gBACzB,IAAI,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;gBACrF,IAAI,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAEvF,gBAAgB;gBAChB,IAAI,WAAS,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC9E,IAAI,WAAS,GAAG,KAAK,CAAC;gBACtB,8BAA8B;gBAC9B,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;oBACtC,IAAI,WAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;wBAC/B,WAAS,GAAG,IAAI,CAAC;qBACpB;gBACL,CAAC,CAAC,CAAC;gBACH,IAAI,WAAS,EAAE;oBACX,KAAI,CAAC,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;iBAC9C;aACJ;QACL,CAAC,CAAC,CAAC;;IACP,CAAC;IAED,mCAAO,GAAP,UAAQ,KAAoB;QACxB,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SAClC;IACL,CAAC;IAEgB,8BAAY,GAAW,iQAed,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,iHAI5G,CAAC;IACF,wBAAC;CAAA,AAxDD,CAAuC,0BAA0B,GAwDhE;SAxDY,iBAAiB","sourcesContent":["import { AbstractViewerNavbarButton } from \"../viewerTemplatePlugin\";\r\nimport { DefaultViewer } from \"../../viewer/defaultViewer\";\r\nimport { EventCallback } from \"../templateManager\";\r\nimport { Tools } from \"@babylonjs/core/Misc/tools\";\r\n\r\nexport class PrintButtonPlugin extends AbstractViewerNavbarButton {\r\n\r\n private _currentModelUrl: string;\r\n\r\n constructor(private _viewer: DefaultViewer) {\r\n super(\"print\", \"print-button\", PrintButtonPlugin.HtmlTemplate);\r\n\r\n this._viewer.onModelLoadedObservable.add((model) => {\r\n this._currentModelUrl = \"\";\r\n if (model.configuration.url) {\r\n let filename = Tools.GetFilename(model.configuration.url) || model.configuration.url;\r\n let baseUrl = model.configuration.root || Tools.GetFolderPath(model.configuration.url);\r\n\r\n //gltf, obj, stl\r\n let extension = model.configuration.loader || filename.split(\".\").pop() || \"\";\r\n let printable = false;\r\n // not using .some sue to IE11\r\n [\"gltf\", \"glb\", \"obj\", \"stl\"].forEach((ext) => {\r\n if (extension.indexOf(ext) !== -1) {\r\n printable = true;\r\n }\r\n });\r\n if (printable) {\r\n this._currentModelUrl = baseUrl + filename;\r\n }\r\n }\r\n });\r\n }\r\n\r\n onEvent(event: EventCallback): void {\r\n if (this._currentModelUrl) {\r\n let printUrl = this._currentModelUrl.replace(/https?:\\/\\//, \"com.microsoft.builder3d://\");\r\n window.open(printUrl, \"_self\");\r\n }\r\n }\r\n\r\n protected static HtmlTemplate: string = `\r\n{{#unless hidePrint}}\r\n<style>\r\n\r\n/* Show only if it's a windows 10 printer */\r\n.print-icon.not-win-10 {\r\n display: none;\r\n}\r\n\r\n.print-icon:after {\r\n font-size: 16px;\r\n content: \"\\\\E914\";\r\n}\r\n\r\n</style>\r\n<button class=\"print-button ${window.navigator.userAgent.indexOf(\"Windows NT 10.0\") === -1 ? \"no-win-10\" : \"\"}\" title=\"{{text.printButton}}\">\r\n <span class=\"icon print-icon\"></span>\r\n </button>\r\n {{/unless}}\r\n`;\r\n}\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Observable } from '@babylonjs/core/Misc/observable';
2
2
  import { EventManager } from './eventManager';
3
- import { ITemplateConfiguration } from '../configuration/interfaces';
3
+ import { ITemplateConfiguration } from '../configuration/interfaces/templateConfiguration';
4
4
  /**
5
5
  * The object sent when an event is triggered
6
6
  */
@@ -1,9 +1,8 @@
1
1
  import { Observable } from '@babylonjs/core/Misc/observable.js';
2
2
  import { Tools } from '@babylonjs/core/Misc/tools.js';
3
- import { isUrl, camelToKebab, kebabToCamel } from '../helper.js';
3
+ import { isUrl, camelToKebab, kebabToCamel, deepmerge } from '../helper/index.js';
4
4
  import * as Handlebars from 'handlebars/dist/handlebars';
5
5
  import { EventManager } from './eventManager.js';
6
- import { deepmerge } from '../helper/.js';
7
6
  /**
8
7
  * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.
9
8
  * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.
@@ -1 +1 @@
1
- {"version":3,"file":"templateManager.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/templating/templateManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@babylonjs/core/Misc/observable';\r\nimport { Tools } from '@babylonjs/core/Misc/tools';\r\nimport { isUrl, camelToKebab, kebabToCamel } from '../helper';\r\n\r\nimport * as Handlebars from 'handlebars/dist/handlebars';\r\nimport { EventManager } from './eventManager';\r\nimport { ITemplateConfiguration } from '../configuration/interfaces';\r\nimport { deepmerge } from '../helper/';\r\nimport { IFileRequest } from '@babylonjs/core/Misc/fileRequest';\r\n\r\n/**\r\n * The object sent when an event is triggered\r\n */\r\nexport interface EventCallback {\r\n event: Event;\r\n template: Template;\r\n selector: string;\r\n payload?: any;\r\n}\r\n\r\n/**\r\n * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.\r\n * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.\r\n */\r\nexport class TemplateManager {\r\n\r\n /**\r\n * Will be triggered when any template is initialized\r\n */\r\n public onTemplateInit: Observable<Template>;\r\n /**\r\n * Will be triggered when any template is fully loaded\r\n */\r\n public onTemplateLoaded: Observable<Template>;\r\n /**\r\n * Will be triggered when a template state changes\r\n */\r\n public onTemplateStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when all templates finished loading\r\n */\r\n public onAllLoaded: Observable<TemplateManager>;\r\n /**\r\n * Will be triggered when any event on any template is triggered.\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n /**\r\n * This template manager's event manager. In charge of callback registrations to native event types\r\n */\r\n public eventManager: EventManager;\r\n\r\n private templates: { [name: string]: Template };\r\n\r\n constructor(public containerElement: Element) {\r\n this.templates = {};\r\n\r\n this.onTemplateInit = new Observable<Template>();\r\n this.onTemplateLoaded = new Observable<Template>();\r\n this.onTemplateStateChange = new Observable<Template>();\r\n this.onAllLoaded = new Observable<TemplateManager>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n\r\n this.eventManager = new EventManager(this);\r\n }\r\n\r\n /**\r\n * Initialize the template(s) for the viewer. Called bay the Viewer class\r\n * @param templates the templates to be used to initialize the main template\r\n */\r\n public initTemplate(templates: { [key: string]: ITemplateConfiguration }) {\r\n\r\n let internalInit = (dependencyMap, name: string, parentTemplate?: Template) => {\r\n //init template\r\n let template = this.templates[name];\r\n\r\n let childrenTemplates = Object.keys(dependencyMap).map((childName) => {\r\n return internalInit(dependencyMap[childName], childName, template);\r\n });\r\n\r\n // register the observers\r\n //template.onLoaded.add(() => {\r\n let addToParent = () => {\r\n let lastElements = parentTemplate && parentTemplate.parent.querySelectorAll(camelToKebab(name));\r\n let containingElement = (lastElements && lastElements.length && lastElements.item(lastElements.length - 1)) || this.containerElement;\r\n template.appendTo(<HTMLElement>containingElement);\r\n this._checkLoadedState();\r\n };\r\n\r\n if (parentTemplate && !parentTemplate.parent) {\r\n parentTemplate.onAppended.add(() => {\r\n addToParent();\r\n });\r\n } else {\r\n addToParent();\r\n }\r\n //});\r\n\r\n return template;\r\n };\r\n\r\n //build the html tree\r\n return this._buildHTMLTree(templates).then((htmlTree) => {\r\n if (this.templates['main']) {\r\n internalInit(htmlTree, 'main');\r\n } else {\r\n this._checkLoadedState();\r\n }\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * This function will create a simple map with child-dependencies of the template html tree.\r\n * It will compile each template, check if its children exist in the configuration and will add them if they do.\r\n * It is expected that the main template will be called main!\r\n *\r\n * @param templates\r\n */\r\n private _buildHTMLTree(templates: { [key: string]: ITemplateConfiguration }): Promise<object> {\r\n let promises: Array<Promise<Template | boolean>> = Object.keys(templates).map((name) => {\r\n // if the template was overridden\r\n if (!templates[name]) { return Promise.resolve(false); }\r\n // else - we have a template, let's do our job!\r\n let template = new Template(name, templates[name]);\r\n template.onLoaded.add(() => {\r\n this.onTemplateLoaded.notifyObservers(template);\r\n });\r\n template.onStateChange.add(() => {\r\n this.onTemplateStateChange.notifyObservers(template);\r\n });\r\n this.onTemplateInit.notifyObservers(template);\r\n // make sure the global onEventTriggered is called as well\r\n template.onEventTriggered.add((eventData) => this.onEventTriggered.notifyObservers(eventData));\r\n this.templates[name] = template;\r\n return template.initPromise;\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n let templateStructure = {};\r\n // now iterate through all templates and check for children:\r\n let buildTree = (parentObject, name) => {\r\n this.templates[name].isInHtmlTree = true;\r\n let childNodes = this.templates[name].getChildElements().filter((n) => !!this.templates[n]);\r\n childNodes.forEach((element) => {\r\n parentObject[element] = {};\r\n buildTree(parentObject[element], element);\r\n });\r\n };\r\n if (this.templates['main']) {\r\n buildTree(templateStructure, \"main\");\r\n }\r\n return templateStructure;\r\n });\r\n }\r\n\r\n /**\r\n * Get the canvas in the template tree.\r\n * There must be one and only one canvas inthe template.\r\n */\r\n public getCanvas(): HTMLCanvasElement | null {\r\n return this.containerElement.querySelector('canvas');\r\n }\r\n\r\n /**\r\n * Get a specific template from the template tree\r\n * @param name the name of the template to load\r\n */\r\n public getTemplate(name: string): Template | undefined {\r\n return this.templates[name];\r\n }\r\n\r\n private _checkLoadedState() {\r\n let done = Object.keys(this.templates).length === 0 || Object.keys(this.templates).every((key) => {\r\n return (this.templates[key].isLoaded && !!this.templates[key].parent) || !this.templates[key].isInHtmlTree;\r\n });\r\n\r\n if (done) {\r\n this.onAllLoaded.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the template manager\r\n */\r\n public dispose() {\r\n // dispose all templates\r\n Object.keys(this.templates).forEach((template) => {\r\n this.templates[template].dispose();\r\n });\r\n this.templates = {};\r\n this.eventManager.dispose();\r\n\r\n this.onTemplateInit.clear();\r\n this.onAllLoaded.clear();\r\n this.onEventTriggered.clear();\r\n this.onTemplateLoaded.clear();\r\n this.onTemplateStateChange.clear();\r\n }\r\n\r\n}\r\n\r\n// register a new helper. modified https://stackoverflow.com/questions/9838925/is-there-any-method-to-iterate-a-map-with-handlebars-js\r\nHandlebars.registerHelper('eachInMap', function (map, block) {\r\n var out = '';\r\n Object.keys(map).map(function (prop) {\r\n let data = map[prop];\r\n if (typeof data === 'object') {\r\n data.id = data.id || prop;\r\n out += block.fn(data);\r\n } else {\r\n out += block.fn({ id: prop, value: data });\r\n }\r\n });\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('add', function (a, b) {\r\n var out = a + b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('eq', function (a, b) {\r\n var out = (a == b);\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('or', function (a, b) {\r\n var out = a || b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('not', function (a) {\r\n var out = !a;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('count', function (map) {\r\n return map.length;\r\n});\r\n\r\nHandlebars.registerHelper('gt', function (a, b) {\r\n var out = a > b;\r\n return out;\r\n});\r\n\r\n/**\r\n * This class represents a single template in the viewer's template tree.\r\n * An example for a template is a single canvas, an overlay (containing sub-templates) or the navigation bar.\r\n * A template is injected using the template manager in the correct position.\r\n * The template is rendered using Handlebars and can use Handlebars' features (such as parameter injection)\r\n *\r\n * For further information please refer to the documentation page, https://doc.babylonjs.com\r\n */\r\nexport class Template {\r\n\r\n /**\r\n * Will be triggered when the template is loaded\r\n */\r\n public onLoaded: Observable<Template>;\r\n /**\r\n * will be triggered when the template is appended to the tree\r\n */\r\n public onAppended: Observable<Template>;\r\n /**\r\n * Will be triggered when the template's state changed (shown, hidden)\r\n */\r\n public onStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when an event is triggered on ths template.\r\n * The event is a native browser event (like mouse or pointer events)\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n public onParamsUpdated: Observable<Template>;\r\n\r\n public onHTMLRendered: Observable<Template>;\r\n\r\n /**\r\n * is the template loaded?\r\n */\r\n public isLoaded: boolean;\r\n /**\r\n * This is meant to be used to track the show and hide functions.\r\n * This is NOT (!!) a flag to check if the element is actually visible to the user.\r\n */\r\n public isShown: boolean;\r\n\r\n /**\r\n * Is this template a part of the HTML tree (the template manager injected it)\r\n */\r\n public isInHtmlTree: boolean;\r\n\r\n /**\r\n * The HTML element containing this template\r\n */\r\n public parent: HTMLElement;\r\n\r\n /**\r\n * A promise that is fulfilled when the template finished loading.\r\n */\r\n public initPromise: Promise<Template>;\r\n\r\n private _fragment: DocumentFragment | Element;\r\n private _addedFragment: DocumentFragment | Element;\r\n private _htmlTemplate: string;\r\n private _rawHtml: string;\r\n\r\n private loadRequests: Array<IFileRequest>;\r\n\r\n constructor(public name: string, private _configuration: ITemplateConfiguration) {\r\n this.onLoaded = new Observable<Template>();\r\n this.onAppended = new Observable<Template>();\r\n this.onStateChange = new Observable<Template>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n this.onParamsUpdated = new Observable<Template>();\r\n this.onHTMLRendered = new Observable<Template>();\r\n\r\n this.loadRequests = [];\r\n\r\n this.isLoaded = false;\r\n this.isShown = false;\r\n this.isInHtmlTree = false;\r\n\r\n let htmlContentPromise = this._getTemplateAsHtml(_configuration);\r\n\r\n this.initPromise = htmlContentPromise.then((htmlTemplate) => {\r\n if (htmlTemplate) {\r\n this._htmlTemplate = htmlTemplate;\r\n let compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: (this._configuration.params && !!this._configuration.params.noEscape) });\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n this.isLoaded = true;\r\n this.isShown = true;\r\n this.onLoaded.notifyObservers(this);\r\n }\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Some templates have parameters (like background color for example).\r\n * The parameters are provided to Handlebars which in turn generates the template.\r\n * This function will update the template with the new parameters\r\n *\r\n * Note that when updating parameters the events will be registered again (after being cleared).\r\n *\r\n * @param params the new template parameters\r\n */\r\n public updateParams(params: { [key: string]: string | number | boolean | object }, append: boolean = true) {\r\n if (append) {\r\n this._configuration.params = deepmerge(this._configuration.params, params);\r\n } else {\r\n this._configuration.params = params;\r\n }\r\n // update the template\r\n if (this.isLoaded) {\r\n // this.dispose();\r\n }\r\n let compiledTemplate = Handlebars.compile(this._htmlTemplate);\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n if (this.parent) {\r\n this.appendTo(this.parent, true);\r\n }\r\n }\r\n\r\n public redraw() {\r\n this.updateParams({});\r\n }\r\n\r\n /**\r\n * Get the template'S configuration\r\n */\r\n public get configuration(): ITemplateConfiguration {\r\n return this._configuration;\r\n }\r\n\r\n /**\r\n * A template can be a parent element for other templates or HTML elements.\r\n * This function will deliver all child HTML elements of this template.\r\n */\r\n public getChildElements(): Array<string> {\r\n let childrenArray: string[] = [];\r\n //Edge and IE don't support frage,ent.children\r\n let children: HTMLCollection | NodeListOf<Element> = this._fragment && this._fragment.children;\r\n if (!this._fragment) {\r\n let fragment = this.parent.querySelector(this.name);\r\n if (fragment) {\r\n children = fragment.querySelectorAll('*');\r\n }\r\n }\r\n if (!children) {\r\n // casting to HTMLCollection, as both NodeListOf and HTMLCollection have 'item()' and 'length'.\r\n children = this._fragment.querySelectorAll('*');\r\n }\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children.item(i);\r\n if (child) {\r\n childrenArray.push(kebabToCamel(child.nodeName.toLowerCase()));\r\n }\r\n }\r\n return childrenArray;\r\n }\r\n\r\n /**\r\n * Appending the template to a parent HTML element.\r\n * If a parent is already set and you wish to replace the old HTML with new one, forceRemove should be true.\r\n * @param parent the parent to which the template is added\r\n * @param forceRemove if the parent already exists, shoud the template be removed from it?\r\n */\r\n public appendTo(parent: HTMLElement, forceRemove?: boolean) {\r\n if (this.parent) {\r\n if (forceRemove && this._addedFragment) {\r\n /*let fragement = this.parent.querySelector(this.name)\r\n if (fragement)\r\n this.parent.removeChild(fragement);*/\r\n this.parent.innerHTML = '';\r\n } else {\r\n return;\r\n }\r\n }\r\n this.parent = parent;\r\n\r\n if (this._configuration.id) {\r\n this.parent.id = this._configuration.id;\r\n }\r\n if (this._fragment) {\r\n this.parent.appendChild(this._fragment);\r\n this._addedFragment = this._fragment;\r\n } else {\r\n this.parent.insertAdjacentHTML(\"beforeend\", this._rawHtml);\r\n }\r\n\r\n this.onHTMLRendered.notifyObservers(this);\r\n\r\n // appended only one frame after.\r\n setTimeout(() => {\r\n this._registerEvents();\r\n this.onAppended.notifyObservers(this);\r\n });\r\n }\r\n\r\n private _isShowing: boolean;\r\n private _isHiding: boolean;\r\n\r\n /**\r\n * Show the template using the provided visibilityFunction, or natively using display: flex.\r\n * The provided function returns a promise that should be fullfilled when the element is shown.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public show(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isHiding) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isShowing = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'flex';\r\n // support old browsers with no flex:\r\n if (this.parent.style.display !== 'flex') {\r\n this.parent.style.display = '';\r\n }\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = true;\r\n this._isShowing = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Hide the template using the provided visibilityFunction, or natively using display: none.\r\n * The provided function returns a promise that should be fullfilled when the element is hidden.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public hide(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isShowing) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isHiding = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'none';\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = false;\r\n this._isHiding = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Dispose this template\r\n */\r\n public dispose() {\r\n this.onAppended.clear();\r\n this.onEventTriggered.clear();\r\n this.onLoaded.clear();\r\n this.onStateChange.clear();\r\n this.isLoaded = false;\r\n // remove from parent\r\n try {\r\n this.parent.removeChild(this._fragment);\r\n } catch (e) {\r\n //noop\r\n }\r\n\r\n this.loadRequests.forEach((request) => {\r\n request.abort();\r\n });\r\n\r\n if (this._registeredEvents) {\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n }\r\n\r\n private _getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {\r\n if (!templateConfig) {\r\n return Promise.reject('No templateConfig provided');\r\n } else if (templateConfig.html && !templateConfig.location) {\r\n return Promise.resolve(templateConfig.html);\r\n } else {\r\n let location = this._getTemplateLocation(templateConfig);\r\n if (isUrl(location)) {\r\n return new Promise((resolve, reject) => {\r\n let fileRequest = Tools.LoadFile(location, (data: string) => {\r\n resolve(data);\r\n }, undefined, undefined, false, (request, error: any) => {\r\n reject(error);\r\n });\r\n this.loadRequests.push(fileRequest);\r\n });\r\n } else {\r\n location = location.replace('#', '');\r\n let element = document.getElementById(location);\r\n if (element) {\r\n return Promise.resolve(element.innerHTML);\r\n } else {\r\n return Promise.reject('Template ID not found');\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _registeredEvents: Array<{ htmlElement: HTMLElement, eventName: string, function: EventListenerOrEventListenerObject }>;\r\n\r\n private _registerEvents() {\r\n this._registeredEvents = this._registeredEvents || [];\r\n if (this._registeredEvents.length) {\r\n // first remove the registered events\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n if (this._configuration.events) {\r\n for (let eventName in this._configuration.events) {\r\n if (this._configuration.events && this._configuration.events[eventName]) {\r\n let functionToFire = (selector, event) => {\r\n this.onEventTriggered.notifyObservers({ event: event, template: this, selector: selector });\r\n };\r\n\r\n // if boolean, set the parent as the event listener\r\n if (typeof this._configuration.events[eventName] === 'boolean') {\r\n let selector = this.parent.id;\r\n if (selector) {\r\n selector = '#' + selector;\r\n } else {\r\n selector = this.parent.tagName;\r\n }\r\n let binding = functionToFire.bind(this, selector);\r\n this.parent.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: this.parent,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n } else if (typeof this._configuration.events[eventName] === 'object') {\r\n let selectorsArray: Array<string> = Object.keys((this._configuration.events[eventName] as object) || {});\r\n // strict null checl is working incorrectly, must override:\r\n let event = this._configuration.events[eventName] || {};\r\n selectorsArray.filter((selector) => event[selector]).forEach((selector) => {\r\n let htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n if (!htmlElement) {\r\n // backcompat, fallback to id\r\n if (selector && selector.indexOf('#') !== 0) {\r\n selector = '#' + selector;\r\n }\r\n try {\r\n htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n } catch (e) { }\r\n }\r\n if (htmlElement) {\r\n let binding = functionToFire.bind(this, selector);\r\n htmlElement.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: htmlElement,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getTemplateLocation(templateConfig): string {\r\n if (!templateConfig || typeof templateConfig === 'string') {\r\n return templateConfig;\r\n } else {\r\n return templateConfig.location;\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"templateManager.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/templating/templateManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from '@babylonjs/core/Misc/observable';\r\nimport { Tools } from '@babylonjs/core/Misc/tools';\r\nimport { isUrl, camelToKebab, kebabToCamel, deepmerge } from '../helper/index';\r\n\r\nimport * as Handlebars from 'handlebars/dist/handlebars';\r\nimport { EventManager } from './eventManager';\r\nimport { ITemplateConfiguration } from '../configuration/interfaces/templateConfiguration';\r\nimport { IFileRequest } from '@babylonjs/core/Misc/fileRequest';\r\n\r\n/**\r\n * The object sent when an event is triggered\r\n */\r\nexport interface EventCallback {\r\n event: Event;\r\n template: Template;\r\n selector: string;\r\n payload?: any;\r\n}\r\n\r\n/**\r\n * The template manager, a member of the viewer class, will manage the viewer's templates and generate the HTML.\r\n * The template manager managers a single viewer and can be seen as the collection of all sub-templates of the viewer.\r\n */\r\nexport class TemplateManager {\r\n\r\n /**\r\n * Will be triggered when any template is initialized\r\n */\r\n public onTemplateInit: Observable<Template>;\r\n /**\r\n * Will be triggered when any template is fully loaded\r\n */\r\n public onTemplateLoaded: Observable<Template>;\r\n /**\r\n * Will be triggered when a template state changes\r\n */\r\n public onTemplateStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when all templates finished loading\r\n */\r\n public onAllLoaded: Observable<TemplateManager>;\r\n /**\r\n * Will be triggered when any event on any template is triggered.\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n /**\r\n * This template manager's event manager. In charge of callback registrations to native event types\r\n */\r\n public eventManager: EventManager;\r\n\r\n private templates: { [name: string]: Template };\r\n\r\n constructor(public containerElement: Element) {\r\n this.templates = {};\r\n\r\n this.onTemplateInit = new Observable<Template>();\r\n this.onTemplateLoaded = new Observable<Template>();\r\n this.onTemplateStateChange = new Observable<Template>();\r\n this.onAllLoaded = new Observable<TemplateManager>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n\r\n this.eventManager = new EventManager(this);\r\n }\r\n\r\n /**\r\n * Initialize the template(s) for the viewer. Called bay the Viewer class\r\n * @param templates the templates to be used to initialize the main template\r\n */\r\n public initTemplate(templates: { [key: string]: ITemplateConfiguration }) {\r\n\r\n let internalInit = (dependencyMap, name: string, parentTemplate?: Template) => {\r\n //init template\r\n let template = this.templates[name];\r\n\r\n let childrenTemplates = Object.keys(dependencyMap).map((childName) => {\r\n return internalInit(dependencyMap[childName], childName, template);\r\n });\r\n\r\n // register the observers\r\n //template.onLoaded.add(() => {\r\n let addToParent = () => {\r\n let lastElements = parentTemplate && parentTemplate.parent.querySelectorAll(camelToKebab(name));\r\n let containingElement = (lastElements && lastElements.length && lastElements.item(lastElements.length - 1)) || this.containerElement;\r\n template.appendTo(<HTMLElement>containingElement);\r\n this._checkLoadedState();\r\n };\r\n\r\n if (parentTemplate && !parentTemplate.parent) {\r\n parentTemplate.onAppended.add(() => {\r\n addToParent();\r\n });\r\n } else {\r\n addToParent();\r\n }\r\n //});\r\n\r\n return template;\r\n };\r\n\r\n //build the html tree\r\n return this._buildHTMLTree(templates).then((htmlTree) => {\r\n if (this.templates['main']) {\r\n internalInit(htmlTree, 'main');\r\n } else {\r\n this._checkLoadedState();\r\n }\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * This function will create a simple map with child-dependencies of the template html tree.\r\n * It will compile each template, check if its children exist in the configuration and will add them if they do.\r\n * It is expected that the main template will be called main!\r\n *\r\n * @param templates\r\n */\r\n private _buildHTMLTree(templates: { [key: string]: ITemplateConfiguration }): Promise<object> {\r\n let promises: Array<Promise<Template | boolean>> = Object.keys(templates).map((name) => {\r\n // if the template was overridden\r\n if (!templates[name]) { return Promise.resolve(false); }\r\n // else - we have a template, let's do our job!\r\n let template = new Template(name, templates[name]);\r\n template.onLoaded.add(() => {\r\n this.onTemplateLoaded.notifyObservers(template);\r\n });\r\n template.onStateChange.add(() => {\r\n this.onTemplateStateChange.notifyObservers(template);\r\n });\r\n this.onTemplateInit.notifyObservers(template);\r\n // make sure the global onEventTriggered is called as well\r\n template.onEventTriggered.add((eventData) => this.onEventTriggered.notifyObservers(eventData));\r\n this.templates[name] = template;\r\n return template.initPromise;\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n let templateStructure = {};\r\n // now iterate through all templates and check for children:\r\n let buildTree = (parentObject, name) => {\r\n this.templates[name].isInHtmlTree = true;\r\n let childNodes = this.templates[name].getChildElements().filter((n) => !!this.templates[n]);\r\n childNodes.forEach((element) => {\r\n parentObject[element] = {};\r\n buildTree(parentObject[element], element);\r\n });\r\n };\r\n if (this.templates['main']) {\r\n buildTree(templateStructure, \"main\");\r\n }\r\n return templateStructure;\r\n });\r\n }\r\n\r\n /**\r\n * Get the canvas in the template tree.\r\n * There must be one and only one canvas inthe template.\r\n */\r\n public getCanvas(): HTMLCanvasElement | null {\r\n return this.containerElement.querySelector('canvas');\r\n }\r\n\r\n /**\r\n * Get a specific template from the template tree\r\n * @param name the name of the template to load\r\n */\r\n public getTemplate(name: string): Template | undefined {\r\n return this.templates[name];\r\n }\r\n\r\n private _checkLoadedState() {\r\n let done = Object.keys(this.templates).length === 0 || Object.keys(this.templates).every((key) => {\r\n return (this.templates[key].isLoaded && !!this.templates[key].parent) || !this.templates[key].isInHtmlTree;\r\n });\r\n\r\n if (done) {\r\n this.onAllLoaded.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the template manager\r\n */\r\n public dispose() {\r\n // dispose all templates\r\n Object.keys(this.templates).forEach((template) => {\r\n this.templates[template].dispose();\r\n });\r\n this.templates = {};\r\n this.eventManager.dispose();\r\n\r\n this.onTemplateInit.clear();\r\n this.onAllLoaded.clear();\r\n this.onEventTriggered.clear();\r\n this.onTemplateLoaded.clear();\r\n this.onTemplateStateChange.clear();\r\n }\r\n\r\n}\r\n\r\n// register a new helper. modified https://stackoverflow.com/questions/9838925/is-there-any-method-to-iterate-a-map-with-handlebars-js\r\nHandlebars.registerHelper('eachInMap', function (map, block) {\r\n var out = '';\r\n Object.keys(map).map(function (prop) {\r\n let data = map[prop];\r\n if (typeof data === 'object') {\r\n data.id = data.id || prop;\r\n out += block.fn(data);\r\n } else {\r\n out += block.fn({ id: prop, value: data });\r\n }\r\n });\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('add', function (a, b) {\r\n var out = a + b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('eq', function (a, b) {\r\n var out = (a == b);\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('or', function (a, b) {\r\n var out = a || b;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('not', function (a) {\r\n var out = !a;\r\n return out;\r\n});\r\n\r\nHandlebars.registerHelper('count', function (map) {\r\n return map.length;\r\n});\r\n\r\nHandlebars.registerHelper('gt', function (a, b) {\r\n var out = a > b;\r\n return out;\r\n});\r\n\r\n/**\r\n * This class represents a single template in the viewer's template tree.\r\n * An example for a template is a single canvas, an overlay (containing sub-templates) or the navigation bar.\r\n * A template is injected using the template manager in the correct position.\r\n * The template is rendered using Handlebars and can use Handlebars' features (such as parameter injection)\r\n *\r\n * For further information please refer to the documentation page, https://doc.babylonjs.com\r\n */\r\nexport class Template {\r\n\r\n /**\r\n * Will be triggered when the template is loaded\r\n */\r\n public onLoaded: Observable<Template>;\r\n /**\r\n * will be triggered when the template is appended to the tree\r\n */\r\n public onAppended: Observable<Template>;\r\n /**\r\n * Will be triggered when the template's state changed (shown, hidden)\r\n */\r\n public onStateChange: Observable<Template>;\r\n /**\r\n * Will be triggered when an event is triggered on ths template.\r\n * The event is a native browser event (like mouse or pointer events)\r\n */\r\n public onEventTriggered: Observable<EventCallback>;\r\n\r\n public onParamsUpdated: Observable<Template>;\r\n\r\n public onHTMLRendered: Observable<Template>;\r\n\r\n /**\r\n * is the template loaded?\r\n */\r\n public isLoaded: boolean;\r\n /**\r\n * This is meant to be used to track the show and hide functions.\r\n * This is NOT (!!) a flag to check if the element is actually visible to the user.\r\n */\r\n public isShown: boolean;\r\n\r\n /**\r\n * Is this template a part of the HTML tree (the template manager injected it)\r\n */\r\n public isInHtmlTree: boolean;\r\n\r\n /**\r\n * The HTML element containing this template\r\n */\r\n public parent: HTMLElement;\r\n\r\n /**\r\n * A promise that is fulfilled when the template finished loading.\r\n */\r\n public initPromise: Promise<Template>;\r\n\r\n private _fragment: DocumentFragment | Element;\r\n private _addedFragment: DocumentFragment | Element;\r\n private _htmlTemplate: string;\r\n private _rawHtml: string;\r\n\r\n private loadRequests: Array<IFileRequest>;\r\n\r\n constructor(public name: string, private _configuration: ITemplateConfiguration) {\r\n this.onLoaded = new Observable<Template>();\r\n this.onAppended = new Observable<Template>();\r\n this.onStateChange = new Observable<Template>();\r\n this.onEventTriggered = new Observable<EventCallback>();\r\n this.onParamsUpdated = new Observable<Template>();\r\n this.onHTMLRendered = new Observable<Template>();\r\n\r\n this.loadRequests = [];\r\n\r\n this.isLoaded = false;\r\n this.isShown = false;\r\n this.isInHtmlTree = false;\r\n\r\n let htmlContentPromise = this._getTemplateAsHtml(_configuration);\r\n\r\n this.initPromise = htmlContentPromise.then((htmlTemplate) => {\r\n if (htmlTemplate) {\r\n this._htmlTemplate = htmlTemplate;\r\n let compiledTemplate = Handlebars.compile(htmlTemplate, { noEscape: (this._configuration.params && !!this._configuration.params.noEscape) });\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n this.isLoaded = true;\r\n this.isShown = true;\r\n this.onLoaded.notifyObservers(this);\r\n }\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Some templates have parameters (like background color for example).\r\n * The parameters are provided to Handlebars which in turn generates the template.\r\n * This function will update the template with the new parameters\r\n *\r\n * Note that when updating parameters the events will be registered again (after being cleared).\r\n *\r\n * @param params the new template parameters\r\n */\r\n public updateParams(params: { [key: string]: string | number | boolean | object }, append: boolean = true) {\r\n if (append) {\r\n this._configuration.params = deepmerge(this._configuration.params, params);\r\n } else {\r\n this._configuration.params = params;\r\n }\r\n // update the template\r\n if (this.isLoaded) {\r\n // this.dispose();\r\n }\r\n let compiledTemplate = Handlebars.compile(this._htmlTemplate);\r\n let config = this._configuration.params || {};\r\n this._rawHtml = compiledTemplate(config);\r\n try {\r\n this._fragment = document.createRange().createContextualFragment(this._rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this.name);\r\n test.innerHTML = this._rawHtml;\r\n this._fragment = test;\r\n }\r\n if (this.parent) {\r\n this.appendTo(this.parent, true);\r\n }\r\n }\r\n\r\n public redraw() {\r\n this.updateParams({});\r\n }\r\n\r\n /**\r\n * Get the template'S configuration\r\n */\r\n public get configuration(): ITemplateConfiguration {\r\n return this._configuration;\r\n }\r\n\r\n /**\r\n * A template can be a parent element for other templates or HTML elements.\r\n * This function will deliver all child HTML elements of this template.\r\n */\r\n public getChildElements(): Array<string> {\r\n let childrenArray: string[] = [];\r\n //Edge and IE don't support frage,ent.children\r\n let children: HTMLCollection | NodeListOf<Element> = this._fragment && this._fragment.children;\r\n if (!this._fragment) {\r\n let fragment = this.parent.querySelector(this.name);\r\n if (fragment) {\r\n children = fragment.querySelectorAll('*');\r\n }\r\n }\r\n if (!children) {\r\n // casting to HTMLCollection, as both NodeListOf and HTMLCollection have 'item()' and 'length'.\r\n children = this._fragment.querySelectorAll('*');\r\n }\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children.item(i);\r\n if (child) {\r\n childrenArray.push(kebabToCamel(child.nodeName.toLowerCase()));\r\n }\r\n }\r\n return childrenArray;\r\n }\r\n\r\n /**\r\n * Appending the template to a parent HTML element.\r\n * If a parent is already set and you wish to replace the old HTML with new one, forceRemove should be true.\r\n * @param parent the parent to which the template is added\r\n * @param forceRemove if the parent already exists, shoud the template be removed from it?\r\n */\r\n public appendTo(parent: HTMLElement, forceRemove?: boolean) {\r\n if (this.parent) {\r\n if (forceRemove && this._addedFragment) {\r\n /*let fragement = this.parent.querySelector(this.name)\r\n if (fragement)\r\n this.parent.removeChild(fragement);*/\r\n this.parent.innerHTML = '';\r\n } else {\r\n return;\r\n }\r\n }\r\n this.parent = parent;\r\n\r\n if (this._configuration.id) {\r\n this.parent.id = this._configuration.id;\r\n }\r\n if (this._fragment) {\r\n this.parent.appendChild(this._fragment);\r\n this._addedFragment = this._fragment;\r\n } else {\r\n this.parent.insertAdjacentHTML(\"beforeend\", this._rawHtml);\r\n }\r\n\r\n this.onHTMLRendered.notifyObservers(this);\r\n\r\n // appended only one frame after.\r\n setTimeout(() => {\r\n this._registerEvents();\r\n this.onAppended.notifyObservers(this);\r\n });\r\n }\r\n\r\n private _isShowing: boolean;\r\n private _isHiding: boolean;\r\n\r\n /**\r\n * Show the template using the provided visibilityFunction, or natively using display: flex.\r\n * The provided function returns a promise that should be fullfilled when the element is shown.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public show(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isHiding) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isShowing = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'flex';\r\n // support old browsers with no flex:\r\n if (this.parent.style.display !== 'flex') {\r\n this.parent.style.display = '';\r\n }\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = true;\r\n this._isShowing = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Hide the template using the provided visibilityFunction, or natively using display: none.\r\n * The provided function returns a promise that should be fullfilled when the element is hidden.\r\n * Since it is a promise async operations are more than possible.\r\n * See the default viewer for an opacity example.\r\n * @param visibilityFunction The function to execute to show the template.\r\n */\r\n public hide(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template> {\r\n if (this._isShowing) { return Promise.resolve(this); }\r\n return Promise.resolve().then(() => {\r\n this._isHiding = true;\r\n if (visibilityFunction) {\r\n return visibilityFunction(this);\r\n } else {\r\n // flex? box? should this be configurable easier than the visibilityFunction?\r\n this.parent.style.display = 'none';\r\n return this;\r\n }\r\n }).then(() => {\r\n this.isShown = false;\r\n this._isHiding = false;\r\n this.onStateChange.notifyObservers(this);\r\n return this;\r\n });\r\n }\r\n\r\n /**\r\n * Dispose this template\r\n */\r\n public dispose() {\r\n this.onAppended.clear();\r\n this.onEventTriggered.clear();\r\n this.onLoaded.clear();\r\n this.onStateChange.clear();\r\n this.isLoaded = false;\r\n // remove from parent\r\n try {\r\n this.parent.removeChild(this._fragment);\r\n } catch (e) {\r\n //noop\r\n }\r\n\r\n this.loadRequests.forEach((request) => {\r\n request.abort();\r\n });\r\n\r\n if (this._registeredEvents) {\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n }\r\n\r\n private _getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {\r\n if (!templateConfig) {\r\n return Promise.reject('No templateConfig provided');\r\n } else if (templateConfig.html && !templateConfig.location) {\r\n return Promise.resolve(templateConfig.html);\r\n } else {\r\n let location = this._getTemplateLocation(templateConfig);\r\n if (isUrl(location)) {\r\n return new Promise((resolve, reject) => {\r\n let fileRequest = Tools.LoadFile(location, (data: string) => {\r\n resolve(data);\r\n }, undefined, undefined, false, (request, error: any) => {\r\n reject(error);\r\n });\r\n this.loadRequests.push(fileRequest);\r\n });\r\n } else {\r\n location = location.replace('#', '');\r\n let element = document.getElementById(location);\r\n if (element) {\r\n return Promise.resolve(element.innerHTML);\r\n } else {\r\n return Promise.reject('Template ID not found');\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _registeredEvents: Array<{ htmlElement: HTMLElement, eventName: string, function: EventListenerOrEventListenerObject }>;\r\n\r\n private _registerEvents() {\r\n this._registeredEvents = this._registeredEvents || [];\r\n if (this._registeredEvents.length) {\r\n // first remove the registered events\r\n this._registeredEvents.forEach((evt) => {\r\n evt.htmlElement.removeEventListener(evt.eventName, evt.function);\r\n });\r\n }\r\n if (this._configuration.events) {\r\n for (let eventName in this._configuration.events) {\r\n if (this._configuration.events && this._configuration.events[eventName]) {\r\n let functionToFire = (selector, event) => {\r\n this.onEventTriggered.notifyObservers({ event: event, template: this, selector: selector });\r\n };\r\n\r\n // if boolean, set the parent as the event listener\r\n if (typeof this._configuration.events[eventName] === 'boolean') {\r\n let selector = this.parent.id;\r\n if (selector) {\r\n selector = '#' + selector;\r\n } else {\r\n selector = this.parent.tagName;\r\n }\r\n let binding = functionToFire.bind(this, selector);\r\n this.parent.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: this.parent,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n } else if (typeof this._configuration.events[eventName] === 'object') {\r\n let selectorsArray: Array<string> = Object.keys((this._configuration.events[eventName] as object) || {});\r\n // strict null checl is working incorrectly, must override:\r\n let event = this._configuration.events[eventName] || {};\r\n selectorsArray.filter((selector) => event[selector]).forEach((selector) => {\r\n let htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n if (!htmlElement) {\r\n // backcompat, fallback to id\r\n if (selector && selector.indexOf('#') !== 0) {\r\n selector = '#' + selector;\r\n }\r\n try {\r\n htmlElement = <HTMLElement>this.parent.querySelector(selector);\r\n } catch (e) { }\r\n }\r\n if (htmlElement) {\r\n let binding = functionToFire.bind(this, selector);\r\n htmlElement.addEventListener(eventName, binding, false);\r\n this._registeredEvents.push({\r\n htmlElement: htmlElement,\r\n eventName: eventName,\r\n function: binding\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _getTemplateLocation(templateConfig): string {\r\n if (!templateConfig || typeof templateConfig === 'string') {\r\n return templateConfig;\r\n } else {\r\n return templateConfig.location;\r\n }\r\n }\r\n}"]}
@@ -15,7 +15,7 @@ var AbstractViewerNavbarButton = /** @class */ (function () {
15
15
  this._htmlTemplate = htmlTemplate;
16
16
  }
17
17
  else {
18
- this._htmlTemplate = "\n<button class=\"" + this._buttonClass + "\">\n <span class=\"icon " + this._buttonName + "-icon\"></span>\n</button>\n";
18
+ this._htmlTemplate = "\n<button class=\"".concat(this._buttonClass, "\">\n <span class=\"icon ").concat(this._buttonName, "-icon\"></span>\n</button>\n");
19
19
  }
20
20
  }
21
21
  AbstractViewerNavbarButton.prototype.interactionPredicate = function (event) {
@@ -1 +1 @@
1
- {"version":3,"file":"viewerTemplatePlugin.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/templating/viewerTemplatePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventCallback, Template } from \"./templateManager\";\r\nimport * as Handlebars from 'handlebars/dist/handlebars';\r\n\r\nexport interface IViewerTemplatePlugin {\r\n\r\n readonly templateName: string;\r\n readonly eventsToAttach?: Array<string>;\r\n\r\n interactionPredicate(event: EventCallback): boolean;\r\n onEvent?(event: EventCallback): void;\r\n addHTMLTemplate?(template: Template): void;\r\n}\r\n\r\nexport abstract class AbstractViewerNavbarButton implements IViewerTemplatePlugin {\r\n\r\n public readonly templateName: string = \"navBar\";\r\n public readonly eventsToAttach: Array<string> = ['pointerdown'];\r\n protected _prepend: boolean = true;\r\n protected _buttonName: string;\r\n protected _buttonClass: string;\r\n protected _htmlTemplate: string;\r\n\r\n constructor(buttonName: string, buttonClass?: string, htmlTemplate?: string) {\r\n this._buttonName = buttonName;\r\n if (buttonClass) {\r\n this._buttonClass = buttonClass;\r\n } else {\r\n this._buttonClass = buttonName + '-button';\r\n }\r\n if (htmlTemplate) { this._htmlTemplate = htmlTemplate; }\r\n else {\r\n this._htmlTemplate = `\r\n<button class=\"${this._buttonClass}\">\r\n <span class=\"icon ${this._buttonName}-icon\"></span>\r\n</button>\r\n`;\r\n }\r\n }\r\n\r\n interactionPredicate(event: EventCallback): boolean {\r\n let pointerDown = <PointerEvent>event.event;\r\n if (pointerDown.button !== 0) { return false; }\r\n var element = (<HTMLElement>event.event.target);\r\n\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let elementClasses = element.classList;\r\n\r\n for (let i = 0; i < elementClasses.length; ++i) {\r\n let className = elementClasses[i];\r\n if (className.indexOf(this._buttonClass) !== -1) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n abstract onEvent(event: EventCallback): void;\r\n\r\n public addHTMLTemplate(template: Template): void {\r\n let element = this._generateHTMLElement(template);\r\n let container = template.parent.querySelector(\"div.default-control\");\r\n if (container) {\r\n if (this._prepend) {\r\n container.insertBefore(element, container.firstChild);\r\n } else {\r\n container.appendChild(element);\r\n }\r\n }\r\n }\r\n\r\n protected _generateHTMLElement(template: Template): Element | DocumentFragment {\r\n let compiledTemplate = Handlebars.compile(this._htmlTemplate, { noEscape: (template.configuration.params && !!template.configuration.params.noEscape) });\r\n let config = template.configuration.params || {};\r\n let rawHtml = compiledTemplate(config);\r\n let fragment: Element | DocumentFragment;\r\n try {\r\n fragment = document.createRange().createContextualFragment(rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this._buttonClass);\r\n test.innerHTML = rawHtml;\r\n fragment = test;\r\n }\r\n return fragment;\r\n }\r\n}"]}
1
+ {"version":3,"file":"viewerTemplatePlugin.js","sourceRoot":"","sources":["../../../../sourceES6/viewer/src/templating/viewerTemplatePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventCallback, Template } from \"./templateManager\";\r\nimport * as Handlebars from 'handlebars/dist/handlebars';\r\n\r\nexport interface IViewerTemplatePlugin {\r\n\r\n readonly templateName: string;\r\n readonly eventsToAttach?: Array<string>;\r\n\r\n interactionPredicate(event: EventCallback): boolean;\r\n onEvent?(event: EventCallback): void;\r\n addHTMLTemplate?(template: Template): void;\r\n}\r\n\r\nexport abstract class AbstractViewerNavbarButton implements IViewerTemplatePlugin {\r\n\r\n public readonly templateName: string = \"navBar\";\r\n public readonly eventsToAttach: Array<string> = ['pointerdown'];\r\n protected _prepend: boolean = true;\r\n protected _buttonName: string;\r\n protected _buttonClass: string;\r\n protected _htmlTemplate: string;\r\n\r\n constructor(buttonName: string, buttonClass?: string, htmlTemplate?: string) {\r\n this._buttonName = buttonName;\r\n if (buttonClass) {\r\n this._buttonClass = buttonClass;\r\n } else {\r\n this._buttonClass = buttonName + '-button';\r\n }\r\n if (htmlTemplate) { this._htmlTemplate = htmlTemplate; }\r\n else {\r\n this._htmlTemplate = `\r\n<button class=\"${this._buttonClass}\">\r\n <span class=\"icon ${this._buttonName}-icon\"></span>\r\n</button>\r\n`;\r\n }\r\n }\r\n\r\n interactionPredicate(event: EventCallback): boolean {\r\n let pointerDown = <PointerEvent>event.event;\r\n if (pointerDown.button !== 0) { return false; }\r\n var element = (<HTMLElement>event.event.target);\r\n\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let elementClasses = element.classList;\r\n\r\n for (let i = 0; i < elementClasses.length; ++i) {\r\n let className = elementClasses[i];\r\n if (className.indexOf(this._buttonClass) !== -1) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n abstract onEvent(event: EventCallback): void;\r\n\r\n public addHTMLTemplate(template: Template): void {\r\n let element = this._generateHTMLElement(template);\r\n let container = template.parent.querySelector(\"div.default-control\");\r\n if (container) {\r\n if (this._prepend) {\r\n container.insertBefore(element, container.firstChild);\r\n } else {\r\n container.appendChild(element);\r\n }\r\n }\r\n }\r\n\r\n protected _generateHTMLElement(template: Template): Element | DocumentFragment {\r\n let compiledTemplate = Handlebars.compile(this._htmlTemplate, { noEscape: (template.configuration.params && !!template.configuration.params.noEscape) });\r\n let config = template.configuration.params || {};\r\n let rawHtml = compiledTemplate(config);\r\n let fragment: Element | DocumentFragment;\r\n try {\r\n fragment = document.createRange().createContextualFragment(rawHtml);\r\n } catch (e) {\r\n let test = document.createElement(this._buttonClass);\r\n test.innerHTML = rawHtml;\r\n fragment = test;\r\n }\r\n return fragment;\r\n }\r\n}"]}
@@ -1,9 +1,10 @@
1
- import { ViewerConfiguration, IModelConfiguration } from './../configuration';
2
1
  import { Template } from '../templating/templateManager';
3
2
  import { TemplateManager } from '../templating/templateManager';
4
3
  import { AbstractViewerWithTemplate } from './viewerWithTemplate';
5
4
  import { ViewerModel } from '../model/viewerModel';
6
5
  import { IViewerTemplatePlugin } from '../templating/viewerTemplatePlugin';
6
+ import { ViewerConfiguration } from '../configuration/configuration';
7
+ import { IModelConfiguration } from '../configuration/interfaces/modelConfiguration';
7
8
  /**
8
9
  * The Default viewer is the default implementation of the AbstractViewer.
9
10
  * It uses the templating system to render a new canvas and controls.
@@ -20,7 +20,7 @@ import { TemplateManager } from '../templating/templateManager.js';
20
20
  import { AbstractViewerWithTemplate } from './viewerWithTemplate.js';
21
21
  import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial.js';
22
22
  import { PBRMaterial } from '@babylonjs/core/Materials/PBR/pbrMaterial.js';
23
- import { extendClassWithConfig } from '../helper.js';
23
+ import { extendClassWithConfig } from '../helper/index.js';
24
24
  import { AnimationState } from '../model/modelAnimation.js';
25
25
  import { HDButtonPlugin } from '../templating/plugins/hdButtonPlugin.js';
26
26
  import { PrintButtonPlugin } from '../templating/plugins/printButton.js';
@@ -285,7 +285,7 @@ var DefaultViewer = /** @class */ (function (_super) {
285
285
  this._registeredPlugins.push(plugin);
286
286
  var template = this.templateManager.getTemplate(plugin.templateName);
287
287
  if (!template) {
288
- throw new Error("Template " + plugin.templateName + " not found");
288
+ throw new Error("Template ".concat(plugin.templateName, " not found"));
289
289
  }
290
290
  if (plugin.addHTMLTemplate) {
291
291
  template.onHTMLRendered.add(function (tmpl) {