@babylonjs/core 5.16.0 → 5.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.js +1 -1
- package/Animations/animatable.js.map +1 -1
- package/Animations/animation.d.ts +8 -1
- package/Animations/animation.js +8 -1
- package/Animations/animation.js.map +1 -1
- package/Animations/animationGroup.js +5 -4
- package/Animations/animationGroup.js.map +1 -1
- package/Bones/skeleton.js +1 -1
- package/Bones/skeleton.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js +2 -2
- package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraKeyboardInput.js +3 -3
- package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +3 -3
- package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.js +1 -1
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Cameras/VR/webVRCamera.js +1 -1
- package/Cameras/VR/webVRCamera.js.map +1 -1
- package/Cameras/camera.js +3 -3
- package/Cameras/camera.js.map +1 -1
- package/Engines/Extensions/engine.views.d.ts +13 -0
- package/Engines/Extensions/engine.views.js +16 -1
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/Processors/shaderCodeCursor.js +2 -1
- package/Engines/Processors/shaderCodeCursor.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/engine.d.ts +2 -10
- package/Engines/engine.js +0 -14
- package/Engines/engine.js.map +1 -1
- package/Engines/engineFeatures.d.ts +2 -0
- package/Engines/engineFeatures.js.map +1 -1
- package/Engines/nativeEngine.d.ts +6 -2
- package/Engines/nativeEngine.js +13 -6
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +1 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +10 -0
- package/Engines/thinEngine.js +26 -6
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Gizmos/axisDragGizmo.d.ts +11 -8
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.d.ts +20 -13
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.d.ts +27 -18
- package/Gizmos/boundingBoxGizmo.js +6 -0
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/cameraGizmo.d.ts +8 -5
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.d.ts +48 -6
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.d.ts +17 -9
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/lightGizmo.d.ts +12 -7
- package/Gizmos/lightGizmo.js.map +1 -1
- package/Gizmos/planeDragGizmo.d.ts +10 -8
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.d.ts +23 -14
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Gizmos/positionGizmo.d.ts +9 -7
- package/Gizmos/positionGizmo.js +1 -1
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.d.ts +6 -4
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.d.ts +15 -12
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Inputs/scene.inputManager.js +0 -3
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Loading/sceneLoader.js +5 -5
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.d.ts +12 -0
- package/Materials/Node/Blocks/Fragment/TBNBlock.js +50 -0
- package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +18 -0
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +85 -1
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
- package/Materials/Node/Blocks/gradientBlock.js +1 -1
- package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +18 -2
- package/Materials/Node/nodeMaterial.js +56 -27
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +2 -1
- package/Materials/Textures/baseTexture.js +4 -1
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/prePassRenderTarget.js +1 -1
- package/Materials/Textures/prePassRenderTarget.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +11 -3
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/materialDefines.js +3 -1
- package/Materials/materialDefines.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +10 -1
- package/Materials/shaderMaterial.js +10 -1
- package/Materials/shaderMaterial.js.map +1 -1
- package/Maths/math.color.d.ts +9 -1
- package/Maths/math.color.js +13 -1
- package/Maths/math.color.js.map +1 -1
- package/Maths/math.vector.d.ts +2 -2
- package/Maths/math.vector.js +18 -30
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/icoSphereBuilder.js +2 -2
- package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
- package/Meshes/Compression/dracoCompression.js +1 -1
- package/Meshes/Compression/dracoCompression.js.map +1 -1
- package/Meshes/abstractMesh.js +1 -1
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/geometry.js +1 -2
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/thinInstanceMesh.js +5 -0
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Misc/basis.js +3 -0
- package/Misc/basis.js.map +1 -1
- package/Misc/fileTools.js +2 -2
- package/Misc/fileTools.js.map +1 -1
- package/Misc/khronosTextureContainer2.js +1 -1
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/smartArray.js +0 -1
- package/Misc/smartArray.js.map +1 -1
- package/Misc/tools.d.ts +2 -2
- package/Misc/tools.js +4 -1
- package/Misc/tools.js.map +1 -1
- package/Offline/database.js +6 -8
- package/Offline/database.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +2 -2
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/particleHelper.d.ts +12 -1
- package/Particles/particleHelper.js +12 -1
- package/Particles/particleHelper.js.map +1 -1
- package/Particles/particleSystem.js +2 -2
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/particleSystemSet.js +1 -1
- package/Particles/particleSystemSet.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +3 -0
- package/Particles/solidParticleSystem.js +3 -0
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +2 -2
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Physics/Plugins/ammoJSPlugin.d.ts +2 -2
- package/Physics/Plugins/ammoJSPlugin.js +29 -29
- package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
- package/Physics/Plugins/cannonJSPlugin.d.ts +2 -2
- package/Physics/Plugins/cannonJSPlugin.js +26 -26
- package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
- package/Physics/Plugins/oimoJSPlugin.js +9 -11
- package/Physics/Plugins/oimoJSPlugin.js.map +1 -1
- package/Physics/physicsImpostor.d.ts +6 -6
- package/Physics/physicsImpostor.js +7 -6
- package/Physics/physicsImpostor.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -3
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js +1 -1
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/sprites.fragment.js +1 -1
- package/Shaders/sprites.fragment.js.map +1 -1
- package/Sprites/spriteManager.d.ts +10 -1
- package/Sprites/spriteManager.js +10 -1
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.js +1 -1
- package/Sprites/spriteRenderer.js.map +1 -1
- package/XR/features/WebXRLayers.js +1 -1
- package/XR/features/WebXRLayers.js.map +1 -1
- package/assetContainer.js +12 -12
- package/assetContainer.js.map +1 -1
- package/node.js +1 -1
- package/node.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +2 -0
- package/scene.js +15 -8
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilityLayerRenderer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Rendering/utilityLayerRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @hidden */\r\n public static _DefaultUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n /** @hidden */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n private _sharedGizmoLight: Nullable<HemisphericLight> = null;\r\n\r\n private _renderCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = <Camera>this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable<Camera>) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @hidden\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(EngineStore.LastCreatedScene!);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable<number>();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable<AbstractMesh>) => boolean;\r\n\r\n private _afterRenderObserver: Nullable<Observer<Camera>>;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _originalPointerObserver: Nullable<Observer<PointerInfoPre>>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n handleEvents: boolean = true\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n if (originalScene!.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick = null;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else {\r\n let previousActiveCamera: Nullable<Camera> = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance > originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n this._afterRenderObserver = this.originalScene.onAfterCameraRenderObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"utilityLayerRenderer.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Rendering/utilityLayerRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable } from \"../scene\";\r\nimport { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { PointerInfoPre } from \"../Events/pointerEvents\";\r\nimport { PointerInfo, PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Renders a layer on top of an existing scene\r\n */\r\nexport class UtilityLayerRenderer implements IDisposable {\r\n private _pointerCaptures: { [pointerId: number]: boolean } = {};\r\n private _lastPointerEvents: { [pointerId: number]: boolean } = {};\r\n /** @hidden */\r\n public static _DefaultUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n /** @hidden */\r\n public static _DefaultKeepDepthUtilityLayer: Nullable<UtilityLayerRenderer> = null;\r\n private _sharedGizmoLight: Nullable<HemisphericLight> = null;\r\n\r\n private _renderCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)\r\n * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned\r\n * @returns the camera that is used when rendering the utility layer\r\n */\r\n public getRenderCamera(getRigParentIfPossible?: boolean) {\r\n if (this._renderCamera) {\r\n return this._renderCamera;\r\n } else {\r\n let activeCam: Camera;\r\n if (this.originalScene.activeCameras && this.originalScene.activeCameras.length > 1) {\r\n activeCam = this.originalScene.activeCameras[this.originalScene.activeCameras.length - 1];\r\n } else {\r\n activeCam = <Camera>this.originalScene.activeCamera!;\r\n }\r\n\r\n if (getRigParentIfPossible && activeCam && activeCam.isRigCamera) {\r\n return activeCam.rigParent!;\r\n }\r\n return activeCam;\r\n }\r\n }\r\n /**\r\n * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)\r\n * @param cam the camera that should be used when rendering the utility layer\r\n */\r\n public setRenderCamera(cam: Nullable<Camera>) {\r\n this._renderCamera = cam;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Light which used by gizmos to get light shading\r\n */\r\n public _getSharedGizmoLight(): HemisphericLight {\r\n if (!this._sharedGizmoLight) {\r\n this._sharedGizmoLight = new HemisphericLight(\"shared gizmo light\", new Vector3(0, 1, 0), this.utilityLayerScene);\r\n this._sharedGizmoLight.intensity = 2;\r\n this._sharedGizmoLight.groundColor = Color3.Gray();\r\n }\r\n return this._sharedGizmoLight;\r\n }\r\n\r\n /**\r\n * If the picking should be done on the utility layer prior to the actual scene (Default: true)\r\n */\r\n public pickUtilitySceneFirst = true;\r\n /**\r\n * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)\r\n */\r\n public static get DefaultUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultUtilityLayer == null) {\r\n return UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(EngineStore.LastCreatedScene!);\r\n }\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * Creates an utility layer, and set it as a default utility layer\r\n * @param scene associated scene\r\n * @hidden\r\n */\r\n public static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer {\r\n UtilityLayerRenderer._DefaultUtilityLayer = new UtilityLayerRenderer(scene);\r\n UtilityLayerRenderer._DefaultUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultUtilityLayer = null;\r\n });\r\n\r\n return UtilityLayerRenderer._DefaultUtilityLayer;\r\n }\r\n /**\r\n * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)\r\n */\r\n public static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer {\r\n if (UtilityLayerRenderer._DefaultKeepDepthUtilityLayer == null) {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = new UtilityLayerRenderer(EngineStore.LastCreatedScene!);\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer.originalScene.onDisposeObservable.addOnce(() => {\r\n UtilityLayerRenderer._DefaultKeepDepthUtilityLayer = null;\r\n });\r\n }\r\n return UtilityLayerRenderer._DefaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * The scene that is rendered on top of the original scene\r\n */\r\n public utilityLayerScene: Scene;\r\n\r\n /**\r\n * If the utility layer should automatically be rendered on top of existing scene\r\n */\r\n public shouldRender: boolean = true;\r\n /**\r\n * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene\r\n */\r\n public onlyCheckPointerDownEvents = true;\r\n\r\n /**\r\n * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)\r\n */\r\n public processAllEvents = false;\r\n\r\n /**\r\n * Set to false to disable picking\r\n */\r\n public pickingEnabled = true;\r\n\r\n /**\r\n * Observable raised when the pointer moves from the utility layer scene to the main scene\r\n */\r\n public onPointerOutObservable = new Observable<number>();\r\n\r\n /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */\r\n public mainSceneTrackerPredicate: (mesh: Nullable<AbstractMesh>) => boolean;\r\n\r\n private _afterRenderObserver: Nullable<Observer<Camera>>;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _originalPointerObserver: Nullable<Observer<PointerInfoPre>>;\r\n /**\r\n * Instantiates a UtilityLayerRenderer\r\n * @param originalScene the original scene that will be rendered on top of\r\n * @param handleEvents boolean indicating if the utility layer should handle events\r\n */\r\n constructor(\r\n /** the original scene that will be rendered on top of */\r\n public originalScene: Scene,\r\n handleEvents: boolean = true\r\n ) {\r\n // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app\r\n this.utilityLayerScene = new Scene(originalScene.getEngine(), { virtual: true });\r\n this.utilityLayerScene.useRightHandedSystem = originalScene.useRightHandedSystem;\r\n this.utilityLayerScene._allowPostProcessClearColor = false;\r\n\r\n // Deactivate post processes\r\n this.utilityLayerScene.postProcessesEnabled = false;\r\n\r\n // Detach controls on utility scene, events will be fired by logic below to handle picking priority\r\n this.utilityLayerScene.detachControl();\r\n\r\n if (handleEvents) {\r\n this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo) => {\r\n if (!this.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n if (!this.pickingEnabled) {\r\n return;\r\n }\r\n\r\n if (!this.processAllEvents) {\r\n if (\r\n prePointerInfo.type !== PointerEventTypes.POINTERMOVE &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERUP &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOWN &&\r\n prePointerInfo.type !== PointerEventTypes.POINTERDOUBLETAP\r\n ) {\r\n return;\r\n }\r\n }\r\n this.utilityLayerScene.pointerX = originalScene.pointerX;\r\n this.utilityLayerScene.pointerY = originalScene.pointerY;\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n if (originalScene!.isPointerCaptured(pointerEvent.pointerId)) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n return;\r\n }\r\n\r\n const getNearPickDataForScene = (scene: Scene) => {\r\n let scenePick = null;\r\n\r\n if (prePointerInfo.nearInteractionPickingInfo) {\r\n if (prePointerInfo.nearInteractionPickingInfo.pickedMesh!.getScene() == scene) {\r\n scenePick = prePointerInfo.nearInteractionPickingInfo;\r\n } else {\r\n scenePick = new PickingInfo();\r\n }\r\n } else {\r\n let previousActiveCamera: Nullable<Camera> = null;\r\n // If a camera is set for rendering with this layer\r\n // it will also be used for the ray computation\r\n // To preserve back compat and because scene.pick always use activeCamera\r\n // it's substituted temporarily and a new scenePick is forced.\r\n // otherwise, the ray with previously active camera is always used.\r\n // It's set back to previous activeCamera after operation.\r\n if (this._renderCamera) {\r\n previousActiveCamera = scene._activeCamera;\r\n scene._activeCamera = this._renderCamera;\r\n prePointerInfo.ray = null;\r\n }\r\n scenePick = prePointerInfo.ray ? scene.pickWithRay(prePointerInfo.ray) : scene.pick(originalScene.pointerX, originalScene.pointerY);\r\n if (previousActiveCamera) {\r\n scene._activeCamera = previousActiveCamera;\r\n }\r\n }\r\n\r\n return scenePick;\r\n };\r\n\r\n const utilityScenePick = getNearPickDataForScene(this.utilityLayerScene);\r\n\r\n if (!prePointerInfo.ray && utilityScenePick) {\r\n prePointerInfo.ray = utilityScenePick.ray;\r\n }\r\n\r\n // always fire the prepointer observable\r\n this.utilityLayerScene.onPrePointerObservable.notifyObservers(prePointerInfo);\r\n\r\n // allow every non pointer down event to flow to the utility layer\r\n if (this.onlyCheckPointerDownEvents && prePointerInfo.type != PointerEventTypes.POINTERDOWN) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n return;\r\n }\r\n\r\n if (this.utilityLayerScene.autoClearDepthAndStencil || this.pickUtilitySceneFirst) {\r\n // If this layer is an overlay, check if this layer was hit and if so, skip pointer events for the main scene\r\n if (utilityScenePick && utilityScenePick.hit) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(\r\n new PointerInfo(prePointerInfo.type, prePointerInfo.event, utilityScenePick),\r\n prePointerInfo.type\r\n );\r\n }\r\n prePointerInfo.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n const originalScenePick = getNearPickDataForScene(originalScene);\r\n const pointerEvent = <IPointerEvent>prePointerInfo.event;\r\n\r\n // If the layer can be occluded by the original scene, only fire pointer events to the first layer that hit they ray\r\n if (originalScenePick && utilityScenePick) {\r\n // No pick in utility scene\r\n if (utilityScenePick.distance === 0 && originalScenePick.pickedMesh) {\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n // We touched an utility mesh present in the main scene\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n this._pointerCaptures[pointerEvent.pointerId] = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && (utilityScenePick.distance < originalScenePick.distance || originalScenePick.distance === 0)) {\r\n // We pick something in utility scene or the pick in utility is closer than the one in main scene\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n // If a previous utility layer set this, do not unset this\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0;\r\n }\r\n } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance > originalScenePick.distance) {\r\n // We have a pick in both scenes but main is closer than utility\r\n\r\n // We touched an utility mesh present in the main scene\r\n if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) {\r\n this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent);\r\n prePointerInfo.skipOnPointerObservable = true;\r\n } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastPointerEvents[pointerEvent.pointerId]) {\r\n // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete\r\n this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId);\r\n delete this._lastPointerEvents[pointerEvent.pointerId];\r\n }\r\n this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent);\r\n }\r\n }\r\n\r\n if (prePointerInfo.type === PointerEventTypes.POINTERUP && this._pointerCaptures[pointerEvent.pointerId]) {\r\n this._pointerCaptures[pointerEvent.pointerId] = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first\r\n if (this._originalPointerObserver) {\r\n originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);\r\n }\r\n }\r\n\r\n // Render directly on top of existing scene without clearing\r\n this.utilityLayerScene.autoClear = false;\r\n\r\n this._afterRenderObserver = this.originalScene.onAfterRenderCameraObservable.add((camera) => {\r\n // Only render when the render camera finishes rendering\r\n if (this.shouldRender && camera == this.getRenderCamera()) {\r\n this.render();\r\n }\r\n });\r\n\r\n this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n this._updateCamera();\r\n }\r\n\r\n private _notifyObservers(prePointerInfo: PointerInfoPre, pickInfo: PickingInfo, pointerEvent: IPointerEvent) {\r\n if (!prePointerInfo.skipOnPointerObservable) {\r\n this.utilityLayerScene.onPointerObservable.notifyObservers(new PointerInfo(prePointerInfo.type, prePointerInfo.event, pickInfo), prePointerInfo.type);\r\n this._lastPointerEvents[pointerEvent.pointerId] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Renders the utility layers scene on top of the original scene\r\n */\r\n public render() {\r\n this._updateCamera();\r\n if (this.utilityLayerScene.activeCamera) {\r\n // Set the camera's scene to utility layers scene\r\n const oldScene = this.utilityLayerScene.activeCamera.getScene();\r\n const camera = this.utilityLayerScene.activeCamera;\r\n camera._scene = this.utilityLayerScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = this.utilityLayerScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = this.utilityLayerScene;\r\n }\r\n\r\n this.utilityLayerScene.render(false);\r\n\r\n // Reset camera's scene back to original\r\n camera._scene = oldScene;\r\n if (camera.leftCamera) {\r\n camera.leftCamera._scene = oldScene;\r\n }\r\n if (camera.rightCamera) {\r\n camera.rightCamera._scene = oldScene;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the renderer\r\n */\r\n public dispose() {\r\n this.onPointerOutObservable.clear();\r\n\r\n if (this._afterRenderObserver) {\r\n this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);\r\n }\r\n if (this._sceneDisposeObserver) {\r\n this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n }\r\n if (this._originalPointerObserver) {\r\n this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);\r\n }\r\n this.utilityLayerScene.dispose();\r\n }\r\n\r\n private _updateCamera() {\r\n this.utilityLayerScene.cameraToUseForPointers = this.getRenderCamera();\r\n this.utilityLayerScene.activeCamera = this.getRenderCamera();\r\n }\r\n}\r\n"]}
|
|
@@ -4,7 +4,7 @@ import "./ShadersInclude/fogFragmentDeclaration.js";
|
|
|
4
4
|
import "./ShadersInclude/fogFragment.js";
|
|
5
5
|
import "./ShadersInclude/imageProcessingCompatibility.js";
|
|
6
6
|
var name = "spritesPixelShader";
|
|
7
|
-
var shader = "uniform bool alphaTest;\nvarying vec4 vColor;\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\nvec4 color=texture2D(diffuseSampler,vUV);\nif (alphaTest) \n{\nif (color.a<0.95)\ndiscard;\n}\ncolor*=vColor;\n#include<fogFragment>\ngl_FragColor=color;\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}";
|
|
7
|
+
var shader = "uniform bool alphaTest;\nvarying vec4 vColor;\nvarying vec2 vUV;\nuniform sampler2D diffuseSampler;\n#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\n#define CUSTOM_FRAGMENT_MAIN_BEGIN\nvec4 color=texture2D(diffuseSampler,vUV);\nif (float(alphaTest) != 0.)\n{\nif (color.a<0.95)\ndiscard;\n}\ncolor*=vColor;\n#include<fogFragment>\ngl_FragColor=color;\n#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}";
|
|
8
8
|
// Sideeffect
|
|
9
9
|
ShaderStore.ShadersStore[name] = shader;
|
|
10
10
|
/** @hidden */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sprites.fragment.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Shaders/sprites.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,yCAAyC,CAAC;AACjD,OAAO,8BAA8B,CAAC;AACtC,OAAO,+CAA+C,CAAC;AAEvD,IAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,IAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"sprites.fragment.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Shaders/sprites.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,yCAAyC,CAAC;AACjD,OAAO,8BAA8B,CAAC;AACtC,OAAO,+CAA+C,CAAC;AAEvD,IAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,IAAM,MAAM,GAAG,udAmBb,CAAC;AACH,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,cAAc;AACd,MAAM,CAAC,IAAM,kBAAkB,GAAG,EAAE,IAAI,MAAA,EAAE,MAAM,QAAA,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/fogFragmentDeclaration\";\nimport \"./ShadersInclude/fogFragment\";\nimport \"./ShadersInclude/imageProcessingCompatibility\";\n\nconst name = \"spritesPixelShader\";\nconst shader = `uniform bool alphaTest;\rvarying vec4 vColor;\rvarying vec2 vUV;\runiform sampler2D diffuseSampler;\r#include<fogFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void) {\r#define CUSTOM_FRAGMENT_MAIN_BEGIN\nvec4 color=texture2D(diffuseSampler,vUV);\rif (float(alphaTest) != 0.)\r{\rif (color.a<0.95)\rdiscard;\r}\rcolor*=vColor;\r#include<fogFragment>\ngl_FragColor=color;\r#include<imageProcessingCompatibility>\n#define CUSTOM_FRAGMENT_MAIN_END\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const spritesPixelShader = { name, shader };\n"]}
|
|
@@ -234,6 +234,15 @@ export declare class SpriteManager implements ISpriteManager {
|
|
|
234
234
|
* @param rootUrl defines the root URL to use to load textures and relative dependencies
|
|
235
235
|
* @returns a promise that will resolve to the new sprite manager
|
|
236
236
|
*/
|
|
237
|
-
static
|
|
237
|
+
static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl?: string): Promise<SpriteManager>;
|
|
238
|
+
/**
|
|
239
|
+
* Creates a sprite manager from a snippet saved by the sprite editor
|
|
240
|
+
* @deprecated Please use ParseFromSnippetAsync instead
|
|
241
|
+
* @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
|
|
242
|
+
* @param scene defines the hosting scene
|
|
243
|
+
* @param rootUrl defines the root URL to use to load textures and relative dependencies
|
|
244
|
+
* @returns a promise that will resolve to the new sprite manager
|
|
245
|
+
*/
|
|
246
|
+
static CreateFromSnippetAsync: typeof SpriteManager.ParseFromSnippetAsync;
|
|
238
247
|
}
|
|
239
248
|
export {};
|
package/Sprites/spriteManager.js
CHANGED
|
@@ -581,7 +581,7 @@ var SpriteManager = /** @class */ (function () {
|
|
|
581
581
|
* @param rootUrl defines the root URL to use to load textures and relative dependencies
|
|
582
582
|
* @returns a promise that will resolve to the new sprite manager
|
|
583
583
|
*/
|
|
584
|
-
SpriteManager.
|
|
584
|
+
SpriteManager.ParseFromSnippetAsync = function (snippetId, scene, rootUrl) {
|
|
585
585
|
var _this = this;
|
|
586
586
|
if (rootUrl === void 0) { rootUrl = ""; }
|
|
587
587
|
if (snippetId === "_BLANK") {
|
|
@@ -609,6 +609,15 @@ var SpriteManager = /** @class */ (function () {
|
|
|
609
609
|
};
|
|
610
610
|
/** Define the Url to load snippets */
|
|
611
611
|
SpriteManager.SnippetUrl = `https://snippet.babylonjs.com`;
|
|
612
|
+
/**
|
|
613
|
+
* Creates a sprite manager from a snippet saved by the sprite editor
|
|
614
|
+
* @deprecated Please use ParseFromSnippetAsync instead
|
|
615
|
+
* @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
|
|
616
|
+
* @param scene defines the hosting scene
|
|
617
|
+
* @param rootUrl defines the root URL to use to load textures and relative dependencies
|
|
618
|
+
* @returns a promise that will resolve to the new sprite manager
|
|
619
|
+
*/
|
|
620
|
+
SpriteManager.CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;
|
|
612
621
|
return SpriteManager;
|
|
613
622
|
}());
|
|
614
623
|
export { SpriteManager };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spriteManager.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Sprites/spriteManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector\";\r\nimport { Sprite } from \"./sprite\";\r\nimport { SpriteSceneComponent } from \"./spriteSceneComponent\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { SpriteRenderer } from \"./spriteRenderer\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\r\ndeclare const Reflect: any;\r\n\r\n/**\r\n * Defines the minimum interface to fulfill in order to be a sprite manager.\r\n */\r\nexport interface ISpriteManager extends IDisposable {\r\n /**\r\n * Gets manager's name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render spriteManager.layerMask & camera.layerMask!== 0\r\n */\r\n layerMask: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n isPickable: boolean;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/resources/transparency_and_how_meshes_are_rendered#rendering-groups\r\n */\r\n renderingGroupId: number;\r\n\r\n /**\r\n * Defines the list of sprites managed by the manager.\r\n */\r\n sprites: Array<Sprite>;\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n texture: Texture;\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n cellWidth: number;\r\n /** Defines the default height of a cell in the spritesheet */\r\n cellHeight: number;\r\n\r\n /**\r\n * Tests the intersection of a sprite with a specific ray.\r\n * @param ray The ray we are sending to test the collision\r\n * @param camera The camera space we are sending rays in\r\n * @param predicate A predicate allowing excluding sprites from the list of object to test\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info or null.\r\n */\r\n intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;\r\n\r\n /**\r\n * Renders the list of sprites on screen.\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n rebuild(): void;\r\n}\r\n\r\n/**\r\n * Class used to manage multiple sprites on the same spritesheet\r\n * @see https://doc.babylonjs.com/babylon101/sprites\r\n */\r\nexport class SpriteManager implements ISpriteManager {\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the manager was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /** Gets the list of sprites */\r\n public sprites = new Array<Sprite>();\r\n /** Gets or sets the rendering group id (0 by default) */\r\n public renderingGroupId = 0;\r\n /** Gets or sets camera layer mask */\r\n public layerMask: number = 0x0fffffff;\r\n /** Gets or sets a boolean indicating if the sprites are pickable */\r\n public isPickable = false;\r\n\r\n /**\r\n * An event triggered when the manager is disposed.\r\n */\r\n public onDisposeObservable = new Observable<SpriteManager>();\r\n\r\n /**\r\n * Callback called when the manager is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the sprite\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets the array of sprites\r\n */\r\n public get children() {\r\n return this.sprites;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._spriteRenderer.capacity;\r\n }\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n public get texture(): Texture {\r\n return this._spriteRenderer.texture as Texture;\r\n }\r\n public set texture(value: Texture) {\r\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._spriteRenderer.texture = value;\r\n this._textureContent = null;\r\n }\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n public get cellWidth(): number {\r\n return this._spriteRenderer.cellWidth;\r\n }\r\n public set cellWidth(value: number) {\r\n this._spriteRenderer.cellWidth = value;\r\n }\r\n\r\n /** Defines the default height of a cell in the spritesheet */\r\n public get cellHeight(): number {\r\n return this._spriteRenderer.cellHeight;\r\n }\r\n public set cellHeight(value: number) {\r\n this._spriteRenderer.cellHeight = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._spriteRenderer.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._spriteRenderer.fogEnabled = value;\r\n }\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public get blendMode() {\r\n return this._spriteRenderer.blendMode;\r\n }\r\n public set blendMode(blendMode: number) {\r\n this._spriteRenderer.blendMode = blendMode;\r\n }\r\n\r\n private _disableDepthWrite: boolean = false;\r\n /** Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public get disableDepthWrite() {\r\n return this._disableDepthWrite;\r\n }\r\n\r\n public set disableDepthWrite(value: boolean) {\r\n this._disableDepthWrite = value;\r\n this._spriteRenderer.disableDepthWrite = value;\r\n }\r\n\r\n private _spriteRenderer: SpriteRenderer;\r\n /** Associative array from JSON sprite data file */\r\n private _cellData: any;\r\n /** Array of sprite names from JSON sprite data file */\r\n private _spriteMap: Array<string>;\r\n /** True when packed cell data from JSON file is ready*/\r\n private _packedAndReady: boolean = false;\r\n private _textureContent: Nullable<Uint8Array>;\r\n private _onDisposeObserver: Nullable<Observer<SpriteManager>>;\r\n private _fromPacked: boolean;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Creates a new sprite manager\r\n * @param name defines the manager's name\r\n * @param imgUrl defines the sprite sheet url\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param cellSize defines the size of a sprite cell\r\n * @param scene defines the hosting scene\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param samplingMode defines the sampling mode to use with spritesheet\r\n * @param fromPacked set to false; do not alter\r\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\r\n */\r\n constructor(\r\n /** defines the manager's name */\r\n public name: string,\r\n imgUrl: string,\r\n capacity: number,\r\n cellSize: any,\r\n scene: Scene,\r\n epsilon: number = 0.01,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n fromPacked: boolean = false,\r\n spriteJSON: any | null = null\r\n ) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene!;\r\n }\r\n\r\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\r\n scene._addComponent(new SpriteSceneComponent(scene));\r\n }\r\n this._fromPacked = fromPacked;\r\n\r\n this._scene = scene;\r\n const engine = this._scene.getEngine();\r\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene);\r\n\r\n if (cellSize.width && cellSize.height) {\r\n this.cellWidth = cellSize.width;\r\n this.cellHeight = cellSize.height;\r\n } else if (cellSize !== undefined) {\r\n this.cellWidth = cellSize;\r\n this.cellHeight = cellSize;\r\n } else {\r\n this._spriteRenderer = <any>null;\r\n return;\r\n }\r\n\r\n this._scene.spriteManagers.push(this);\r\n this.uniqueId = this.scene.getUniqueId();\r\n\r\n if (imgUrl) {\r\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\r\n }\r\n\r\n if (this._fromPacked) {\r\n this._makePacked(imgUrl, spriteJSON);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the string \"SpriteManager\"\r\n * @returns \"SpriteManager\"\r\n */\r\n public getClassName(): string {\r\n return \"SpriteManager\";\r\n }\r\n\r\n private _makePacked(imgUrl: string, spriteJSON: any) {\r\n if (spriteJSON !== null) {\r\n try {\r\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\r\n let celldata: any;\r\n if (typeof spriteJSON === \"string\") {\r\n celldata = JSON.parse(spriteJSON);\r\n } else {\r\n celldata = spriteJSON;\r\n }\r\n\r\n if (celldata.frames.length) {\r\n const frametemp: any = {};\r\n for (let i = 0; i < celldata.frames.length; i++) {\r\n const _f = celldata.frames[i];\r\n if (typeof Object.keys(_f)[0] !== \"string\") {\r\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\r\n }\r\n\r\n const name: string = _f[Object.keys(_f)[0]];\r\n frametemp[name] = _f;\r\n }\r\n celldata.frames = frametemp;\r\n }\r\n\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\r\n }\r\n } else {\r\n const re = /\\./g;\r\n let li: number;\r\n do {\r\n li = re.lastIndex;\r\n re.test(imgUrl);\r\n } while (re.lastIndex > 0);\r\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\r\n const onerror = () => {\r\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n };\r\n const onload = (data: string | ArrayBuffer) => {\r\n try {\r\n const celldata = JSON.parse(data as string);\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\r\n }\r\n };\r\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\r\n }\r\n }\r\n\r\n private _checkTextureAlpha(sprite: Sprite, ray: Ray, distance: number, min: Vector3, max: Vector3) {\r\n if (!sprite.useAlphaForPicking || !this.texture) {\r\n return true;\r\n }\r\n\r\n const textureSize = this.texture.getSize();\r\n if (!this._textureContent) {\r\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\r\n this.texture.readPixels(0, 0, this._textureContent);\r\n }\r\n\r\n const contactPoint = TmpVectors.Vector3[0];\r\n\r\n contactPoint.copyFrom(ray.direction);\r\n\r\n contactPoint.normalize();\r\n contactPoint.scaleInPlace(distance);\r\n contactPoint.addInPlace(ray.origin);\r\n\r\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x) - 0.5;\r\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y) - 0.5;\r\n\r\n // Rotate\r\n const angle = sprite.angle;\r\n const rotatedU = 0.5 + (contactPointU * Math.cos(angle) - contactPointV * Math.sin(angle));\r\n const rotatedV = 0.5 + (contactPointU * Math.sin(angle) + contactPointV * Math.cos(angle));\r\n\r\n const u = (sprite._xOffset * textureSize.width + rotatedU * sprite._xSize) | 0;\r\n const v = (sprite._yOffset * textureSize.height + rotatedV * sprite._ySize) | 0;\r\n\r\n const alpha = this._textureContent![(u + v * textureSize.width) * 4 + 3];\r\n\r\n return alpha > 0.5;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\r\n * @returns null if no hit or a PickingInfo\r\n */\r\n public intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance = Number.MAX_VALUE;\r\n let currentSprite: Nullable<Sprite> = null;\r\n const pickedPoint = TmpVectors.Vector3[0];\r\n const cameraSpacePosition = TmpVectors.Vector3[1];\r\n const cameraView = camera.getViewMatrix();\r\n let activeRay: Ray = ray;\r\n let pickedRay: Ray = ray;\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n if (sprite.angle) {\r\n // Create a rotation matrix to rotate the ray to the sprite's rotation\r\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\r\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\r\n Matrix.RotationZToRef(sprite.angle, TmpVectors.Matrix[3]);\r\n\r\n // inv translation x rotation x translation\r\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\r\n\r\n activeRay = ray.clone();\r\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\r\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\r\n } else {\r\n activeRay = ray;\r\n }\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (activeRay.intersectsBoxMinMax(min, max)) {\r\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\r\n\r\n if (distance > currentDistance) {\r\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\r\n continue;\r\n }\r\n\r\n pickedRay = activeRay;\r\n distance = currentDistance;\r\n currentSprite = sprite;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (currentSprite) {\r\n const result = new PickingInfo();\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = currentSprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(pickedRay.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n pickedRay.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n\r\n return result;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n public multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance: number;\r\n const results: Nullable<PickingInfo[]> = [];\r\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\r\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\r\n const cameraView = camera.getViewMatrix();\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (ray.intersectsBoxMinMax(min, max)) {\r\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\r\n\r\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\r\n continue;\r\n }\r\n\r\n const result = new PickingInfo();\r\n results.push(result);\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = sprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(ray.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n ray.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n */\r\n public render(): void {\r\n // Check\r\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const deltaTime = engine.getDeltaTime();\r\n if (this._packedAndReady) {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\r\n } else {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\r\n }\r\n }\r\n\r\n private _customUpdate = (sprite: ThinSprite, baseSize: ISize): void => {\r\n if (!sprite.cellRef) {\r\n sprite.cellIndex = 0;\r\n }\r\n const num = sprite.cellIndex;\r\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\r\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\r\n }\r\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\r\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\r\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\r\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\r\n };\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n this._spriteRenderer?.rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._spriteRenderer) {\r\n this._spriteRenderer.dispose();\r\n (<any>this._spriteRenderer) = null;\r\n }\r\n\r\n this._textureContent = null;\r\n\r\n // Remove from scene\r\n const index = this._scene.spriteManagers.indexOf(this);\r\n this._scene.spriteManagers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n /**\r\n * Serializes the sprite manager to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.capacity = this.capacity;\r\n serializationObject.cellWidth = this.cellWidth;\r\n serializationObject.cellHeight = this.cellHeight;\r\n\r\n if (this.texture) {\r\n if (serializeTexture) {\r\n serializationObject.texture = this.texture.serialize();\r\n } else {\r\n serializationObject.textureUrl = this.texture.name;\r\n serializationObject.invertY = this.texture._invertY;\r\n }\r\n }\r\n\r\n serializationObject.sprites = [];\r\n\r\n for (const sprite of this.sprites) {\r\n serializationObject.sprites.push(sprite.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a new sprite manager.\r\n * @param parsedManager The JSON object to parse\r\n * @param scene The scene to create the sprite manager\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @returns the new sprite manager\r\n */\r\n public static Parse(parsedManager: any, scene: Scene, rootUrl: string): SpriteManager {\r\n const manager = new SpriteManager(\r\n parsedManager.name,\r\n \"\",\r\n parsedManager.capacity,\r\n {\r\n width: parsedManager.cellWidth,\r\n height: parsedManager.cellHeight,\r\n },\r\n scene\r\n );\r\n\r\n if (parsedManager.texture) {\r\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl) as Texture;\r\n } else if (parsedManager.textureName) {\r\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\r\n }\r\n\r\n for (const parsedSprite of parsedManager.sprites) {\r\n Sprite.Parse(parsedSprite, manager);\r\n }\r\n\r\n return manager;\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved in a remote file\r\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the sprite manager\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static CreateFromSnippetAsync(snippetId: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.spriteManager);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"spriteManager.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Sprites/spriteManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IDisposable, Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, TmpVectors, Matrix } from \"../Maths/math.vector\";\r\nimport { Sprite } from \"./sprite\";\r\nimport { SpriteSceneComponent } from \"./spriteSceneComponent\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { SpriteRenderer } from \"./spriteRenderer\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ndeclare type Ray = import(\"../Culling/ray\").Ray;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect\r\ndeclare const Reflect: any;\r\n\r\n/**\r\n * Defines the minimum interface to fulfill in order to be a sprite manager.\r\n */\r\nexport interface ISpriteManager extends IDisposable {\r\n /**\r\n * Gets manager's name\r\n */\r\n name: string;\r\n\r\n /**\r\n * Restricts the camera to viewing objects with the same layerMask.\r\n * A camera with a layerMask of 1 will render spriteManager.layerMask & camera.layerMask!== 0\r\n */\r\n layerMask: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true\r\n */\r\n isPickable: boolean;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n scene: Scene;\r\n\r\n /**\r\n * Specifies the rendering group id for this mesh (0 by default)\r\n * @see https://doc.babylonjs.com/resources/transparency_and_how_meshes_are_rendered#rendering-groups\r\n */\r\n renderingGroupId: number;\r\n\r\n /**\r\n * Defines the list of sprites managed by the manager.\r\n */\r\n sprites: Array<Sprite>;\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n texture: Texture;\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n cellWidth: number;\r\n /** Defines the default height of a cell in the spritesheet */\r\n cellHeight: number;\r\n\r\n /**\r\n * Tests the intersection of a sprite with a specific ray.\r\n * @param ray The ray we are sending to test the collision\r\n * @param camera The camera space we are sending rays in\r\n * @param predicate A predicate allowing excluding sprites from the list of object to test\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info or null.\r\n */\r\n intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;\r\n\r\n /**\r\n * Renders the list of sprites on screen.\r\n */\r\n render(): void;\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n rebuild(): void;\r\n}\r\n\r\n/**\r\n * Class used to manage multiple sprites on the same spritesheet\r\n * @see https://doc.babylonjs.com/babylon101/sprites\r\n */\r\nexport class SpriteManager implements ISpriteManager {\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Snippet ID if the manager was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /** Gets the list of sprites */\r\n public sprites = new Array<Sprite>();\r\n /** Gets or sets the rendering group id (0 by default) */\r\n public renderingGroupId = 0;\r\n /** Gets or sets camera layer mask */\r\n public layerMask: number = 0x0fffffff;\r\n /** Gets or sets a boolean indicating if the sprites are pickable */\r\n public isPickable = false;\r\n\r\n /**\r\n * An event triggered when the manager is disposed.\r\n */\r\n public onDisposeObservable = new Observable<SpriteManager>();\r\n\r\n /**\r\n * Callback called when the manager is disposed\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the sprite\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets the array of sprites\r\n */\r\n public get children() {\r\n return this.sprites;\r\n }\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._spriteRenderer.capacity;\r\n }\r\n\r\n /**\r\n * Gets or sets the spritesheet texture\r\n */\r\n public get texture(): Texture {\r\n return this._spriteRenderer.texture as Texture;\r\n }\r\n public set texture(value: Texture) {\r\n value.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n value.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n this._spriteRenderer.texture = value;\r\n this._textureContent = null;\r\n }\r\n\r\n /** Defines the default width of a cell in the spritesheet */\r\n public get cellWidth(): number {\r\n return this._spriteRenderer.cellWidth;\r\n }\r\n public set cellWidth(value: number) {\r\n this._spriteRenderer.cellWidth = value;\r\n }\r\n\r\n /** Defines the default height of a cell in the spritesheet */\r\n public get cellHeight(): number {\r\n return this._spriteRenderer.cellHeight;\r\n }\r\n public set cellHeight(value: number) {\r\n this._spriteRenderer.cellHeight = value;\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */\r\n public get fogEnabled(): boolean {\r\n return this._spriteRenderer.fogEnabled;\r\n }\r\n public set fogEnabled(value: boolean) {\r\n this._spriteRenderer.fogEnabled = value;\r\n }\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public get blendMode() {\r\n return this._spriteRenderer.blendMode;\r\n }\r\n public set blendMode(blendMode: number) {\r\n this._spriteRenderer.blendMode = blendMode;\r\n }\r\n\r\n private _disableDepthWrite: boolean = false;\r\n /** Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public get disableDepthWrite() {\r\n return this._disableDepthWrite;\r\n }\r\n\r\n public set disableDepthWrite(value: boolean) {\r\n this._disableDepthWrite = value;\r\n this._spriteRenderer.disableDepthWrite = value;\r\n }\r\n\r\n private _spriteRenderer: SpriteRenderer;\r\n /** Associative array from JSON sprite data file */\r\n private _cellData: any;\r\n /** Array of sprite names from JSON sprite data file */\r\n private _spriteMap: Array<string>;\r\n /** True when packed cell data from JSON file is ready*/\r\n private _packedAndReady: boolean = false;\r\n private _textureContent: Nullable<Uint8Array>;\r\n private _onDisposeObserver: Nullable<Observer<SpriteManager>>;\r\n private _fromPacked: boolean;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Creates a new sprite manager\r\n * @param name defines the manager's name\r\n * @param imgUrl defines the sprite sheet url\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param cellSize defines the size of a sprite cell\r\n * @param scene defines the hosting scene\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param samplingMode defines the sampling mode to use with spritesheet\r\n * @param fromPacked set to false; do not alter\r\n * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter\r\n */\r\n constructor(\r\n /** defines the manager's name */\r\n public name: string,\r\n imgUrl: string,\r\n capacity: number,\r\n cellSize: any,\r\n scene: Scene,\r\n epsilon: number = 0.01,\r\n samplingMode: number = Texture.TRILINEAR_SAMPLINGMODE,\r\n fromPacked: boolean = false,\r\n spriteJSON: any | null = null\r\n ) {\r\n if (!scene) {\r\n scene = EngineStore.LastCreatedScene!;\r\n }\r\n\r\n if (!scene._getComponent(SceneComponentConstants.NAME_SPRITE)) {\r\n scene._addComponent(new SpriteSceneComponent(scene));\r\n }\r\n this._fromPacked = fromPacked;\r\n\r\n this._scene = scene;\r\n const engine = this._scene.getEngine();\r\n this._spriteRenderer = new SpriteRenderer(engine, capacity, epsilon, scene);\r\n\r\n if (cellSize.width && cellSize.height) {\r\n this.cellWidth = cellSize.width;\r\n this.cellHeight = cellSize.height;\r\n } else if (cellSize !== undefined) {\r\n this.cellWidth = cellSize;\r\n this.cellHeight = cellSize;\r\n } else {\r\n this._spriteRenderer = <any>null;\r\n return;\r\n }\r\n\r\n this._scene.spriteManagers.push(this);\r\n this.uniqueId = this.scene.getUniqueId();\r\n\r\n if (imgUrl) {\r\n this.texture = new Texture(imgUrl, scene, true, false, samplingMode);\r\n }\r\n\r\n if (this._fromPacked) {\r\n this._makePacked(imgUrl, spriteJSON);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the string \"SpriteManager\"\r\n * @returns \"SpriteManager\"\r\n */\r\n public getClassName(): string {\r\n return \"SpriteManager\";\r\n }\r\n\r\n private _makePacked(imgUrl: string, spriteJSON: any) {\r\n if (spriteJSON !== null) {\r\n try {\r\n //Get the JSON and Check its structure. If its an array parse it if its a JSON string etc...\r\n let celldata: any;\r\n if (typeof spriteJSON === \"string\") {\r\n celldata = JSON.parse(spriteJSON);\r\n } else {\r\n celldata = spriteJSON;\r\n }\r\n\r\n if (celldata.frames.length) {\r\n const frametemp: any = {};\r\n for (let i = 0; i < celldata.frames.length; i++) {\r\n const _f = celldata.frames[i];\r\n if (typeof Object.keys(_f)[0] !== \"string\") {\r\n throw new Error(\"Invalid JSON Format. Check the frame values and make sure the name is the first parameter.\");\r\n }\r\n\r\n const name: string = _f[Object.keys(_f)[0]];\r\n frametemp[name] = _f;\r\n }\r\n celldata.frames = frametemp;\r\n }\r\n\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON from string. Spritesheet managed with constant cell size.\");\r\n }\r\n } else {\r\n const re = /\\./g;\r\n let li: number;\r\n do {\r\n li = re.lastIndex;\r\n re.test(imgUrl);\r\n } while (re.lastIndex > 0);\r\n const jsonUrl = imgUrl.substring(0, li - 1) + \".json\";\r\n const onerror = () => {\r\n Logger.Error(\"JSON ERROR: Unable to load JSON file.\");\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n };\r\n const onload = (data: string | ArrayBuffer) => {\r\n try {\r\n const celldata = JSON.parse(data as string);\r\n const spritemap = <string[]>Reflect.ownKeys(celldata.frames);\r\n this._spriteMap = spritemap;\r\n this._packedAndReady = true;\r\n this._cellData = celldata.frames;\r\n } catch (e) {\r\n this._fromPacked = false;\r\n this._packedAndReady = false;\r\n throw new Error(\"Invalid JSON format. Please check documentation for format specifications.\");\r\n }\r\n };\r\n Tools.LoadFile(jsonUrl, onload, undefined, undefined, false, onerror);\r\n }\r\n }\r\n\r\n private _checkTextureAlpha(sprite: Sprite, ray: Ray, distance: number, min: Vector3, max: Vector3) {\r\n if (!sprite.useAlphaForPicking || !this.texture) {\r\n return true;\r\n }\r\n\r\n const textureSize = this.texture.getSize();\r\n if (!this._textureContent) {\r\n this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4);\r\n this.texture.readPixels(0, 0, this._textureContent);\r\n }\r\n\r\n const contactPoint = TmpVectors.Vector3[0];\r\n\r\n contactPoint.copyFrom(ray.direction);\r\n\r\n contactPoint.normalize();\r\n contactPoint.scaleInPlace(distance);\r\n contactPoint.addInPlace(ray.origin);\r\n\r\n const contactPointU = (contactPoint.x - min.x) / (max.x - min.x) - 0.5;\r\n const contactPointV = 1.0 - (contactPoint.y - min.y) / (max.y - min.y) - 0.5;\r\n\r\n // Rotate\r\n const angle = sprite.angle;\r\n const rotatedU = 0.5 + (contactPointU * Math.cos(angle) - contactPointV * Math.sin(angle));\r\n const rotatedV = 0.5 + (contactPointU * Math.sin(angle) + contactPointV * Math.cos(angle));\r\n\r\n const u = (sprite._xOffset * textureSize.width + rotatedU * sprite._xSize) | 0;\r\n const v = (sprite._yOffset * textureSize.height + rotatedV * sprite._ySize) | 0;\r\n\r\n const alpha = this._textureContent![(u + v * textureSize.width) * 4 + 3];\r\n\r\n return alpha > 0.5;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)\r\n * @returns null if no hit or a PickingInfo\r\n */\r\n public intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance = Number.MAX_VALUE;\r\n let currentSprite: Nullable<Sprite> = null;\r\n const pickedPoint = TmpVectors.Vector3[0];\r\n const cameraSpacePosition = TmpVectors.Vector3[1];\r\n const cameraView = camera.getViewMatrix();\r\n let activeRay: Ray = ray;\r\n let pickedRay: Ray = ray;\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n if (sprite.angle) {\r\n // Create a rotation matrix to rotate the ray to the sprite's rotation\r\n Matrix.TranslationToRef(-cameraSpacePosition.x, -cameraSpacePosition.y, 0, TmpVectors.Matrix[1]);\r\n Matrix.TranslationToRef(cameraSpacePosition.x, cameraSpacePosition.y, 0, TmpVectors.Matrix[2]);\r\n Matrix.RotationZToRef(sprite.angle, TmpVectors.Matrix[3]);\r\n\r\n // inv translation x rotation x translation\r\n TmpVectors.Matrix[1].multiplyToRef(TmpVectors.Matrix[3], TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(TmpVectors.Matrix[2], TmpVectors.Matrix[0]);\r\n\r\n activeRay = ray.clone();\r\n Vector3.TransformCoordinatesToRef(ray.origin, TmpVectors.Matrix[0], activeRay.origin);\r\n Vector3.TransformNormalToRef(ray.direction, TmpVectors.Matrix[0], activeRay.direction);\r\n } else {\r\n activeRay = ray;\r\n }\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (activeRay.intersectsBoxMinMax(min, max)) {\r\n const currentDistance = Vector3.Distance(cameraSpacePosition, activeRay.origin);\r\n\r\n if (distance > currentDistance) {\r\n if (!this._checkTextureAlpha(sprite, activeRay, currentDistance, min, max)) {\r\n continue;\r\n }\r\n\r\n pickedRay = activeRay;\r\n distance = currentDistance;\r\n currentSprite = sprite;\r\n\r\n if (fastCheck) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (currentSprite) {\r\n const result = new PickingInfo();\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = currentSprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(pickedRay.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n pickedRay.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n\r\n return result;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Intersects the sprites with a ray\r\n * @param ray defines the ray to intersect with\r\n * @param camera defines the current active camera\r\n * @param predicate defines a predicate used to select candidate sprites\r\n * @returns null if no hit or a PickingInfo array\r\n */\r\n public multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]> {\r\n const count = Math.min(this.capacity, this.sprites.length);\r\n const min = Vector3.Zero();\r\n const max = Vector3.Zero();\r\n let distance: number;\r\n const results: Nullable<PickingInfo[]> = [];\r\n const pickedPoint = TmpVectors.Vector3[0].copyFromFloats(0, 0, 0);\r\n const cameraSpacePosition = TmpVectors.Vector3[1].copyFromFloats(0, 0, 0);\r\n const cameraView = camera.getViewMatrix();\r\n\r\n for (let index = 0; index < count; index++) {\r\n const sprite = this.sprites[index];\r\n if (!sprite) {\r\n continue;\r\n }\r\n\r\n if (predicate) {\r\n if (!predicate(sprite)) {\r\n continue;\r\n }\r\n } else if (!sprite.isPickable) {\r\n continue;\r\n }\r\n\r\n Vector3.TransformCoordinatesToRef(sprite.position, cameraView, cameraSpacePosition);\r\n\r\n min.copyFromFloats(cameraSpacePosition.x - sprite.width / 2, cameraSpacePosition.y - sprite.height / 2, cameraSpacePosition.z);\r\n max.copyFromFloats(cameraSpacePosition.x + sprite.width / 2, cameraSpacePosition.y + sprite.height / 2, cameraSpacePosition.z);\r\n\r\n if (ray.intersectsBoxMinMax(min, max)) {\r\n distance = Vector3.Distance(cameraSpacePosition, ray.origin);\r\n\r\n if (!this._checkTextureAlpha(sprite, ray, distance, min, max)) {\r\n continue;\r\n }\r\n\r\n const result = new PickingInfo();\r\n results.push(result);\r\n\r\n cameraView.invertToRef(TmpVectors.Matrix[0]);\r\n result.hit = true;\r\n result.pickedSprite = sprite;\r\n result.distance = distance;\r\n\r\n // Get picked point\r\n const direction = TmpVectors.Vector3[2];\r\n direction.copyFrom(ray.direction);\r\n direction.normalize();\r\n direction.scaleInPlace(distance);\r\n\r\n ray.origin.addToRef(direction, pickedPoint);\r\n result.pickedPoint = Vector3.TransformCoordinates(pickedPoint, TmpVectors.Matrix[0]);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n */\r\n public render(): void {\r\n // Check\r\n if (this._fromPacked && (!this._packedAndReady || !this._spriteMap || !this._cellData)) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n const deltaTime = engine.getDeltaTime();\r\n if (this._packedAndReady) {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix(), this._customUpdate);\r\n } else {\r\n this._spriteRenderer.render(this.sprites, deltaTime, this._scene.getViewMatrix(), this._scene.getProjectionMatrix());\r\n }\r\n }\r\n\r\n private _customUpdate = (sprite: ThinSprite, baseSize: ISize): void => {\r\n if (!sprite.cellRef) {\r\n sprite.cellIndex = 0;\r\n }\r\n const num = sprite.cellIndex;\r\n if (typeof num === \"number\" && isFinite(num) && Math.floor(num) === num) {\r\n sprite.cellRef = this._spriteMap[sprite.cellIndex];\r\n }\r\n sprite._xOffset = this._cellData[sprite.cellRef].frame.x / baseSize.width;\r\n sprite._yOffset = this._cellData[sprite.cellRef].frame.y / baseSize.height;\r\n sprite._xSize = this._cellData[sprite.cellRef].frame.w;\r\n sprite._ySize = this._cellData[sprite.cellRef].frame.h;\r\n };\r\n\r\n /**\r\n * Rebuilds the manager (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n this._spriteRenderer?.rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._spriteRenderer) {\r\n this._spriteRenderer.dispose();\r\n (<any>this._spriteRenderer) = null;\r\n }\r\n\r\n this._textureContent = null;\r\n\r\n // Remove from scene\r\n const index = this._scene.spriteManagers.indexOf(this);\r\n this._scene.spriteManagers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n /**\r\n * Serializes the sprite manager to a JSON object\r\n * @param serializeTexture defines if the texture must be serialized as well\r\n * @returns the JSON object\r\n */\r\n public serialize(serializeTexture = false): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.capacity = this.capacity;\r\n serializationObject.cellWidth = this.cellWidth;\r\n serializationObject.cellHeight = this.cellHeight;\r\n\r\n if (this.texture) {\r\n if (serializeTexture) {\r\n serializationObject.texture = this.texture.serialize();\r\n } else {\r\n serializationObject.textureUrl = this.texture.name;\r\n serializationObject.invertY = this.texture._invertY;\r\n }\r\n }\r\n\r\n serializationObject.sprites = [];\r\n\r\n for (const sprite of this.sprites) {\r\n serializationObject.sprites.push(sprite.serialize());\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a JSON object to create a new sprite manager.\r\n * @param parsedManager The JSON object to parse\r\n * @param scene The scene to create the sprite manager\r\n * @param rootUrl The root url to use to load external dependencies like texture\r\n * @returns the new sprite manager\r\n */\r\n public static Parse(parsedManager: any, scene: Scene, rootUrl: string): SpriteManager {\r\n const manager = new SpriteManager(\r\n parsedManager.name,\r\n \"\",\r\n parsedManager.capacity,\r\n {\r\n width: parsedManager.cellWidth,\r\n height: parsedManager.cellHeight,\r\n },\r\n scene\r\n );\r\n\r\n if (parsedManager.texture) {\r\n manager.texture = Texture.Parse(parsedManager.texture, scene, rootUrl) as Texture;\r\n } else if (parsedManager.textureName) {\r\n manager.texture = new Texture(rootUrl + parsedManager.textureUrl, scene, false, parsedManager.invertY !== undefined ? parsedManager.invertY : true);\r\n }\r\n\r\n for (const parsedSprite of parsedManager.sprites) {\r\n Sprite.Parse(parsedSprite, manager);\r\n }\r\n\r\n return manager;\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved in a remote file\r\n * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)\r\n * @param url defines the url to load from\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const serializationObject = JSON.parse(request.responseText);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n if (name) {\r\n output.name = name;\r\n }\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the sprite manager\");\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl: string = \"\"): Promise<SpriteManager> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(new SpriteManager(\"Default sprite manager\", \"//playground.babylonjs.com/textures/player.png\", 500, 64, scene));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.spriteManager);\r\n const output = SpriteManager.Parse(serializationObject, scene || EngineStore.LastCreatedScene, rootUrl);\r\n\r\n output.snippetId = snippetId;\r\n\r\n resolve(output);\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n\r\n /**\r\n * Creates a sprite manager from a snippet saved by the sprite editor\r\n * @deprecated Please use ParseFromSnippetAsync instead\r\n * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a promise that will resolve to the new sprite manager\r\n */\r\n public static CreateFromSnippetAsync = SpriteManager.ParseFromSnippetAsync;\r\n}\r\n"]}
|
|
@@ -48,7 +48,7 @@ var SpriteRenderer = /** @class */ (function () {
|
|
|
48
48
|
this._capacity = capacity;
|
|
49
49
|
this._epsilon = epsilon;
|
|
50
50
|
this._engine = engine;
|
|
51
|
-
this._useInstancing = engine.getCaps().instancedArrays;
|
|
51
|
+
this._useInstancing = engine.getCaps().instancedArrays && engine._features.supportSpriteInstancing;
|
|
52
52
|
this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;
|
|
53
53
|
this._scene = scene;
|
|
54
54
|
this._drawWrapperBase = new DrawWrapper(engine);
|