@babylonjs/core 6.42.0 → 6.44.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 +2 -2
- package/Animations/animatable.js.map +1 -1
- package/Animations/animationGroup.d.ts +4 -2
- package/Animations/animationGroup.js +22 -2
- package/Animations/animationGroup.js.map +1 -1
- package/Cameras/arcRotateCamera.js +7 -1
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Culling/ray.d.ts +12 -1
- package/Culling/ray.js +20 -3
- package/Culling/ray.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +2 -0
- package/Debug/skeletonViewer.js +111 -50
- package/Debug/skeletonViewer.js.map +1 -1
- package/Engines/engine.d.ts +14 -3
- package/Engines/engine.js +11 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/nullEngine.d.ts +2 -0
- package/Engines/nullEngine.js +3 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +4 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Inputs/scene.inputManager.js +2 -2
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +1 -1
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +50 -0
- package/Materials/Node/nodeMaterial.js +50 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +3 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.js +4 -2
- package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
- package/Meshes/Node/Blocks/geometryDistanceBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryDistanceBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryDistanceBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryDotBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryDotBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryDotBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.d.ts +26 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.js +52 -0
- package/Meshes/Node/Blocks/geometryLengthBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.d.ts +31 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.js +63 -0
- package/Meshes/Node/Blocks/geometryPosterizeBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.d.ts +38 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.js +88 -0
- package/Meshes/Node/Blocks/geometryReplaceColorBlock.js.map +1 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.d.ts +30 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.js +59 -0
- package/Meshes/Node/Blocks/geometryRotate2dBlock.js.map +1 -0
- package/Meshes/Node/index.d.ts +6 -0
- package/Meshes/Node/index.js +6 -0
- package/Meshes/Node/index.js.map +1 -1
- package/Meshes/mesh.js +10 -0
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/trailMesh.js +24 -19
- package/Meshes/trailMesh.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +0 -1
- package/Physics/v2/Plugins/havokPlugin.js +3 -2
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsEngine.d.ts +1 -0
- package/Physics/v2/physicsEngine.js +1 -0
- package/Physics/v2/physicsEngine.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +10 -2
- package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +48 -0
- package/XR/features/Layers/WebXRCompositionLayer.js +94 -0
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -0
- package/XR/features/Layers/WebXRProjectionLayer.d.ts +10 -0
- package/XR/features/Layers/WebXRProjectionLayer.js +51 -0
- package/XR/features/Layers/WebXRProjectionLayer.js.map +1 -0
- package/XR/features/WebXRControllerPointerSelection.js +4 -1
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.js +11 -10
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +7 -1
- package/XR/features/WebXRHandTracking.js +28 -26
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRLayers.d.ts +44 -26
- package/XR/features/WebXRLayers.js +204 -153
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +16 -1
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/webXRCamera.js +10 -0
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.d.ts +9 -0
- package/XR/webXRDefaultExperience.js +8 -0
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +1 -1
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +8 -2
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +12 -3
- package/XR/webXRLayerWrapper.js +18 -2
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRRenderTargetTextureProvider.js +0 -5
- package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +9 -1
- package/XR/webXRSessionManager.js +24 -5
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +9 -1
- package/scene.js +4 -4
- package/scene.js.map +1 -1
|
@@ -44,6 +44,7 @@ export declare class PhysicsEngine implements IPhysicsEngine {
|
|
|
44
44
|
* Default is 1/60.
|
|
45
45
|
* To slow it down, enter 1/600 for example.
|
|
46
46
|
* To speed it up, 1/30
|
|
47
|
+
* Unit is seconds.
|
|
47
48
|
* @param newTimeStep defines the new timestep to apply to this world.
|
|
48
49
|
*/
|
|
49
50
|
setTimeStep(newTimeStep?: number): void;
|
|
@@ -48,6 +48,7 @@ export class PhysicsEngine {
|
|
|
48
48
|
* Default is 1/60.
|
|
49
49
|
* To slow it down, enter 1/600 for example.
|
|
50
50
|
* To speed it up, 1/30
|
|
51
|
+
* Unit is seconds.
|
|
51
52
|
* @param newTimeStep defines the new timestep to apply to this world.
|
|
52
53
|
*/
|
|
53
54
|
setTimeStep(newTimeStep = 1 / 60) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"physicsEngine.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/physicsEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;GAGG;AACH,MAAM,OAAO,aAAa;IAUtB;;;OAGG;IACI,gBAAgB;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC;IACD,uDAAuD;IACvD;;;OAGG;IACI,MAAM,CAAC,oBAAoB;QAC9B,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,YACI,OAA0B,EAClB,iBAAyC,aAAa,CAAC,oBAAoB,EAAE;QAA7E,mBAAc,GAAd,cAAc,CAA+D;QAhCzF,gBAAgB;QACR,mBAAc,GAAuB,EAAE,CAAC;QACxC,iBAAY,GAAW,CAAC,CAAC;QAgC7B,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAgB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"physicsEngine.js","sourceRoot":"","sources":["../../../../../dev/core/src/Physics/v2/physicsEngine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;GAGG;AACH,MAAM,OAAO,aAAa;IAUtB;;;OAGG;IACI,gBAAgB;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;IAClD,CAAC;IACD,uDAAuD;IACvD;;;OAGG;IACI,MAAM,CAAC,oBAAoB;QAC9B,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,YACI,OAA0B,EAClB,iBAAyC,aAAa,CAAC,oBAAoB,EAAE;QAA7E,mBAAc,GAAd,cAAc,CAA+D;QAhCzF,gBAAgB;QACR,mBAAc,GAAuB,EAAE,CAAC;QACxC,iBAAY,GAAW,CAAC,CAAC;QAgC7B,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,OAAgB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACI,WAAW,CAAC,cAAsB,CAAC,GAAG,EAAE;QAC3C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,cAAsB,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,cAAc;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,oBAAoB;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;IACpC,CAAC;IAED;;;;OAIG;IAEH;;;OAGG;IACI,KAAK,CAAC,KAAa;QACtB,IAAI,KAAK,GAAG,GAAG,EAAE;YACb,KAAK,GAAG,GAAG,CAAC;SACf;aAAM,IAAI,KAAK,IAAI,CAAC,EAAE;YACnB,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;SACtB;QAED,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,WAAwB;QACnC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IACD;;;OAGG;IACI,UAAU,CAAC,WAAwB;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACZ,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAC5D;IACL,CAAC;IACD;;OAEG;IACI,SAAS;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACI,YAAY,CAAC,IAAa,EAAE,EAAW,EAAE,MAA4B,EAAE,KAAqB;QAC/F,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;OAMG;IACI,OAAO,CAAC,IAAa,EAAE,EAAW,EAAE,KAAqB;QAC5D,MAAM,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { Vector3 } from \"../../Maths/math.vector\";\r\nimport type { IPhysicsEngine } from \"../IPhysicsEngine\";\r\nimport type { IPhysicsEnginePluginV2 } from \"./IPhysicsEnginePlugin\";\r\nimport type { IRaycastQuery } from \"../physicsRaycastResult\";\r\nimport { PhysicsRaycastResult } from \"../physicsRaycastResult\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport type { PhysicsBody } from \"./physicsBody\";\r\n\r\n/**\r\n * Class used to control physics engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine\r\n */\r\nexport class PhysicsEngine implements IPhysicsEngine {\r\n /** @internal */\r\n private _physicsBodies: Array<PhysicsBody> = [];\r\n private _subTimeStep: number = 0;\r\n\r\n /**\r\n * Gets the gravity vector used by the simulation\r\n */\r\n public gravity: Vector3;\r\n\r\n /**\r\n *\r\n * @returns physics plugin version\r\n */\r\n public getPluginVersion(): number {\r\n return this._physicsPlugin.getPluginVersion();\r\n }\r\n // eslint-disable-next-line jsdoc/require-returns-check\r\n /**\r\n * Factory used to create the default physics plugin.\r\n * @returns The default physics plugin\r\n */\r\n public static DefaultPluginFactory(): IPhysicsEnginePluginV2 {\r\n throw _WarnImport(\"\");\r\n }\r\n\r\n /**\r\n * Creates a new Physics Engine\r\n * @param gravity defines the gravity vector used by the simulation\r\n * @param _physicsPlugin defines the plugin to use (CannonJS by default)\r\n */\r\n constructor(\r\n gravity: Nullable<Vector3>,\r\n private _physicsPlugin: IPhysicsEnginePluginV2 = PhysicsEngine.DefaultPluginFactory()\r\n ) {\r\n gravity = gravity || new Vector3(0, -9.807, 0);\r\n this.setGravity(gravity);\r\n this.setTimeStep();\r\n }\r\n\r\n /**\r\n * Sets the gravity vector used by the simulation\r\n * @param gravity defines the gravity vector to use\r\n */\r\n public setGravity(gravity: Vector3): void {\r\n this.gravity = gravity;\r\n this._physicsPlugin.setGravity(this.gravity);\r\n }\r\n\r\n /**\r\n * Set the time step of the physics engine.\r\n * Default is 1/60.\r\n * To slow it down, enter 1/600 for example.\r\n * To speed it up, 1/30\r\n * Unit is seconds.\r\n * @param newTimeStep defines the new timestep to apply to this world.\r\n */\r\n public setTimeStep(newTimeStep: number = 1 / 60) {\r\n this._physicsPlugin.setTimeStep(newTimeStep);\r\n }\r\n\r\n /**\r\n * Get the time step of the physics engine.\r\n * @returns the current time step\r\n */\r\n public getTimeStep(): number {\r\n return this._physicsPlugin.getTimeStep();\r\n }\r\n\r\n /**\r\n * Set the sub time step of the physics engine.\r\n * Default is 0 meaning there is no sub steps\r\n * To increase physics resolution precision, set a small value (like 1 ms)\r\n * @param subTimeStep defines the new sub timestep used for physics resolution.\r\n */\r\n public setSubTimeStep(subTimeStep: number = 0) {\r\n this._subTimeStep = subTimeStep;\r\n }\r\n\r\n /**\r\n * Get the sub time step of the physics engine.\r\n * @returns the current sub time step\r\n */\r\n public getSubTimeStep() {\r\n return this._subTimeStep;\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public dispose(): void {\r\n this._physicsPlugin.dispose();\r\n }\r\n\r\n /**\r\n * Gets the name of the current physics plugin\r\n * @returns the name of the plugin\r\n */\r\n public getPhysicsPluginName(): string {\r\n return this._physicsPlugin.name;\r\n }\r\n\r\n /**\r\n * Adding a new impostor for the impostor tracking.\r\n * This will be done by the impostor itself.\r\n * @param impostor the impostor to add\r\n */\r\n\r\n /**\r\n * Called by the scene. No need to call it.\r\n * @param delta defines the timespan between frames\r\n */\r\n public _step(delta: number) {\r\n if (delta > 0.1) {\r\n delta = 0.1;\r\n } else if (delta <= 0) {\r\n delta = 1.0 / 60.0;\r\n }\r\n\r\n this._physicsPlugin.executeStep(delta, this._physicsBodies);\r\n }\r\n\r\n /**\r\n * Add a body as an active component of this engine\r\n * @param physicsBody The body to add\r\n */\r\n public addBody(physicsBody: PhysicsBody): void {\r\n this._physicsBodies.push(physicsBody);\r\n }\r\n /**\r\n * Removes a particular body from this engine\r\n * @param physicsBody The body to remove from the simulation\r\n */\r\n public removeBody(physicsBody: PhysicsBody): void {\r\n const index = this._physicsBodies.indexOf(physicsBody);\r\n if (index > -1) {\r\n /*const removed =*/ this._physicsBodies.splice(index, 1);\r\n }\r\n }\r\n /**\r\n * @returns an array of bodies added to this engine\r\n */\r\n public getBodies(): Array<PhysicsBody> {\r\n return this._physicsBodies;\r\n }\r\n\r\n /**\r\n * Gets the current plugin used to run the simulation\r\n * @returns current plugin\r\n */\r\n public getPhysicsPlugin(): IPhysicsEnginePluginV2 {\r\n return this._physicsPlugin;\r\n }\r\n\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from when should the ray start?\r\n * @param to when should the ray end?\r\n * @param result resulting PhysicsRaycastResult\r\n * @param query raycast query object\r\n */\r\n public raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult, query?: IRaycastQuery): void {\r\n this._physicsPlugin.raycast(from, to, result, query);\r\n }\r\n\r\n /**\r\n * Does a raycast in the physics world\r\n * @param from when should the ray start?\r\n * @param to when should the ray end?\r\n * @param query raycast query object\r\n * @returns PhysicsRaycastResult\r\n */\r\n public raycast(from: Vector3, to: Vector3, query?: IRaycastQuery): PhysicsRaycastResult {\r\n const result = new PhysicsRaycastResult();\r\n this._physicsPlugin.raycast(from, to, result, query);\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Camera } from "../../../Cameras/camera";
|
|
2
2
|
import { PostProcessRenderPipeline } from "../postProcessRenderPipeline";
|
|
3
3
|
import type { Scene } from "../../../scene";
|
|
4
4
|
import "../postProcessRenderPipelineManagerSceneComponent";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "../../../tslib.es6.js";
|
|
2
2
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
3
3
|
import { serialize, SerializationHelper } from "../../../Misc/decorators.js";
|
|
4
|
+
import { Camera } from "../../../Cameras/camera.js";
|
|
4
5
|
import { PostProcess } from "../../postProcess.js";
|
|
5
6
|
import { PostProcessRenderPipeline } from "../postProcessRenderPipeline.js";
|
|
6
7
|
import { PostProcessRenderEffect } from "../postProcessRenderEffect.js";
|
|
@@ -234,8 +235,15 @@ export class TAARenderingPipeline extends PostProcessRenderPipeline {
|
|
|
234
235
|
this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());
|
|
235
236
|
}
|
|
236
237
|
if (camera && !camera.hasMoved) {
|
|
237
|
-
|
|
238
|
-
|
|
238
|
+
if (camera.mode === Camera.PERSPECTIVE_CAMERA) {
|
|
239
|
+
const projMat = camera.getProjectionMatrix();
|
|
240
|
+
projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame
|
|
244
|
+
const projMat = camera.getProjectionMatrix(true);
|
|
245
|
+
projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);
|
|
246
|
+
}
|
|
239
247
|
}
|
|
240
248
|
if (this._passPostProcess) {
|
|
241
249
|
this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, SerializationHelper } from \"../../../Misc/decorators\";\r\nimport type { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nimport \"../../../Shaders/taa.fragment\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n @serialize(\"samples\")\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public factor = 0.05;\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public disableOnCameraMove = true;\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._firstUpdate = true;\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._hs = new Halton2DSequence(this.samples);\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._hs.setDimensions(width / 2, height / 2);\r\n this._firstUpdate = true;\r\n }\r\n\r\n private _updateEffectDefines(): void {\r\n const defines: string[] = [];\r\n\r\n this._taaPostProcess?.updateEffect(defines.join(\"\\n\"));\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n });\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._updateEffectDefines();\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n if (camera && !camera.hasMoved) {\r\n const projMat = camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n }\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n this._hs.next();\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n const camera = this._scene.activeCamera;\r\n\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n effect.setFloat(\"factor\", (camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
|
|
1
|
+
{"version":3,"file":"taaRenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { serialize, SerializationHelper } from \"../../../Misc/decorators\";\r\nimport { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { PostProcess } from \"../../postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../postProcessRenderEffect\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { PassPostProcess } from \"core/PostProcesses/passPostProcess\";\r\nimport type { RenderTargetWrapper } from \"core/Engines/renderTargetWrapper\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\n\r\nimport \"../postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nimport \"../../../Shaders/taa.fragment\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class TAARenderingPipeline extends PostProcessRenderPipeline {\r\n /**\r\n * The TAA PostProcess effect id in the pipeline\r\n */\r\n public TAARenderEffect: string = \"TAARenderEffect\";\r\n /**\r\n * The pass PostProcess effect id in the pipeline\r\n */\r\n public TAAPassEffect: string = \"TAAPassEffect\";\r\n\r\n @serialize(\"samples\")\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 16)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n @serialize(\"msaaSamples\")\r\n private _msaaSamples = 1;\r\n /**\r\n * MSAA samples (default: 1)\r\n */\r\n public set msaaSamples(samples: number) {\r\n if (this._msaaSamples === samples) {\r\n return;\r\n }\r\n\r\n this._msaaSamples = samples;\r\n if (this._taaPostProcess) {\r\n this._taaPostProcess.samples = samples;\r\n }\r\n }\r\n\r\n public get msaaSamples(): number {\r\n return this._msaaSamples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n @serialize()\r\n public factor = 0.05;\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n @serialize()\r\n public disableOnCameraMove = true;\r\n\r\n @serialize(\"isEnabled\")\r\n private _isEnabled = true;\r\n /**\r\n * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (!value) {\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n } else if (value) {\r\n if (!this._isDirty) {\r\n if (this._cameras !== null) {\r\n this._firstUpdate = true;\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n } else {\r\n this._buildPipeline();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n private _scene: Scene;\r\n private _isDirty = false;\r\n private _camerasToBeAttached: Array<Camera> = [];\r\n private _textureType: number;\r\n private _taaPostProcess: Nullable<PostProcess>;\r\n private _passPostProcess: Nullable<PassPostProcess>;\r\n private _ping: RenderTargetWrapper;\r\n private _pong: RenderTargetWrapper;\r\n private _pingpong = 0;\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n\r\n /**\r\n * Returns true if TAA is supported by the running hardware\r\n */\r\n public get isSupported(): boolean {\r\n const caps = this._scene.getEngine().getCaps();\r\n\r\n return caps.texelFetch;\r\n }\r\n\r\n /**\r\n * Constructor of the TAA rendering pipeline\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)\r\n * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, scene: Scene, cameras?: Camera[], textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n const engine = scene.getEngine();\r\n\r\n super(engine, name);\r\n\r\n this._cameras = cameras || scene.cameras;\r\n this._cameras = this._cameras.slice();\r\n this._camerasToBeAttached = this._cameras.slice();\r\n\r\n this._scene = scene;\r\n this._textureType = textureType;\r\n this._hs = new Halton2DSequence(this.samples);\r\n\r\n if (this.isSupported) {\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n\r\n this._buildPipeline();\r\n }\r\n }\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"TAARenderingPipeline\"\r\n */\r\n public getClassName(): string {\r\n return \"TAARenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Adds a camera to the pipeline\r\n * @param camera the camera to be added\r\n */\r\n public addCamera(camera: Camera): void {\r\n this._camerasToBeAttached.push(camera);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes a camera from the pipeline\r\n * @param camera the camera to remove\r\n */\r\n public removeCamera(camera: Camera): void {\r\n const index = this._camerasToBeAttached.indexOf(camera);\r\n this._camerasToBeAttached.splice(index, 1);\r\n this._buildPipeline();\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n */\r\n public dispose(): void {\r\n this._disposePostProcesses();\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n\r\n this._ping.dispose();\r\n this._pong.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n private _createPingPongTextures(width: number, height: number) {\r\n const engine = this._scene.getEngine();\r\n\r\n this._ping?.dispose();\r\n this._pong?.dispose();\r\n\r\n this._ping = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._pong = engine.createRenderTargetTexture(\r\n { width, height },\r\n { generateMipMaps: false, generateDepthBuffer: false, type: Constants.TEXTURETYPE_HALF_FLOAT, samplingMode: Constants.TEXTURE_NEAREST_NEAREST }\r\n );\r\n\r\n this._hs.setDimensions(width / 2, height / 2);\r\n this._firstUpdate = true;\r\n }\r\n\r\n private _updateEffectDefines(): void {\r\n const defines: string[] = [];\r\n\r\n this._taaPostProcess?.updateEffect(defines.join(\"\\n\"));\r\n }\r\n\r\n private _buildPipeline() {\r\n if (!this.isSupported) {\r\n return;\r\n }\r\n\r\n if (!this._isEnabled) {\r\n this._isDirty = true;\r\n return;\r\n }\r\n\r\n this._isDirty = false;\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n this._disposePostProcesses();\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._cameras);\r\n // get back cameras to be used to reattach pipeline\r\n this._cameras = this._camerasToBeAttached.slice();\r\n }\r\n this._reset();\r\n\r\n this._createTAAPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAARenderEffect,\r\n () => {\r\n return this._taaPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n this._createPassPostProcess();\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n engine,\r\n this.TAAPassEffect,\r\n () => {\r\n return this._passPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n if (this._cameras !== null) {\r\n this._scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(this._name, this._cameras);\r\n }\r\n }\r\n\r\n private _disposePostProcesses(): void {\r\n for (let i = 0; i < this._cameras.length; i++) {\r\n const camera = this._cameras[i];\r\n\r\n this._taaPostProcess?.dispose(camera);\r\n this._passPostProcess?.dispose(camera);\r\n\r\n camera.getProjectionMatrix(true); // recompute the projection matrix\r\n }\r\n\r\n this._taaPostProcess = null;\r\n this._passPostProcess = null;\r\n }\r\n\r\n private _createTAAPostProcess(): void {\r\n this._taaPostProcess = new PostProcess(\"TAA\", \"taa\", {\r\n uniforms: [\"factor\"],\r\n samplers: [\"historySampler\"],\r\n size: 1.0,\r\n engine: this._scene.getEngine(),\r\n textureType: this._textureType,\r\n });\r\n\r\n this._taaPostProcess.samples = this._msaaSamples;\r\n\r\n this._updateEffectDefines();\r\n\r\n this._taaPostProcess.onActivateObservable.add(() => {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (this._taaPostProcess?.width !== this._ping.width || this._taaPostProcess?.height !== this._ping.height) {\r\n const engine = this._scene.getEngine();\r\n this._createPingPongTextures(engine.getRenderWidth(), engine.getRenderHeight());\r\n }\r\n\r\n if (camera && !camera.hasMoved) {\r\n if (camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n const projMat = camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n } else {\r\n // We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame\r\n const projMat = camera.getProjectionMatrix(true);\r\n projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);\r\n }\r\n }\r\n\r\n if (this._passPostProcess) {\r\n this._passPostProcess.inputTexture = this._pingpong ? this._ping : this._pong;\r\n }\r\n this._pingpong = this._pingpong ^ 1;\r\n this._hs.next();\r\n });\r\n\r\n this._taaPostProcess.onApplyObservable.add((effect: Effect) => {\r\n const camera = this._scene.activeCamera;\r\n\r\n effect._bindTexture(\"historySampler\", this._pingpong ? this._ping.texture : this._pong.texture);\r\n effect.setFloat(\"factor\", (camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n });\r\n }\r\n\r\n private _createPassPostProcess() {\r\n const engine = this._scene.getEngine();\r\n\r\n this._passPostProcess = new PassPostProcess(\"TAAPass\", 1, null, Constants.TEXTURE_NEAREST_NEAREST, engine);\r\n this._passPostProcess.inputTexture = this._ping;\r\n this._passPostProcess.autoClear = false;\r\n }\r\n\r\n /**\r\n * Serializes the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"TAARenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline {\r\n return SerializationHelper.Parse(() => new TAARenderingPipeline(source._name, scene, source._ratio), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TAARenderingPipeline\", TAARenderingPipeline);\r\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { InternalTexture } from "../../../Materials/Textures/internalTexture.js";
|
|
2
|
+
import type { RenderTargetTexture } from "../../../Materials/Textures/renderTargetTexture.js";
|
|
3
|
+
import type { Viewport } from "../../../Maths/math.viewport.js";
|
|
4
|
+
import { Observable } from "../../../Misc/observable.js";
|
|
5
|
+
import type { WebXRLayerType } from "../../webXRLayerWrapper.js";
|
|
6
|
+
import { WebXRLayerWrapper } from "../../webXRLayerWrapper.js";
|
|
7
|
+
import { WebXRLayerRenderTargetTextureProvider } from "../../webXRRenderTargetTextureProvider.js";
|
|
8
|
+
import type { WebXRSessionManager } from "../../webXRSessionManager.js";
|
|
9
|
+
import type { Nullable } from "../../../types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Wraps xr composition layers.
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
|
|
15
|
+
getWidth: () => number;
|
|
16
|
+
getHeight: () => number;
|
|
17
|
+
readonly layer: XRCompositionLayer;
|
|
18
|
+
readonly layerType: WebXRLayerType;
|
|
19
|
+
readonly isMultiview: boolean;
|
|
20
|
+
createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider;
|
|
21
|
+
_originalInternalTexture: Nullable<InternalTexture>;
|
|
22
|
+
constructor(getWidth: () => number, getHeight: () => number, layer: XRCompositionLayer, layerType: WebXRLayerType, isMultiview: boolean, createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider, _originalInternalTexture?: Nullable<InternalTexture>);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Provides render target textures and other important rendering information for a given XRCompositionLayer.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export declare class WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
|
|
29
|
+
protected readonly _xrSessionManager: WebXRSessionManager;
|
|
30
|
+
protected readonly _xrWebGLBinding: XRWebGLBinding;
|
|
31
|
+
readonly layerWrapper: WebXRCompositionLayerWrapper;
|
|
32
|
+
protected _lastSubImages: Map<XREye, XRWebGLSubImage>;
|
|
33
|
+
private _compositionLayer;
|
|
34
|
+
/**
|
|
35
|
+
* Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)
|
|
36
|
+
*/
|
|
37
|
+
onRenderTargetTextureCreatedObservable: Observable<{
|
|
38
|
+
texture: RenderTargetTexture;
|
|
39
|
+
eye?: XREye | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
constructor(_xrSessionManager: WebXRSessionManager, _xrWebGLBinding: XRWebGLBinding, layerWrapper: WebXRCompositionLayerWrapper);
|
|
42
|
+
protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye?: XREye): RenderTargetTexture;
|
|
43
|
+
private _getSubImageForEye;
|
|
44
|
+
getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture>;
|
|
45
|
+
getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture>;
|
|
46
|
+
protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage): void;
|
|
47
|
+
trySetViewportForView(viewport: Viewport, view: XRView): boolean;
|
|
48
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Observable } from "../../../Misc/observable.js";
|
|
2
|
+
import { WebXRLayerWrapper } from "../../webXRLayerWrapper.js";
|
|
3
|
+
import { WebXRLayerRenderTargetTextureProvider } from "../../webXRRenderTargetTextureProvider.js";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps xr composition layers.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
|
|
9
|
+
constructor(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider, _originalInternalTexture = null) {
|
|
10
|
+
super(getWidth, getHeight, layer, layerType, createRTTProvider);
|
|
11
|
+
this.getWidth = getWidth;
|
|
12
|
+
this.getHeight = getHeight;
|
|
13
|
+
this.layer = layer;
|
|
14
|
+
this.layerType = layerType;
|
|
15
|
+
this.isMultiview = isMultiview;
|
|
16
|
+
this.createRTTProvider = createRTTProvider;
|
|
17
|
+
this._originalInternalTexture = _originalInternalTexture;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Provides render target textures and other important rendering information for a given XRCompositionLayer.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export class WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
|
|
25
|
+
constructor(_xrSessionManager, _xrWebGLBinding, layerWrapper) {
|
|
26
|
+
super(_xrSessionManager.scene, layerWrapper);
|
|
27
|
+
this._xrSessionManager = _xrSessionManager;
|
|
28
|
+
this._xrWebGLBinding = _xrWebGLBinding;
|
|
29
|
+
this.layerWrapper = layerWrapper;
|
|
30
|
+
this._lastSubImages = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)
|
|
33
|
+
*/
|
|
34
|
+
this.onRenderTargetTextureCreatedObservable = new Observable();
|
|
35
|
+
this._compositionLayer = layerWrapper.layer;
|
|
36
|
+
}
|
|
37
|
+
_getRenderTargetForSubImage(subImage, eye = "none") {
|
|
38
|
+
const lastSubImage = this._lastSubImages.get(eye);
|
|
39
|
+
const eyeIndex = eye == "right" ? 1 : 0;
|
|
40
|
+
const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;
|
|
41
|
+
const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;
|
|
42
|
+
if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {
|
|
43
|
+
let depthStencilTexture;
|
|
44
|
+
const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;
|
|
45
|
+
const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;
|
|
46
|
+
if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {
|
|
47
|
+
depthStencilTexture = subImage.depthStencilTexture;
|
|
48
|
+
}
|
|
49
|
+
this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(colorTextureWidth, colorTextureHeight, null, subImage.colorTexture, depthStencilTexture, this.layerWrapper.isMultiview);
|
|
50
|
+
this._framebufferDimensions = {
|
|
51
|
+
framebufferWidth: colorTextureWidth,
|
|
52
|
+
framebufferHeight: colorTextureHeight,
|
|
53
|
+
};
|
|
54
|
+
this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTextures[eyeIndex], eye });
|
|
55
|
+
}
|
|
56
|
+
this._lastSubImages.set(eye, subImage);
|
|
57
|
+
return this._renderTargetTextures[eyeIndex];
|
|
58
|
+
}
|
|
59
|
+
_getSubImageForEye(eye) {
|
|
60
|
+
const currentFrame = this._xrSessionManager.currentFrame;
|
|
61
|
+
if (currentFrame) {
|
|
62
|
+
return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
getRenderTargetTextureForEye(eye) {
|
|
67
|
+
const subImage = this._getSubImageForEye(eye);
|
|
68
|
+
if (subImage) {
|
|
69
|
+
return this._getRenderTargetForSubImage(subImage, eye);
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
getRenderTargetTextureForView(view) {
|
|
74
|
+
return this.getRenderTargetTextureForEye(view?.eye);
|
|
75
|
+
}
|
|
76
|
+
_setViewportForSubImage(viewport, subImage) {
|
|
77
|
+
const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;
|
|
78
|
+
const textureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;
|
|
79
|
+
const xrViewport = subImage.viewport;
|
|
80
|
+
viewport.x = xrViewport.x / textureWidth;
|
|
81
|
+
viewport.y = xrViewport.y / textureHeight;
|
|
82
|
+
viewport.width = xrViewport.width / textureWidth;
|
|
83
|
+
viewport.height = xrViewport.height / textureHeight;
|
|
84
|
+
}
|
|
85
|
+
trySetViewportForView(viewport, view) {
|
|
86
|
+
const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);
|
|
87
|
+
if (subImage) {
|
|
88
|
+
this._setViewportForSubImage(viewport, subImage);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=WebXRCompositionLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebXRCompositionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRCompositionLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { Viewport } from \"core/Maths/math.viewport\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { WebXRLayerType } from \"core/XR/webXRLayerWrapper\";\r\nimport { WebXRLayerWrapper } from \"core/XR/webXRLayerWrapper\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"core/XR/webXRRenderTargetTextureProvider\";\r\nimport type { WebXRSessionManager } from \"core/XR/webXRSessionManager\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Wraps xr composition layers.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {\r\n constructor(\r\n public getWidth: () => number,\r\n public getHeight: () => number,\r\n public readonly layer: XRCompositionLayer,\r\n public readonly layerType: WebXRLayerType,\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider,\r\n public _originalInternalTexture: Nullable<InternalTexture> = null\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n /**\r\n * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)\r\n */\r\n public onRenderTargetTextureCreatedObservable = new Observable<{ texture: RenderTargetTexture; eye?: XREye }>();\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRCompositionLayerWrapper\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye = \"none\") {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"right\" ? 1 : 0;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTextures[eyeIndex], eye });\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye?: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view?.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { WebXRCompositionLayerWrapper } from "./WebXRCompositionLayer";
|
|
2
|
+
/**
|
|
3
|
+
* Wraps xr projection layers.
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {
|
|
7
|
+
readonly layer: XRProjectionLayer;
|
|
8
|
+
constructor(layer: XRProjectionLayer, isMultiview: boolean, xrGLBinding: XRWebGLBinding);
|
|
9
|
+
}
|
|
10
|
+
export declare const defaultXRProjectionLayerInit: XRProjectionLayerInit;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from "./WebXRCompositionLayer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wraps xr projection layers.
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {
|
|
7
|
+
constructor(layer, isMultiview, xrGLBinding) {
|
|
8
|
+
super(() => layer.textureWidth, () => layer.textureHeight, layer, "XRProjectionLayer", isMultiview, (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this));
|
|
9
|
+
this.layer = layer;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Provides render target textures and other important rendering information for a given XRProjectionLayer.
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
class WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {
|
|
17
|
+
constructor(_xrSessionManager, _xrWebGLBinding, layerWrapper) {
|
|
18
|
+
super(_xrSessionManager, _xrWebGLBinding, layerWrapper);
|
|
19
|
+
this.layerWrapper = layerWrapper;
|
|
20
|
+
this._projectionLayer = layerWrapper.layer;
|
|
21
|
+
}
|
|
22
|
+
_getSubImageForView(view) {
|
|
23
|
+
return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);
|
|
24
|
+
}
|
|
25
|
+
getRenderTargetTextureForView(view) {
|
|
26
|
+
return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);
|
|
27
|
+
}
|
|
28
|
+
getRenderTargetTextureForEye(eye) {
|
|
29
|
+
const lastSubImage = this._lastSubImages.get(eye);
|
|
30
|
+
if (lastSubImage) {
|
|
31
|
+
return this._getRenderTargetForSubImage(lastSubImage, eye);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
trySetViewportForView(viewport, view) {
|
|
36
|
+
const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);
|
|
37
|
+
if (subImage) {
|
|
38
|
+
this._setViewportForSubImage(viewport, subImage);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export const defaultXRProjectionLayerInit = {
|
|
45
|
+
textureType: "texture",
|
|
46
|
+
colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,
|
|
47
|
+
depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,
|
|
48
|
+
scaleFactor: 1.0,
|
|
49
|
+
clearOnAccess: false,
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=WebXRProjectionLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebXRProjectionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRProjectionLayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gDAAgD,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAKzH;;;GAGG;AACH,MAAM,OAAO,2BAA4B,SAAQ,4BAA4B;IACzE,YACoB,KAAwB,EACxC,WAAoB,EACpB,WAA2B;QAE3B,KAAK,CACD,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,EACxB,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,EACzB,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,+CAA+C,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,CAC7G,CAAC;QAXc,UAAK,GAAL,KAAK,CAAmB;IAY5C,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,+CAAgD,SAAQ,gDAAgD;IAG1G,YACI,iBAAsC,EACtC,eAA+B,EACf,YAAyC;QAEzD,KAAK,CAAC,iBAAiB,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;QAFxC,iBAAY,GAAZ,YAAY,CAA6B;QAGzD,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,KAAK,CAAC;IAC/C,CAAC;IAEO,mBAAmB,CAAC,IAAY;QACpC,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;IAEM,6BAA6B,CAAC,IAAY;QAC7C,OAAO,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,CAAC;IAEM,4BAA4B,CAAC,GAAU;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,YAAY,EAAE;YACd,OAAO,IAAI,CAAC,2BAA2B,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;SAC9D;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,qBAAqB,CAAC,QAAkB,EAAE,IAAY;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACrF,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,4BAA4B,GAA0B;IAC/D,WAAW,EAAE,SAAS;IACtB,WAAW,EAAE,MAAM,CAAC,gCAAgC;IACpD,WAAW,EAAE,MAAM,CAAC,4CAA4C;IAChE,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,KAAK;CACvB,CAAC","sourcesContent":["import type { WebXRSessionManager } from \"core/XR/webXRSessionManager\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./WebXRCompositionLayer\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport type { Viewport } from \"core/Maths/math.viewport\";\r\n\r\n/**\r\n * Wraps xr projection layers.\r\n * @internal\r\n */\r\nexport class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {\r\n constructor(\r\n public readonly layer: XRProjectionLayer,\r\n isMultiview: boolean,\r\n xrGLBinding: XRWebGLBinding\r\n ) {\r\n super(\r\n () => layer.textureWidth,\r\n () => layer.textureHeight,\r\n layer,\r\n \"XRProjectionLayer\",\r\n isMultiview,\r\n (sessionManager) => new WebXRProjectionLayerRenderTargetTextureProvider(sessionManager, xrGLBinding, this)\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRProjectionLayer.\r\n * @internal\r\n */\r\nclass WebXRProjectionLayerRenderTargetTextureProvider extends WebXRCompositionLayerRenderTargetTextureProvider {\r\n private readonly _projectionLayer: XRProjectionLayer;\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n _xrWebGLBinding: XRWebGLBinding,\r\n public readonly layerWrapper: WebXRProjectionLayerWrapper\r\n ) {\r\n super(_xrSessionManager, _xrWebGLBinding, layerWrapper);\r\n this._projectionLayer = layerWrapper.layer;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n return this._xrWebGLBinding.getViewSubImage(this._projectionLayer, view);\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n return this._getRenderTargetForSubImage(this._getSubImageForView(view), view.eye);\r\n }\r\n\r\n public getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture> {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n if (lastSubImage) {\r\n return this._getRenderTargetForSubImage(lastSubImage, eye);\r\n }\r\n return null;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport const defaultXRProjectionLayerInit: XRProjectionLayerInit = {\r\n textureType: \"texture\",\r\n colorFormat: 0x1908 /* WebGLRenderingContext.RGBA */,\r\n depthFormat: 0x88f0 /* WebGLRenderingContext.DEPTH24_STENCIL8 */,\r\n scaleFactor: 1.0,\r\n clearOnAccess: false,\r\n};\r\n"]}
|
|
@@ -58,6 +58,7 @@ export class WebXRControllerPointerSelection extends WebXRAbstractFeature {
|
|
|
58
58
|
case "gaze":
|
|
59
59
|
return this._attachGazeMode(xrController);
|
|
60
60
|
case "screen":
|
|
61
|
+
case "transient-pointer":
|
|
61
62
|
return this._attachScreenRayMode(xrController);
|
|
62
63
|
}
|
|
63
64
|
};
|
|
@@ -240,7 +241,9 @@ export class WebXRControllerPointerSelection extends WebXRAbstractFeature {
|
|
|
240
241
|
if (typeof this._screenCoordinatesRef.x === "number" &&
|
|
241
242
|
typeof this._screenCoordinatesRef.y === "number" &&
|
|
242
243
|
!isNaN(this._screenCoordinatesRef.x) &&
|
|
243
|
-
!isNaN(this._screenCoordinatesRef.y)
|
|
244
|
+
!isNaN(this._screenCoordinatesRef.y) &&
|
|
245
|
+
this._screenCoordinatesRef.x !== Infinity &&
|
|
246
|
+
this._screenCoordinatesRef.y !== Infinity) {
|
|
244
247
|
scene.pointerX = this._screenCoordinatesRef.x;
|
|
245
248
|
scene.pointerY = this._screenCoordinatesRef.y;
|
|
246
249
|
controllerData.screenCoordinates = {
|