@babylonjs/core 6.5.0 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animation.d.ts +4 -0
- package/Animations/animation.js +13 -1
- package/Animations/animation.js.map +1 -1
- package/Animations/runtimeAnimation.js +9 -1
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/sound.js +3 -1
- package/Audio/sound.js.map +1 -1
- package/Bones/boneLookController.d.ts +5 -0
- package/Bones/boneLookController.js +17 -3
- package/Bones/boneLookController.js.map +1 -1
- package/Engines/Processors/iShaderProcessor.d.ts +1 -0
- package/Engines/Processors/iShaderProcessor.js.map +1 -1
- package/Engines/Processors/shaderCodeNode.js +3 -2
- package/Engines/Processors/shaderCodeNode.js.map +1 -1
- package/Engines/Processors/shaderProcessor.d.ts +1 -0
- package/Engines/Processors/shaderProcessor.js +45 -44
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGL/webGL2ShaderProcessors.d.ts +1 -0
- package/Engines/WebGL/webGL2ShaderProcessors.js +4 -0
- package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +1 -0
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +16 -7
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/engine.js +4 -4
- package/Engines/engine.js.map +1 -1
- package/Engines/thinEngine.js +10 -5
- package/Engines/thinEngine.js.map +1 -1
- package/Layers/layer.d.ts +5 -0
- package/Layers/layer.js +16 -6
- package/Layers/layer.js.map +1 -1
- package/Materials/Node/Blocks/PBR/anisotropyBlock.d.ts +4 -0
- package/Materials/Node/Blocks/PBR/anisotropyBlock.js +10 -0
- package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
- package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +26 -0
- package/Materials/PBR/pbrAnisotropicConfiguration.js +47 -0
- package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.js +1 -2
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.d.ts +6 -1
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Meshes/Builders/textBuilder.d.ts +2 -1
- package/Meshes/Builders/textBuilder.js +14 -2
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Misc/assetsManager.d.ts +78 -0
- package/Misc/assetsManager.js +60 -1
- package/Misc/assetsManager.js.map +1 -1
- package/Misc/filesInput.d.ts +1 -1
- package/Misc/filesInput.js +5 -5
- package/Misc/filesInput.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +2 -2
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsAggregate.d.ts +1 -0
- package/Physics/v2/physicsAggregate.js +6 -5
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +10 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +77 -10
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/Rendering/depthRenderer.js +1 -0
- package/Rendering/depthRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockAnisotropic.js +6 -3
- package/Shaders/ShadersInclude/pbrBlockAnisotropic.js.map +1 -1
- package/Shaders/ShadersInclude/pbrHelperFunctions.js +4 -1
- package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/screenSpaceRayTrace.js +4 -1
- package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
- package/Shaders/glowMapGeneration.fragment.js +1 -1
- package/Shaders/glowMapGeneration.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +1 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/screenSpaceReflection2.fragment.d.ts +1 -0
- package/Shaders/screenSpaceReflection2.fragment.js +16 -10
- package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
- package/Shaders/screenSpaceReflection2BlurCombiner.fragment.d.ts +2 -0
- package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js +13 -2
- package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +18 -20
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boneLookController.js","sourceRoot":"","sources":["../../../../lts/core/generated/Bones/boneLookController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Vector3, Quaternion, Matrix } from \"../Maths/math.vector\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Bone } from \"./bone\";\r\nimport { Space, Axis } from \"../Maths/math.axis\";\r\n\r\n/**\r\n * Class used to make a bone look toward a point in space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons#bonelookcontroller\r\n */\r\nexport class BoneLookController {\r\n private static _TmpVecs: Vector3[] = ArrayTools.BuildArray(10, Vector3.Zero);\r\n private static _TmpQuat = Quaternion.Identity();\r\n private static _TmpMats: Matrix[] = ArrayTools.BuildArray(5, Matrix.Identity);\r\n\r\n /**\r\n * The target Vector3 that the bone will look at\r\n */\r\n public target: Vector3;\r\n\r\n /**\r\n * The TransformNode that the bone is attached to\r\n * Name kept as mesh for back compatibility\r\n */\r\n public mesh: TransformNode;\r\n\r\n /**\r\n * The bone that will be looking to the target\r\n */\r\n public bone: Bone;\r\n\r\n /**\r\n * The up axis of the coordinate system that is used when the bone is rotated\r\n */\r\n public upAxis: Vector3 = Vector3.Up();\r\n\r\n /**\r\n * The space that the up axis is in - Space.BONE, Space.LOCAL (default), or Space.WORLD\r\n */\r\n public upAxisSpace: Space = Space.LOCAL;\r\n\r\n /**\r\n * Used to make an adjustment to the yaw of the bone\r\n */\r\n public adjustYaw = 0;\r\n\r\n /**\r\n * Used to make an adjustment to the pitch of the bone\r\n */\r\n public adjustPitch = 0;\r\n\r\n /**\r\n * Used to make an adjustment to the roll of the bone\r\n */\r\n public adjustRoll = 0;\r\n\r\n /**\r\n * The amount to slerp (spherical linear interpolation) to the target. Set this to a value between 0 and 1 (a value of 1 disables slerp)\r\n */\r\n public slerpAmount = 1;\r\n\r\n private _minYaw: number;\r\n private _maxYaw: number;\r\n private _minPitch: number;\r\n private _maxPitch: number;\r\n private _minYawSin: number;\r\n private _minYawCos: number;\r\n private _maxYawSin: number;\r\n private _maxYawCos: number;\r\n private _midYawConstraint: number;\r\n private _minPitchTan: number;\r\n private _maxPitchTan: number;\r\n\r\n private _boneQuat: Quaternion = Quaternion.Identity();\r\n private _slerping = false;\r\n private _transformYawPitch: Matrix;\r\n private _transformYawPitchInv: Matrix;\r\n private _firstFrameSkipped = false;\r\n private _yawRange: number;\r\n private _fowardAxis: Vector3 = Vector3.Forward();\r\n\r\n /**\r\n * Gets or sets the minimum yaw angle that the bone can look to\r\n */\r\n get minYaw(): number {\r\n return this._minYaw;\r\n }\r\n\r\n set minYaw(value: number) {\r\n this._minYaw = value;\r\n this._minYawSin = Math.sin(value);\r\n this._minYawCos = Math.cos(value);\r\n if (this._maxYaw != null) {\r\n this._midYawConstraint = this._getAngleDiff(this._minYaw, this._maxYaw) * 0.5 + this._minYaw;\r\n this._yawRange = this._maxYaw - this._minYaw;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the maximum yaw angle that the bone can look to\r\n */\r\n get maxYaw(): number {\r\n return this._maxYaw;\r\n }\r\n\r\n set maxYaw(value: number) {\r\n this._maxYaw = value;\r\n this._maxYawSin = Math.sin(value);\r\n this._maxYawCos = Math.cos(value);\r\n if (this._minYaw != null) {\r\n this._midYawConstraint = this._getAngleDiff(this._minYaw, this._maxYaw) * 0.5 + this._minYaw;\r\n this._yawRange = this._maxYaw - this._minYaw;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the minimum pitch angle that the bone can look to\r\n */\r\n get minPitch(): number {\r\n return this._minPitch;\r\n }\r\n\r\n set minPitch(value: number) {\r\n this._minPitch = value;\r\n this._minPitchTan = Math.tan(value);\r\n }\r\n\r\n /**\r\n * Gets or sets the maximum pitch angle that the bone can look to\r\n */\r\n get maxPitch(): number {\r\n return this._maxPitch;\r\n }\r\n\r\n set maxPitch(value: number) {\r\n this._maxPitch = value;\r\n this._maxPitchTan = Math.tan(value);\r\n }\r\n\r\n /**\r\n * Create a BoneLookController\r\n * @param mesh the TransformNode that the bone belongs to\r\n * @param bone the bone that will be looking to the target\r\n * @param target the target Vector3 to look at\r\n * @param options optional settings:\r\n * * maxYaw: the maximum angle the bone will yaw to\r\n * * minYaw: the minimum angle the bone will yaw to\r\n * * maxPitch: the maximum angle the bone will pitch to\r\n * * minPitch: the minimum angle the bone will yaw to\r\n * * slerpAmount: set the between 0 and 1 to make the bone slerp to the target.\r\n * * upAxis: the up axis of the coordinate system\r\n * * upAxisSpace: the space that the up axis is in - Space.BONE, Space.LOCAL (default), or Space.WORLD.\r\n * * yawAxis: set yawAxis if the bone does not yaw on the y axis\r\n * * pitchAxis: set pitchAxis if the bone does not pitch on the x axis\r\n * * adjustYaw: used to make an adjustment to the yaw of the bone\r\n * * adjustPitch: used to make an adjustment to the pitch of the bone\r\n * * adjustRoll: used to make an adjustment to the roll of the bone\r\n * @param options.maxYaw\r\n * @param options.minYaw\r\n * @param options.maxPitch\r\n * @param options.minPitch\r\n * @param options.slerpAmount\r\n * @param options.upAxis\r\n * @param options.upAxisSpace\r\n * @param options.yawAxis\r\n * @param options.pitchAxis\r\n * @param options.adjustYaw\r\n * @param options.adjustPitch\r\n * @param options.adjustRoll\r\n **/\r\n constructor(\r\n mesh: TransformNode,\r\n bone: Bone,\r\n target: Vector3,\r\n options?: {\r\n maxYaw?: number;\r\n minYaw?: number;\r\n maxPitch?: number;\r\n minPitch?: number;\r\n slerpAmount?: number;\r\n upAxis?: Vector3;\r\n upAxisSpace?: Space;\r\n yawAxis?: Vector3;\r\n pitchAxis?: Vector3;\r\n adjustYaw?: number;\r\n adjustPitch?: number;\r\n adjustRoll?: number;\r\n }\r\n ) {\r\n this.mesh = mesh;\r\n this.bone = bone;\r\n this.target = target;\r\n\r\n if (options) {\r\n if (options.adjustYaw) {\r\n this.adjustYaw = options.adjustYaw;\r\n }\r\n\r\n if (options.adjustPitch) {\r\n this.adjustPitch = options.adjustPitch;\r\n }\r\n\r\n if (options.adjustRoll) {\r\n this.adjustRoll = options.adjustRoll;\r\n }\r\n\r\n if (options.maxYaw != null) {\r\n this.maxYaw = options.maxYaw;\r\n } else {\r\n this.maxYaw = Math.PI;\r\n }\r\n\r\n if (options.minYaw != null) {\r\n this.minYaw = options.minYaw;\r\n } else {\r\n this.minYaw = -Math.PI;\r\n }\r\n\r\n if (options.maxPitch != null) {\r\n this.maxPitch = options.maxPitch;\r\n } else {\r\n this.maxPitch = Math.PI;\r\n }\r\n\r\n if (options.minPitch != null) {\r\n this.minPitch = options.minPitch;\r\n } else {\r\n this.minPitch = -Math.PI;\r\n }\r\n\r\n if (options.slerpAmount != null) {\r\n this.slerpAmount = options.slerpAmount;\r\n }\r\n\r\n if (options.upAxis != null) {\r\n this.upAxis = options.upAxis;\r\n }\r\n\r\n if (options.upAxisSpace != null) {\r\n this.upAxisSpace = options.upAxisSpace;\r\n }\r\n\r\n if (options.yawAxis != null || options.pitchAxis != null) {\r\n let newYawAxis = Axis.Y;\r\n let newPitchAxis = Axis.X;\r\n\r\n if (options.yawAxis != null) {\r\n newYawAxis = options.yawAxis.clone();\r\n newYawAxis.normalize();\r\n }\r\n\r\n if (options.pitchAxis != null) {\r\n newPitchAxis = options.pitchAxis.clone();\r\n newPitchAxis.normalize();\r\n }\r\n\r\n const newRollAxis = Vector3.Cross(newPitchAxis, newYawAxis);\r\n\r\n this._transformYawPitch = Matrix.Identity();\r\n Matrix.FromXYZAxesToRef(newPitchAxis, newYawAxis, newRollAxis, this._transformYawPitch);\r\n\r\n this._transformYawPitchInv = this._transformYawPitch.clone();\r\n this._transformYawPitch.invert();\r\n }\r\n }\r\n\r\n if (!bone.getParent() && this.upAxisSpace == Space.BONE) {\r\n this.upAxisSpace = Space.LOCAL;\r\n }\r\n }\r\n\r\n /**\r\n * Update the bone to look at the target. This should be called before the scene is rendered (use scene.registerBeforeRender())\r\n */\r\n public update(): void {\r\n //skip the first frame when slerping so that the TransformNode rotation is correct\r\n if (this.slerpAmount < 1 && !this._firstFrameSkipped) {\r\n this._firstFrameSkipped = true;\r\n return;\r\n }\r\n\r\n const bone = this.bone;\r\n const bonePos = BoneLookController._TmpVecs[0];\r\n bone.getAbsolutePositionToRef(this.mesh, bonePos);\r\n\r\n let target = this.target;\r\n const _tmpMat1 = BoneLookController._TmpMats[0];\r\n const _tmpMat2 = BoneLookController._TmpMats[1];\r\n\r\n const mesh = this.mesh;\r\n const parentBone = bone.getParent();\r\n\r\n const upAxis = BoneLookController._TmpVecs[1];\r\n upAxis.copyFrom(this.upAxis);\r\n\r\n if (this.upAxisSpace == Space.BONE && parentBone) {\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(upAxis, this._transformYawPitchInv, upAxis);\r\n }\r\n parentBone.getDirectionToRef(upAxis, this.mesh, upAxis);\r\n } else if (this.upAxisSpace == Space.LOCAL) {\r\n mesh.getDirectionToRef(upAxis, upAxis);\r\n if (mesh.scaling.x != 1 || mesh.scaling.y != 1 || mesh.scaling.z != 1) {\r\n upAxis.normalize();\r\n }\r\n }\r\n\r\n let checkYaw = false;\r\n let checkPitch = false;\r\n\r\n if (this._maxYaw != Math.PI || this._minYaw != -Math.PI) {\r\n checkYaw = true;\r\n }\r\n if (this._maxPitch != Math.PI || this._minPitch != -Math.PI) {\r\n checkPitch = true;\r\n }\r\n\r\n if (checkYaw || checkPitch) {\r\n const spaceMat = BoneLookController._TmpMats[2];\r\n const spaceMatInv = BoneLookController._TmpMats[3];\r\n\r\n if (this.upAxisSpace == Space.BONE && upAxis.y == 1 && parentBone) {\r\n parentBone.getRotationMatrixToRef(Space.WORLD, this.mesh, spaceMat);\r\n } else if (this.upAxisSpace == Space.LOCAL && upAxis.y == 1 && !parentBone) {\r\n spaceMat.copyFrom(mesh.getWorldMatrix());\r\n } else {\r\n let forwardAxis = BoneLookController._TmpVecs[2];\r\n forwardAxis.copyFrom(this._fowardAxis);\r\n\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(forwardAxis, this._transformYawPitchInv, forwardAxis);\r\n }\r\n\r\n if (parentBone) {\r\n parentBone.getDirectionToRef(forwardAxis, this.mesh, forwardAxis);\r\n } else {\r\n mesh.getDirectionToRef(forwardAxis, forwardAxis);\r\n }\r\n\r\n const rightAxis = Vector3.Cross(upAxis, forwardAxis);\r\n rightAxis.normalize();\r\n forwardAxis = Vector3.Cross(rightAxis, upAxis);\r\n\r\n Matrix.FromXYZAxesToRef(rightAxis, upAxis, forwardAxis, spaceMat);\r\n }\r\n\r\n spaceMat.invertToRef(spaceMatInv);\r\n\r\n let xzlen: Nullable<number> = null;\r\n\r\n if (checkPitch) {\r\n const localTarget = BoneLookController._TmpVecs[3];\r\n target.subtractToRef(bonePos, localTarget);\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMatInv, localTarget);\r\n\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n const pitch = Math.atan2(localTarget.y, xzlen);\r\n let newPitch = pitch;\r\n\r\n if (pitch > this._maxPitch) {\r\n localTarget.y = this._maxPitchTan * xzlen;\r\n newPitch = this._maxPitch;\r\n } else if (pitch < this._minPitch) {\r\n localTarget.y = this._minPitchTan * xzlen;\r\n newPitch = this._minPitch;\r\n }\r\n\r\n if (pitch != newPitch) {\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMat, localTarget);\r\n localTarget.addInPlace(bonePos);\r\n target = localTarget;\r\n }\r\n }\r\n\r\n if (checkYaw) {\r\n const localTarget = BoneLookController._TmpVecs[4];\r\n target.subtractToRef(bonePos, localTarget);\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMatInv, localTarget);\r\n\r\n const yaw = Math.atan2(localTarget.x, localTarget.z);\r\n let newYaw = yaw;\r\n\r\n if (yaw > this._maxYaw || yaw < this._minYaw) {\r\n if (xzlen == null) {\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n }\r\n\r\n if (this._yawRange > Math.PI) {\r\n if (this._isAngleBetween(yaw, this._maxYaw, this._midYawConstraint)) {\r\n localTarget.z = this._maxYawCos * xzlen;\r\n localTarget.x = this._maxYawSin * xzlen;\r\n newYaw = this._maxYaw;\r\n } else if (this._isAngleBetween(yaw, this._midYawConstraint, this._minYaw)) {\r\n localTarget.z = this._minYawCos * xzlen;\r\n localTarget.x = this._minYawSin * xzlen;\r\n newYaw = this._minYaw;\r\n }\r\n } else {\r\n if (yaw > this._maxYaw) {\r\n localTarget.z = this._maxYawCos * xzlen;\r\n localTarget.x = this._maxYawSin * xzlen;\r\n newYaw = this._maxYaw;\r\n } else if (yaw < this._minYaw) {\r\n localTarget.z = this._minYawCos * xzlen;\r\n localTarget.x = this._minYawSin * xzlen;\r\n newYaw = this._minYaw;\r\n }\r\n }\r\n }\r\n\r\n if (this._slerping && this._yawRange > Math.PI) {\r\n //are we going to be crossing into the min/max region?\r\n const boneFwd = BoneLookController._TmpVecs[8];\r\n boneFwd.copyFrom(Axis.Z);\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(boneFwd, this._transformYawPitchInv, boneFwd);\r\n }\r\n\r\n const boneRotMat = BoneLookController._TmpMats[4];\r\n this._boneQuat.toRotationMatrix(boneRotMat);\r\n this.mesh.getWorldMatrix().multiplyToRef(boneRotMat, boneRotMat);\r\n Vector3.TransformCoordinatesToRef(boneFwd, boneRotMat, boneFwd);\r\n Vector3.TransformCoordinatesToRef(boneFwd, spaceMatInv, boneFwd);\r\n\r\n const boneYaw = Math.atan2(boneFwd.x, boneFwd.z);\r\n const angBtwTar = this._getAngleBetween(boneYaw, yaw);\r\n const angBtwMidYaw = this._getAngleBetween(boneYaw, this._midYawConstraint);\r\n\r\n if (angBtwTar > angBtwMidYaw) {\r\n if (xzlen == null) {\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n }\r\n\r\n const angBtwMax = this._getAngleBetween(boneYaw, this._maxYaw);\r\n const angBtwMin = this._getAngleBetween(boneYaw, this._minYaw);\r\n\r\n if (angBtwMin < angBtwMax) {\r\n newYaw = boneYaw + Math.PI * 0.75;\r\n localTarget.z = Math.cos(newYaw) * xzlen;\r\n localTarget.x = Math.sin(newYaw) * xzlen;\r\n } else {\r\n newYaw = boneYaw - Math.PI * 0.75;\r\n localTarget.z = Math.cos(newYaw) * xzlen;\r\n localTarget.x = Math.sin(newYaw) * xzlen;\r\n }\r\n }\r\n }\r\n\r\n if (yaw != newYaw) {\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMat, localTarget);\r\n localTarget.addInPlace(bonePos);\r\n target = localTarget;\r\n }\r\n }\r\n }\r\n\r\n const zaxis = BoneLookController._TmpVecs[5];\r\n const xaxis = BoneLookController._TmpVecs[6];\r\n const yaxis = BoneLookController._TmpVecs[7];\r\n const tmpQuat = BoneLookController._TmpQuat;\r\n\r\n target.subtractToRef(bonePos, zaxis);\r\n zaxis.normalize();\r\n Vector3.CrossToRef(upAxis, zaxis, xaxis);\r\n xaxis.normalize();\r\n Vector3.CrossToRef(zaxis, xaxis, yaxis);\r\n yaxis.normalize();\r\n Matrix.FromXYZAxesToRef(xaxis, yaxis, zaxis, _tmpMat1);\r\n\r\n if (xaxis.x === 0 && xaxis.y === 0 && xaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (yaxis.x === 0 && yaxis.y === 0 && yaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (zaxis.x === 0 && zaxis.y === 0 && zaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (this.adjustYaw || this.adjustPitch || this.adjustRoll) {\r\n Matrix.RotationYawPitchRollToRef(this.adjustYaw, this.adjustPitch, this.adjustRoll, _tmpMat2);\r\n _tmpMat2.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n\r\n if (this.slerpAmount < 1) {\r\n if (!this._slerping) {\r\n this.bone.getRotationQuaternionToRef(Space.WORLD, this.mesh, this._boneQuat);\r\n }\r\n if (this._transformYawPitch) {\r\n this._transformYawPitch.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n Quaternion.FromRotationMatrixToRef(_tmpMat1, tmpQuat);\r\n Quaternion.SlerpToRef(this._boneQuat, tmpQuat, this.slerpAmount, this._boneQuat);\r\n\r\n this.bone.setRotationQuaternion(this._boneQuat, Space.WORLD, this.mesh);\r\n this._slerping = true;\r\n } else {\r\n if (this._transformYawPitch) {\r\n this._transformYawPitch.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n this.bone.setRotationMatrix(_tmpMat1, Space.WORLD, this.mesh);\r\n this._slerping = false;\r\n }\r\n\r\n this._updateLinkedTransformRotation();\r\n }\r\n\r\n private _getAngleDiff(ang1: number, ang2: number): number {\r\n let angDiff = ang2 - ang1;\r\n angDiff %= Math.PI * 2;\r\n\r\n if (angDiff > Math.PI) {\r\n angDiff -= Math.PI * 2;\r\n } else if (angDiff < -Math.PI) {\r\n angDiff += Math.PI * 2;\r\n }\r\n\r\n return angDiff;\r\n }\r\n\r\n private _getAngleBetween(ang1: number, ang2: number): number {\r\n ang1 %= 2 * Math.PI;\r\n ang1 = ang1 < 0 ? ang1 + 2 * Math.PI : ang1;\r\n\r\n ang2 %= 2 * Math.PI;\r\n ang2 = ang2 < 0 ? ang2 + 2 * Math.PI : ang2;\r\n\r\n let ab = 0;\r\n\r\n if (ang1 < ang2) {\r\n ab = ang2 - ang1;\r\n } else {\r\n ab = ang1 - ang2;\r\n }\r\n\r\n if (ab > Math.PI) {\r\n ab = Math.PI * 2 - ab;\r\n }\r\n\r\n return ab;\r\n }\r\n\r\n private _isAngleBetween(ang: number, ang1: number, ang2: number): boolean {\r\n ang %= 2 * Math.PI;\r\n ang = ang < 0 ? ang + 2 * Math.PI : ang;\r\n ang1 %= 2 * Math.PI;\r\n ang1 = ang1 < 0 ? ang1 + 2 * Math.PI : ang1;\r\n ang2 %= 2 * Math.PI;\r\n ang2 = ang2 < 0 ? ang2 + 2 * Math.PI : ang2;\r\n\r\n if (ang1 < ang2) {\r\n if (ang > ang1 && ang < ang2) {\r\n return true;\r\n }\r\n } else {\r\n if (ang > ang2 && ang < ang1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _updateLinkedTransformRotation(): void {\r\n const bone = this.bone;\r\n if (bone._linkedTransformNode) {\r\n if (!bone._linkedTransformNode.rotationQuaternion) {\r\n bone._linkedTransformNode.rotationQuaternion = new Quaternion();\r\n }\r\n bone.getRotationQuaternionToRef(Space.LOCAL, null, bone._linkedTransformNode.rotationQuaternion);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"boneLookController.js","sourceRoot":"","sources":["../../../../lts/core/generated/Bones/boneLookController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Vector3, Quaternion, Matrix } from \"../Maths/math.vector\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Bone } from \"./bone\";\r\nimport { Space, Axis } from \"../Maths/math.axis\";\r\n\r\n/**\r\n * Class used to make a bone look toward a point in space\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons#bonelookcontroller\r\n */\r\nexport class BoneLookController {\r\n private static _TmpVecs: Vector3[] = ArrayTools.BuildArray(10, Vector3.Zero);\r\n private static _TmpQuat = Quaternion.Identity();\r\n private static _TmpMats: Matrix[] = ArrayTools.BuildArray(5, Matrix.Identity);\r\n\r\n /**\r\n * The target Vector3 that the bone will look at\r\n */\r\n public target: Vector3;\r\n\r\n /**\r\n * The TransformNode that the bone is attached to\r\n * Name kept as mesh for back compatibility\r\n */\r\n public mesh: TransformNode;\r\n\r\n /**\r\n * The bone that will be looking to the target\r\n */\r\n public bone: Bone;\r\n\r\n /**\r\n * The up axis of the coordinate system that is used when the bone is rotated\r\n */\r\n public upAxis: Vector3 = Vector3.Up();\r\n\r\n /**\r\n * The space that the up axis is in - Space.BONE, Space.LOCAL (default), or Space.WORLD\r\n */\r\n public upAxisSpace: Space = Space.LOCAL;\r\n\r\n /**\r\n * Used to make an adjustment to the yaw of the bone\r\n */\r\n public adjustYaw = 0;\r\n\r\n /**\r\n * Used to make an adjustment to the pitch of the bone\r\n */\r\n public adjustPitch = 0;\r\n\r\n /**\r\n * Used to make an adjustment to the roll of the bone\r\n */\r\n public adjustRoll = 0;\r\n\r\n /**\r\n * The amount to slerp (spherical linear interpolation) to the target. Set this to a value between 0 and 1 (a value of 1 disables slerp)\r\n */\r\n public slerpAmount = 1;\r\n\r\n private _minYaw: number;\r\n private _maxYaw: number;\r\n private _minPitch: number;\r\n private _maxPitch: number;\r\n private _minYawSin: number;\r\n private _minYawCos: number;\r\n private _maxYawSin: number;\r\n private _maxYawCos: number;\r\n private _midYawConstraint: number;\r\n private _minPitchTan: number;\r\n private _maxPitchTan: number;\r\n\r\n private _boneQuat: Quaternion = Quaternion.Identity();\r\n private _slerping = false;\r\n private _transformYawPitch: Matrix;\r\n private _transformYawPitchInv: Matrix;\r\n private _firstFrameSkipped = false;\r\n private _yawRange: number;\r\n private _fowardAxis: Vector3 = Vector3.Forward();\r\n\r\n /**\r\n * Gets or sets the minimum yaw angle that the bone can look to\r\n */\r\n get minYaw(): number {\r\n return this._minYaw;\r\n }\r\n\r\n set minYaw(value: number) {\r\n this._minYaw = value;\r\n this._minYawSin = Math.sin(value);\r\n this._minYawCos = Math.cos(value);\r\n if (this._maxYaw != null) {\r\n this._midYawConstraint = this._getAngleDiff(this._minYaw, this._maxYaw) * 0.5 + this._minYaw;\r\n this._yawRange = this._maxYaw - this._minYaw;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the maximum yaw angle that the bone can look to\r\n */\r\n get maxYaw(): number {\r\n return this._maxYaw;\r\n }\r\n\r\n set maxYaw(value: number) {\r\n this._maxYaw = value;\r\n this._maxYawSin = Math.sin(value);\r\n this._maxYawCos = Math.cos(value);\r\n if (this._minYaw != null) {\r\n this._midYawConstraint = this._getAngleDiff(this._minYaw, this._maxYaw) * 0.5 + this._minYaw;\r\n this._yawRange = this._maxYaw - this._minYaw;\r\n }\r\n }\r\n\r\n /**\r\n * Use the absolute value for yaw when checking the min/max constraints\r\n */\r\n public useAbsoluteValueForYaw = false;\r\n\r\n /**\r\n * Gets or sets the minimum pitch angle that the bone can look to\r\n */\r\n get minPitch(): number {\r\n return this._minPitch;\r\n }\r\n\r\n set minPitch(value: number) {\r\n this._minPitch = value;\r\n this._minPitchTan = Math.tan(value);\r\n }\r\n\r\n /**\r\n * Gets or sets the maximum pitch angle that the bone can look to\r\n */\r\n get maxPitch(): number {\r\n return this._maxPitch;\r\n }\r\n\r\n set maxPitch(value: number) {\r\n this._maxPitch = value;\r\n this._maxPitchTan = Math.tan(value);\r\n }\r\n\r\n /**\r\n * Create a BoneLookController\r\n * @param mesh the TransformNode that the bone belongs to\r\n * @param bone the bone that will be looking to the target\r\n * @param target the target Vector3 to look at\r\n * @param options optional settings:\r\n * * maxYaw: the maximum angle the bone will yaw to\r\n * * minYaw: the minimum angle the bone will yaw to\r\n * * maxPitch: the maximum angle the bone will pitch to\r\n * * minPitch: the minimum angle the bone will yaw to\r\n * * slerpAmount: set the between 0 and 1 to make the bone slerp to the target.\r\n * * upAxis: the up axis of the coordinate system\r\n * * upAxisSpace: the space that the up axis is in - Space.BONE, Space.LOCAL (default), or Space.WORLD.\r\n * * yawAxis: set yawAxis if the bone does not yaw on the y axis\r\n * * pitchAxis: set pitchAxis if the bone does not pitch on the x axis\r\n * * adjustYaw: used to make an adjustment to the yaw of the bone\r\n * * adjustPitch: used to make an adjustment to the pitch of the bone\r\n * * adjustRoll: used to make an adjustment to the roll of the bone\r\n * @param options.maxYaw\r\n * @param options.minYaw\r\n * @param options.maxPitch\r\n * @param options.minPitch\r\n * @param options.slerpAmount\r\n * @param options.upAxis\r\n * @param options.upAxisSpace\r\n * @param options.yawAxis\r\n * @param options.pitchAxis\r\n * @param options.adjustYaw\r\n * @param options.adjustPitch\r\n * @param options.adjustRoll\r\n **/\r\n constructor(\r\n mesh: TransformNode,\r\n bone: Bone,\r\n target: Vector3,\r\n options?: {\r\n maxYaw?: number;\r\n minYaw?: number;\r\n maxPitch?: number;\r\n minPitch?: number;\r\n slerpAmount?: number;\r\n upAxis?: Vector3;\r\n upAxisSpace?: Space;\r\n yawAxis?: Vector3;\r\n pitchAxis?: Vector3;\r\n adjustYaw?: number;\r\n adjustPitch?: number;\r\n adjustRoll?: number;\r\n useAbsoluteValueForYaw?: boolean;\r\n }\r\n ) {\r\n this.mesh = mesh;\r\n this.bone = bone;\r\n this.target = target;\r\n\r\n if (options) {\r\n if (options.adjustYaw) {\r\n this.adjustYaw = options.adjustYaw;\r\n }\r\n\r\n if (options.adjustPitch) {\r\n this.adjustPitch = options.adjustPitch;\r\n }\r\n\r\n if (options.adjustRoll) {\r\n this.adjustRoll = options.adjustRoll;\r\n }\r\n\r\n if (options.maxYaw != null) {\r\n this.maxYaw = options.maxYaw;\r\n } else {\r\n this.maxYaw = Math.PI;\r\n }\r\n\r\n if (options.minYaw != null) {\r\n this.minYaw = options.minYaw;\r\n } else {\r\n this.minYaw = -Math.PI;\r\n }\r\n\r\n if (options.maxPitch != null) {\r\n this.maxPitch = options.maxPitch;\r\n } else {\r\n this.maxPitch = Math.PI;\r\n }\r\n\r\n if (options.minPitch != null) {\r\n this.minPitch = options.minPitch;\r\n } else {\r\n this.minPitch = -Math.PI;\r\n }\r\n\r\n if (options.slerpAmount != null) {\r\n this.slerpAmount = options.slerpAmount;\r\n }\r\n\r\n if (options.upAxis != null) {\r\n this.upAxis = options.upAxis;\r\n }\r\n\r\n if (options.upAxisSpace != null) {\r\n this.upAxisSpace = options.upAxisSpace;\r\n }\r\n\r\n if (options.yawAxis != null || options.pitchAxis != null) {\r\n let newYawAxis = Axis.Y;\r\n let newPitchAxis = Axis.X;\r\n\r\n if (options.yawAxis != null) {\r\n newYawAxis = options.yawAxis.clone();\r\n newYawAxis.normalize();\r\n }\r\n\r\n if (options.pitchAxis != null) {\r\n newPitchAxis = options.pitchAxis.clone();\r\n newPitchAxis.normalize();\r\n }\r\n\r\n const newRollAxis = Vector3.Cross(newPitchAxis, newYawAxis);\r\n\r\n this._transformYawPitch = Matrix.Identity();\r\n Matrix.FromXYZAxesToRef(newPitchAxis, newYawAxis, newRollAxis, this._transformYawPitch);\r\n\r\n this._transformYawPitchInv = this._transformYawPitch.clone();\r\n this._transformYawPitch.invert();\r\n }\r\n\r\n if (options.useAbsoluteValueForYaw !== undefined) {\r\n this.useAbsoluteValueForYaw = options.useAbsoluteValueForYaw;\r\n }\r\n }\r\n\r\n if (!bone.getParent() && this.upAxisSpace == Space.BONE) {\r\n this.upAxisSpace = Space.LOCAL;\r\n }\r\n }\r\n\r\n /**\r\n * Update the bone to look at the target. This should be called before the scene is rendered (use scene.registerBeforeRender())\r\n */\r\n public update(): void {\r\n //skip the first frame when slerping so that the TransformNode rotation is correct\r\n if (this.slerpAmount < 1 && !this._firstFrameSkipped) {\r\n this._firstFrameSkipped = true;\r\n return;\r\n }\r\n\r\n const bone = this.bone;\r\n const bonePos = BoneLookController._TmpVecs[0];\r\n bone.getAbsolutePositionToRef(this.mesh, bonePos);\r\n\r\n let target = this.target;\r\n const _tmpMat1 = BoneLookController._TmpMats[0];\r\n const _tmpMat2 = BoneLookController._TmpMats[1];\r\n\r\n const mesh = this.mesh;\r\n const parentBone = bone.getParent();\r\n\r\n const upAxis = BoneLookController._TmpVecs[1];\r\n upAxis.copyFrom(this.upAxis);\r\n\r\n if (this.upAxisSpace == Space.BONE && parentBone) {\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(upAxis, this._transformYawPitchInv, upAxis);\r\n }\r\n parentBone.getDirectionToRef(upAxis, this.mesh, upAxis);\r\n } else if (this.upAxisSpace == Space.LOCAL) {\r\n mesh.getDirectionToRef(upAxis, upAxis);\r\n if (mesh.scaling.x != 1 || mesh.scaling.y != 1 || mesh.scaling.z != 1) {\r\n upAxis.normalize();\r\n }\r\n }\r\n\r\n let checkYaw = false;\r\n let checkPitch = false;\r\n\r\n if (this._maxYaw != Math.PI || this._minYaw != -Math.PI) {\r\n checkYaw = true;\r\n }\r\n if (this._maxPitch != Math.PI || this._minPitch != -Math.PI) {\r\n checkPitch = true;\r\n }\r\n\r\n if (checkYaw || checkPitch) {\r\n const spaceMat = BoneLookController._TmpMats[2];\r\n const spaceMatInv = BoneLookController._TmpMats[3];\r\n\r\n if (this.upAxisSpace == Space.BONE && upAxis.y == 1 && parentBone) {\r\n parentBone.getRotationMatrixToRef(Space.WORLD, this.mesh, spaceMat);\r\n } else if (this.upAxisSpace == Space.LOCAL && upAxis.y == 1 && !parentBone) {\r\n spaceMat.copyFrom(mesh.getWorldMatrix());\r\n } else {\r\n let forwardAxis = BoneLookController._TmpVecs[2];\r\n forwardAxis.copyFrom(this._fowardAxis);\r\n\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(forwardAxis, this._transformYawPitchInv, forwardAxis);\r\n }\r\n\r\n if (parentBone) {\r\n parentBone.getDirectionToRef(forwardAxis, this.mesh, forwardAxis);\r\n } else {\r\n mesh.getDirectionToRef(forwardAxis, forwardAxis);\r\n }\r\n\r\n const rightAxis = Vector3.Cross(upAxis, forwardAxis);\r\n rightAxis.normalize();\r\n forwardAxis = Vector3.Cross(rightAxis, upAxis);\r\n\r\n Matrix.FromXYZAxesToRef(rightAxis, upAxis, forwardAxis, spaceMat);\r\n }\r\n\r\n spaceMat.invertToRef(spaceMatInv);\r\n\r\n let xzlen: Nullable<number> = null;\r\n\r\n if (checkPitch) {\r\n const localTarget = BoneLookController._TmpVecs[3];\r\n target.subtractToRef(bonePos, localTarget);\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMatInv, localTarget);\r\n\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n const pitch = Math.atan2(localTarget.y, xzlen);\r\n let newPitch = pitch;\r\n\r\n if (pitch > this._maxPitch) {\r\n localTarget.y = this._maxPitchTan * xzlen;\r\n newPitch = this._maxPitch;\r\n } else if (pitch < this._minPitch) {\r\n localTarget.y = this._minPitchTan * xzlen;\r\n newPitch = this._minPitch;\r\n }\r\n\r\n if (pitch != newPitch) {\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMat, localTarget);\r\n localTarget.addInPlace(bonePos);\r\n target = localTarget;\r\n }\r\n }\r\n\r\n if (checkYaw) {\r\n const localTarget = BoneLookController._TmpVecs[4];\r\n target.subtractToRef(bonePos, localTarget);\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMatInv, localTarget);\r\n\r\n const yaw = Math.atan2(localTarget.x, localTarget.z);\r\n const yawCheck = this.useAbsoluteValueForYaw ? Math.abs(yaw) : yaw;\r\n let newYaw = yaw;\r\n\r\n if (yawCheck > this._maxYaw || yawCheck < this._minYaw) {\r\n if (xzlen == null) {\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n }\r\n\r\n if (this._yawRange > Math.PI) {\r\n if (this._isAngleBetween(yaw, this._maxYaw, this._midYawConstraint)) {\r\n localTarget.z = this._maxYawCos * xzlen;\r\n localTarget.x = this._maxYawSin * xzlen;\r\n newYaw = this._maxYaw;\r\n } else if (this._isAngleBetween(yaw, this._midYawConstraint, this._minYaw)) {\r\n localTarget.z = this._minYawCos * xzlen;\r\n localTarget.x = this._minYawSin * xzlen;\r\n newYaw = this._minYaw;\r\n }\r\n } else {\r\n if (yawCheck > this._maxYaw) {\r\n localTarget.z = this._maxYawCos * xzlen;\r\n localTarget.x = this._maxYawSin * xzlen;\r\n if (yaw < 0 && this.useAbsoluteValueForYaw) {\r\n localTarget.x *= -1;\r\n }\r\n newYaw = this._maxYaw;\r\n } else if (yawCheck < this._minYaw) {\r\n localTarget.z = this._minYawCos * xzlen;\r\n localTarget.x = this._minYawSin * xzlen;\r\n if (yaw < 0 && this.useAbsoluteValueForYaw) {\r\n localTarget.x *= -1;\r\n }\r\n newYaw = this._minYaw;\r\n }\r\n }\r\n }\r\n\r\n if (this._slerping && this._yawRange > Math.PI) {\r\n //are we going to be crossing into the min/max region?\r\n const boneFwd = BoneLookController._TmpVecs[8];\r\n boneFwd.copyFrom(Axis.Z);\r\n if (this._transformYawPitch) {\r\n Vector3.TransformCoordinatesToRef(boneFwd, this._transformYawPitchInv, boneFwd);\r\n }\r\n\r\n const boneRotMat = BoneLookController._TmpMats[4];\r\n this._boneQuat.toRotationMatrix(boneRotMat);\r\n this.mesh.getWorldMatrix().multiplyToRef(boneRotMat, boneRotMat);\r\n Vector3.TransformCoordinatesToRef(boneFwd, boneRotMat, boneFwd);\r\n Vector3.TransformCoordinatesToRef(boneFwd, spaceMatInv, boneFwd);\r\n\r\n const boneYaw = Math.atan2(boneFwd.x, boneFwd.z);\r\n const angBtwTar = this._getAngleBetween(boneYaw, yaw);\r\n const angBtwMidYaw = this._getAngleBetween(boneYaw, this._midYawConstraint);\r\n\r\n if (angBtwTar > angBtwMidYaw) {\r\n if (xzlen == null) {\r\n xzlen = Math.sqrt(localTarget.x * localTarget.x + localTarget.z * localTarget.z);\r\n }\r\n\r\n const angBtwMax = this._getAngleBetween(boneYaw, this._maxYaw);\r\n const angBtwMin = this._getAngleBetween(boneYaw, this._minYaw);\r\n\r\n if (angBtwMin < angBtwMax) {\r\n newYaw = boneYaw + Math.PI * 0.75;\r\n localTarget.z = Math.cos(newYaw) * xzlen;\r\n localTarget.x = Math.sin(newYaw) * xzlen;\r\n } else {\r\n newYaw = boneYaw - Math.PI * 0.75;\r\n localTarget.z = Math.cos(newYaw) * xzlen;\r\n localTarget.x = Math.sin(newYaw) * xzlen;\r\n }\r\n }\r\n }\r\n\r\n if (yaw != newYaw) {\r\n Vector3.TransformCoordinatesToRef(localTarget, spaceMat, localTarget);\r\n localTarget.addInPlace(bonePos);\r\n target = localTarget;\r\n }\r\n }\r\n }\r\n\r\n const zaxis = BoneLookController._TmpVecs[5];\r\n const xaxis = BoneLookController._TmpVecs[6];\r\n const yaxis = BoneLookController._TmpVecs[7];\r\n const tmpQuat = BoneLookController._TmpQuat;\r\n\r\n target.subtractToRef(bonePos, zaxis);\r\n zaxis.normalize();\r\n Vector3.CrossToRef(upAxis, zaxis, xaxis);\r\n xaxis.normalize();\r\n Vector3.CrossToRef(zaxis, xaxis, yaxis);\r\n yaxis.normalize();\r\n Matrix.FromXYZAxesToRef(xaxis, yaxis, zaxis, _tmpMat1);\r\n\r\n if (xaxis.x === 0 && xaxis.y === 0 && xaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (yaxis.x === 0 && yaxis.y === 0 && yaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (zaxis.x === 0 && zaxis.y === 0 && zaxis.z === 0) {\r\n return;\r\n }\r\n\r\n if (this.adjustYaw || this.adjustPitch || this.adjustRoll) {\r\n Matrix.RotationYawPitchRollToRef(this.adjustYaw, this.adjustPitch, this.adjustRoll, _tmpMat2);\r\n _tmpMat2.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n\r\n if (this.slerpAmount < 1) {\r\n if (!this._slerping) {\r\n this.bone.getRotationQuaternionToRef(Space.WORLD, this.mesh, this._boneQuat);\r\n }\r\n if (this._transformYawPitch) {\r\n this._transformYawPitch.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n Quaternion.FromRotationMatrixToRef(_tmpMat1, tmpQuat);\r\n Quaternion.SlerpToRef(this._boneQuat, tmpQuat, this.slerpAmount, this._boneQuat);\r\n\r\n this.bone.setRotationQuaternion(this._boneQuat, Space.WORLD, this.mesh);\r\n this._slerping = true;\r\n } else {\r\n if (this._transformYawPitch) {\r\n this._transformYawPitch.multiplyToRef(_tmpMat1, _tmpMat1);\r\n }\r\n this.bone.setRotationMatrix(_tmpMat1, Space.WORLD, this.mesh);\r\n this._slerping = false;\r\n }\r\n\r\n this._updateLinkedTransformRotation();\r\n }\r\n\r\n private _getAngleDiff(ang1: number, ang2: number): number {\r\n let angDiff = ang2 - ang1;\r\n angDiff %= Math.PI * 2;\r\n\r\n if (angDiff > Math.PI) {\r\n angDiff -= Math.PI * 2;\r\n } else if (angDiff < -Math.PI) {\r\n angDiff += Math.PI * 2;\r\n }\r\n\r\n return angDiff;\r\n }\r\n\r\n private _getAngleBetween(ang1: number, ang2: number): number {\r\n ang1 %= 2 * Math.PI;\r\n ang1 = ang1 < 0 ? ang1 + 2 * Math.PI : ang1;\r\n\r\n ang2 %= 2 * Math.PI;\r\n ang2 = ang2 < 0 ? ang2 + 2 * Math.PI : ang2;\r\n\r\n let ab = 0;\r\n\r\n if (ang1 < ang2) {\r\n ab = ang2 - ang1;\r\n } else {\r\n ab = ang1 - ang2;\r\n }\r\n\r\n if (ab > Math.PI) {\r\n ab = Math.PI * 2 - ab;\r\n }\r\n\r\n return ab;\r\n }\r\n\r\n private _isAngleBetween(ang: number, ang1: number, ang2: number): boolean {\r\n ang %= 2 * Math.PI;\r\n ang = ang < 0 ? ang + 2 * Math.PI : ang;\r\n ang1 %= 2 * Math.PI;\r\n ang1 = ang1 < 0 ? ang1 + 2 * Math.PI : ang1;\r\n ang2 %= 2 * Math.PI;\r\n ang2 = ang2 < 0 ? ang2 + 2 * Math.PI : ang2;\r\n\r\n if (ang1 < ang2) {\r\n if (ang > ang1 && ang < ang2) {\r\n return true;\r\n }\r\n } else {\r\n if (ang > ang2 && ang < ang1) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private _updateLinkedTransformRotation(): void {\r\n const bone = this.bone;\r\n if (bone._linkedTransformNode) {\r\n if (!bone._linkedTransformNode.rotationQuaternion) {\r\n bone._linkedTransformNode.rotationQuaternion = new Quaternion();\r\n }\r\n bone.getRotationQuaternionToRef(Space.LOCAL, null, bone._linkedTransformNode.rotationQuaternion);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -17,6 +17,7 @@ export interface IShaderProcessor {
|
|
|
17
17
|
attributeProcessor?: (attribute: string, preProcessors: {
|
|
18
18
|
[key: string]: string;
|
|
19
19
|
}, processingContext: Nullable<ShaderProcessingContext>) => string;
|
|
20
|
+
varyingCheck?: (varying: string, isFragment: boolean) => boolean;
|
|
20
21
|
varyingProcessor?: (varying: string, isFragment: boolean, preProcessors: {
|
|
21
22
|
[key: string]: string;
|
|
22
23
|
}, processingContext: Nullable<ShaderProcessingContext>) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iShaderProcessor.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/iShaderProcessor.ts"],"names":[],"mappings":"","sourcesContent":["import type { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"./shaderProcessingOptions\";\r\n\r\ndeclare type ThinEngine = import(\"../thinEngine\").ThinEngine;\r\n\r\n/** @internal */\r\nexport interface IShaderProcessor {\r\n shaderLanguage: ShaderLanguage;\r\n\r\n uniformRegexp?: RegExp;\r\n uniformBufferRegexp?: RegExp;\r\n textureRegexp?: RegExp;\r\n noPrecision?: boolean;\r\n parseGLES3?: boolean;\r\n\r\n attributeKeywordName?: string;\r\n varyingVertexKeywordName?: string;\r\n varyingFragmentKeywordName?: string;\r\n\r\n preProcessShaderCode?: (code: string, isFragment: boolean) => string;\r\n attributeProcessor?: (attribute: string, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n varyingProcessor?: (varying: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n uniformProcessor?: (uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n uniformBufferProcessor?: (uniformBuffer: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n textureProcessor?: (texture: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n endOfUniformBufferProcessor?: (closingBracketLine: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n lineProcessor?: (line: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n preProcessor?: (code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n postProcessor?: (code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) => string;\r\n initializeShaders?: (processingContext: Nullable<ShaderProcessingContext>) => void;\r\n finalizeShaders?: (vertexCode: string, fragmentCode: string, processingContext: Nullable<ShaderProcessingContext>) => { vertexCode: string; fragmentCode: string };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"iShaderProcessor.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/iShaderProcessor.ts"],"names":[],"mappings":"","sourcesContent":["import type { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"./shaderProcessingOptions\";\r\n\r\ndeclare type ThinEngine = import(\"../thinEngine\").ThinEngine;\r\n\r\n/** @internal */\r\nexport interface IShaderProcessor {\r\n shaderLanguage: ShaderLanguage;\r\n\r\n uniformRegexp?: RegExp;\r\n uniformBufferRegexp?: RegExp;\r\n textureRegexp?: RegExp;\r\n noPrecision?: boolean;\r\n parseGLES3?: boolean;\r\n\r\n attributeKeywordName?: string;\r\n varyingVertexKeywordName?: string;\r\n varyingFragmentKeywordName?: string;\r\n\r\n preProcessShaderCode?: (code: string, isFragment: boolean) => string;\r\n attributeProcessor?: (attribute: string, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n varyingCheck?: (varying: string, isFragment: boolean) => boolean;\r\n varyingProcessor?: (varying: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n uniformProcessor?: (uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n uniformBufferProcessor?: (uniformBuffer: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n textureProcessor?: (texture: string, isFragment: boolean, preProcessors: { [key: string]: string }, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n endOfUniformBufferProcessor?: (closingBracketLine: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n lineProcessor?: (line: string, isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n preProcessor?: (code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>) => string;\r\n postProcessor?: (code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) => string;\r\n initializeShaders?: (processingContext: Nullable<ShaderProcessingContext>) => void;\r\n finalizeShaders?: (vertexCode: string, fragmentCode: string, processingContext: Nullable<ShaderProcessingContext>) => { vertexCode: string; fragmentCode: string };\r\n}\r\n"]}
|
|
@@ -10,7 +10,7 @@ export class ShaderCodeNode {
|
|
|
10
10
|
return true;
|
|
11
11
|
}
|
|
12
12
|
process(preprocessors, options) {
|
|
13
|
-
var _a, _b, _c, _d, _e, _f;
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
14
14
|
let result = "";
|
|
15
15
|
if (this.line) {
|
|
16
16
|
let value = this.line;
|
|
@@ -29,7 +29,8 @@ export class ShaderCodeNode {
|
|
|
29
29
|
if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) {
|
|
30
30
|
value = processor.attributeProcessor(this.line, preprocessors, options.processingContext);
|
|
31
31
|
}
|
|
32
|
-
else if (processor.varyingProcessor &&
|
|
32
|
+
else if (processor.varyingProcessor &&
|
|
33
|
+
(((_g = processor.varyingCheck) === null || _g === void 0 ? void 0 : _g.call(processor, this.line, options.isFragment)) || (!processor.varyingCheck && this.line.startsWith(varyingKeyword)))) {
|
|
33
34
|
value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext);
|
|
34
35
|
}
|
|
35
36
|
else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shaderCodeNode.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/shaderCodeNode.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAChD,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C,gBAAgB;AAChB,MAAM,OAAO,cAAc;IAA3B;QAEI,aAAQ,GAAqB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"shaderCodeNode.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/shaderCodeNode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\n\r\nconst defaultAttributeKeywordName = \"attribute\";\r\nconst defaultVaryingKeywordName = \"varying\";\r\n\r\n/** @internal */\r\nexport class ShaderCodeNode {\r\n line: string;\r\n children: ShaderCodeNode[] = [];\r\n additionalDefineKey?: string;\r\n additionalDefineValue?: string;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n isValid(preprocessors: { [key: string]: string }): boolean {\r\n return true;\r\n }\r\n\r\n process(preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n let result = \"\";\r\n if (this.line) {\r\n let value: string = this.line;\r\n const processor = options.processor;\r\n if (processor) {\r\n // This must be done before other replacements to avoid mistakenly changing something that was already changed.\r\n if (processor.lineProcessor) {\r\n value = processor.lineProcessor(value, options.isFragment, options.processingContext);\r\n }\r\n\r\n const attributeKeyword = options.processor?.attributeKeywordName ?? defaultAttributeKeywordName;\r\n const varyingKeyword =\r\n options.isFragment && options.processor?.varyingFragmentKeywordName\r\n ? options.processor?.varyingFragmentKeywordName\r\n : !options.isFragment && options.processor?.varyingVertexKeywordName\r\n ? options.processor?.varyingVertexKeywordName\r\n : defaultVaryingKeywordName;\r\n\r\n if (!options.isFragment && processor.attributeProcessor && this.line.startsWith(attributeKeyword)) {\r\n value = processor.attributeProcessor(this.line, preprocessors, options.processingContext);\r\n } else if (\r\n processor.varyingProcessor &&\r\n (processor.varyingCheck?.(this.line, options.isFragment) || (!processor.varyingCheck && this.line.startsWith(varyingKeyword)))\r\n ) {\r\n value = processor.varyingProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if (processor.uniformProcessor && processor.uniformRegexp && processor.uniformRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else if (processor.uniformBufferProcessor && processor.uniformBufferRegexp && processor.uniformBufferRegexp.test(this.line)) {\r\n if (!options.lookForClosingBracketForUniformBuffer) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n } else if (processor.textureProcessor && processor.textureRegexp && processor.textureRegexp.test(this.line)) {\r\n value = processor.textureProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n } else if ((processor.uniformProcessor || processor.uniformBufferProcessor) && this.line.startsWith(\"uniform\") && !options.lookForClosingBracketForUniformBuffer) {\r\n const regex = /uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/;\r\n\r\n if (regex.test(this.line)) {\r\n // uniform\r\n if (processor.uniformProcessor) {\r\n value = processor.uniformProcessor(this.line, options.isFragment, preprocessors, options.processingContext);\r\n }\r\n } else {\r\n // Uniform buffer\r\n if (processor.uniformBufferProcessor) {\r\n value = processor.uniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n options.lookForClosingBracketForUniformBuffer = true;\r\n }\r\n }\r\n }\r\n\r\n if (options.lookForClosingBracketForUniformBuffer && this.line.indexOf(\"}\") !== -1) {\r\n options.lookForClosingBracketForUniformBuffer = false;\r\n if (processor.endOfUniformBufferProcessor) {\r\n value = processor.endOfUniformBufferProcessor(this.line, options.isFragment, options.processingContext);\r\n }\r\n }\r\n }\r\n\r\n result += value + \"\\r\\n\";\r\n }\r\n\r\n this.children.forEach((child) => {\r\n result += child.process(preprocessors, options);\r\n });\r\n\r\n if (this.additionalDefineKey) {\r\n preprocessors[this.additionalDefineKey] = this.additionalDefineValue || \"true\";\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
|
|
@@ -6,6 +6,7 @@ declare type IFileRequest = import("../../Misc/fileRequest").IFileRequest;
|
|
|
6
6
|
declare type ThinEngine = import("../thinEngine").ThinEngine;
|
|
7
7
|
/** @internal */
|
|
8
8
|
export declare class ShaderProcessor {
|
|
9
|
+
private static _MoveCursorRegex;
|
|
9
10
|
static Initialize(options: ProcessingOptions): void;
|
|
10
11
|
static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine): void;
|
|
11
12
|
static PreProcess(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine): void;
|
|
@@ -164,53 +164,53 @@ export class ShaderProcessor {
|
|
|
164
164
|
while (cursor.canRead) {
|
|
165
165
|
cursor.lineIndex++;
|
|
166
166
|
const line = cursor.currentLine;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
167
|
+
if (line.indexOf("#") >= 0) {
|
|
168
|
+
const matches = ShaderProcessor._MoveCursorRegex.exec(line);
|
|
169
|
+
if (matches && matches.length) {
|
|
170
|
+
const keyword = matches[0];
|
|
171
|
+
switch (keyword) {
|
|
172
|
+
case "#ifdef": {
|
|
173
|
+
const newRootNode = new ShaderCodeConditionNode();
|
|
174
|
+
rootNode.children.push(newRootNode);
|
|
175
|
+
const ifNode = this._BuildExpression(line, 6);
|
|
176
|
+
newRootNode.children.push(ifNode);
|
|
177
|
+
this._MoveCursorWithinIf(cursor, newRootNode, ifNode);
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
case "#else":
|
|
181
|
+
case "#elif":
|
|
182
|
+
return true;
|
|
183
|
+
case "#endif":
|
|
184
|
+
return false;
|
|
185
|
+
case "#ifndef": {
|
|
186
|
+
const newRootNode = new ShaderCodeConditionNode();
|
|
187
|
+
rootNode.children.push(newRootNode);
|
|
188
|
+
const ifNode = this._BuildExpression(line, 7);
|
|
189
|
+
newRootNode.children.push(ifNode);
|
|
190
|
+
this._MoveCursorWithinIf(cursor, newRootNode, ifNode);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case "#if": {
|
|
194
|
+
const newRootNode = new ShaderCodeConditionNode();
|
|
195
|
+
const ifNode = this._BuildExpression(line, 3);
|
|
196
|
+
rootNode.children.push(newRootNode);
|
|
197
|
+
newRootNode.children.push(ifNode);
|
|
198
|
+
this._MoveCursorWithinIf(cursor, newRootNode, ifNode);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
200
201
|
}
|
|
202
|
+
continue;
|
|
201
203
|
}
|
|
202
204
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
newNode.additionalDefineValue = split[2];
|
|
213
|
-
}
|
|
205
|
+
const newNode = new ShaderCodeNode();
|
|
206
|
+
newNode.line = line;
|
|
207
|
+
rootNode.children.push(newNode);
|
|
208
|
+
// Detect additional defines
|
|
209
|
+
if (line[0] === "#" && line[1] === "d") {
|
|
210
|
+
const split = line.replace(";", "").split(" ");
|
|
211
|
+
newNode.additionalDefineKey = split[1];
|
|
212
|
+
if (split.length === 3) {
|
|
213
|
+
newNode.additionalDefineValue = split[2];
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
}
|
|
@@ -385,4 +385,5 @@ export class ShaderProcessor {
|
|
|
385
385
|
throw _WarnImport("FileTools");
|
|
386
386
|
}
|
|
387
387
|
}
|
|
388
|
+
ShaderProcessor._MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;
|
|
388
389
|
//# sourceMappingURL=shaderProcessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shaderProcessor.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/shaderProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport { ShaderCodeCursor } from \"./shaderCodeCursor\";\r\nimport { ShaderCodeConditionNode } from \"./shaderCodeConditionNode\";\r\nimport { ShaderCodeTestNode } from \"./shaderCodeTestNode\";\r\nimport { ShaderDefineIsDefinedOperator } from \"./Expressions/Operators/shaderDefineIsDefinedOperator\";\r\nimport { ShaderDefineOrOperator } from \"./Expressions/Operators/shaderDefineOrOperator\";\r\nimport { ShaderDefineAndOperator } from \"./Expressions/Operators/shaderDefineAndOperator\";\r\nimport { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\nimport { ShaderDefineArithmeticOperator } from \"./Expressions/Operators/shaderDefineArithmeticOperator\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\ndeclare type WebRequest = import(\"../../Misc/webRequest\").WebRequest;\r\ndeclare type LoadFileError = import(\"../../Misc/fileTools\").LoadFileError;\r\ndeclare type IOfflineProvider = import(\"../../Offline/IOfflineProvider\").IOfflineProvider;\r\ndeclare type IFileRequest = import(\"../../Misc/fileRequest\").IFileRequest;\r\ndeclare type ThinEngine = import(\"../thinEngine\").ThinEngine;\r\n\r\nconst regexSE = /defined\\s*?\\((.+?)\\)/g;\r\nconst regexSERevert = /defined\\s*?\\[(.+?)\\]/g;\r\nconst regexShaderInclude = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g;\r\n\r\n/** @internal */\r\nexport class ShaderProcessor {\r\n public static Initialize(options: ProcessingOptions): void {\r\n if (options.processor && options.processor.initializeShaders) {\r\n options.processor.initializeShaders(options.processingContext);\r\n }\r\n }\r\n\r\n public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static PreProcess(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static Finalize(vertexCode: string, fragmentCode: string, options: ProcessingOptions): { vertexCode: string; fragmentCode: string } {\r\n if (!options.processor || !options.processor.finalizeShaders) {\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext);\r\n }\r\n\r\n private static _ProcessPrecision(source: string, options: ProcessingOptions): string {\r\n if (options.processor?.noPrecision) {\r\n return source;\r\n }\r\n\r\n const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader;\r\n\r\n if (source.indexOf(\"precision highp float\") === -1) {\r\n if (!shouldUseHighPrecisionShader) {\r\n source = \"precision mediump float;\\n\" + source;\r\n } else {\r\n source = \"precision highp float;\\n\" + source;\r\n }\r\n } else {\r\n if (!shouldUseHighPrecisionShader) {\r\n // Moving highp to mediump\r\n source = source.replace(\"precision highp float\", \"precision mediump float\");\r\n }\r\n }\r\n\r\n return source;\r\n }\r\n\r\n private static _ExtractOperation(expression: string) {\r\n const regex = /defined\\((.+)\\)/;\r\n\r\n const match = regex.exec(expression);\r\n\r\n if (match && match.length) {\r\n return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === \"!\");\r\n }\r\n\r\n const operators = [\"==\", \">=\", \"<=\", \"<\", \">\"];\r\n let operator = \"\";\r\n let indexOperator = 0;\r\n\r\n for (operator of operators) {\r\n indexOperator = expression.indexOf(operator);\r\n\r\n if (indexOperator > -1) {\r\n break;\r\n }\r\n }\r\n\r\n if (indexOperator === -1) {\r\n return new ShaderDefineIsDefinedOperator(expression);\r\n }\r\n\r\n const define = expression.substring(0, indexOperator).trim();\r\n const value = expression.substring(indexOperator + operator.length).trim();\r\n\r\n return new ShaderDefineArithmeticOperator(define, operator, value);\r\n }\r\n\r\n private static _BuildSubExpression(expression: string): ShaderDefineExpression {\r\n expression = expression.replace(regexSE, \"defined[$1]\");\r\n\r\n const postfix = ShaderDefineExpression.infixToPostfix(expression);\r\n\r\n const stack: (string | ShaderDefineExpression)[] = [];\r\n\r\n for (const c of postfix) {\r\n if (c !== \"||\" && c !== \"&&\") {\r\n stack.push(c);\r\n } else if (stack.length >= 2) {\r\n let v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n\r\n const operator = c == \"&&\" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator();\r\n\r\n if (typeof v1 === \"string\") {\r\n v1 = v1.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n if (typeof v2 === \"string\") {\r\n v2 = v2.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n operator.leftOperand = typeof v2 === \"string\" ? this._ExtractOperation(v2) : v2;\r\n operator.rightOperand = typeof v1 === \"string\" ? this._ExtractOperation(v1) : v1;\r\n\r\n stack.push(operator);\r\n }\r\n }\r\n\r\n let result = stack[stack.length - 1];\r\n\r\n if (typeof result === \"string\") {\r\n result = result.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n // note: stack.length !== 1 if there was an error in the parsing\r\n\r\n return typeof result === \"string\" ? this._ExtractOperation(result) : result;\r\n }\r\n\r\n private static _BuildExpression(line: string, start: number): ShaderCodeTestNode {\r\n const node = new ShaderCodeTestNode();\r\n const command = line.substring(0, start);\r\n let expression = line.substring(start);\r\n\r\n expression = expression.substring(0, (expression.indexOf(\"//\") + 1 || expression.length + 1) - 1).trim();\r\n\r\n if (command === \"#ifdef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression);\r\n } else if (command === \"#ifndef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression, true);\r\n } else {\r\n node.testExpression = this._BuildSubExpression(expression);\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private static _MoveCursorWithinIf(cursor: ShaderCodeCursor, rootNode: ShaderCodeConditionNode, ifNode: ShaderCodeNode) {\r\n let line = cursor.currentLine;\r\n while (this._MoveCursor(cursor, ifNode)) {\r\n line = cursor.currentLine;\r\n const first5 = line.substring(0, 5).toLowerCase();\r\n\r\n if (first5 === \"#else\") {\r\n const elseNode = new ShaderCodeNode();\r\n rootNode.children.push(elseNode);\r\n this._MoveCursor(cursor, elseNode);\r\n return;\r\n } else if (first5 === \"#elif\") {\r\n const elifNode = this._BuildExpression(line, 5);\r\n\r\n rootNode.children.push(elifNode);\r\n ifNode = elifNode;\r\n }\r\n }\r\n }\r\n\r\n private static _MoveCursor(cursor: ShaderCodeCursor, rootNode: ShaderCodeNode): boolean {\r\n while (cursor.canRead) {\r\n cursor.lineIndex++;\r\n const line = cursor.currentLine;\r\n const keywords = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\r\n const matches = keywords.exec(line);\r\n\r\n if (matches && matches.length) {\r\n const keyword = matches[0];\r\n\r\n switch (keyword) {\r\n case \"#ifdef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 6);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#else\":\r\n case \"#elif\":\r\n return true;\r\n case \"#endif\":\r\n return false;\r\n case \"#ifndef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 7);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#if\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n const ifNode = this._BuildExpression(line, 3);\r\n rootNode.children.push(newRootNode);\r\n\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n }\r\n } else {\r\n const newNode = new ShaderCodeNode();\r\n newNode.line = line;\r\n rootNode.children.push(newNode);\r\n\r\n // Detect additional defines\r\n if (line[0] === \"#\" && line[1] === \"d\") {\r\n const split = line.replace(\";\", \"\").split(\" \");\r\n newNode.additionalDefineKey = split[1];\r\n\r\n if (split.length === 3) {\r\n newNode.additionalDefineValue = split[2];\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private static _EvaluatePreProcessors(sourceCode: string, preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n const rootNode = new ShaderCodeNode();\r\n const cursor = new ShaderCodeCursor();\r\n\r\n cursor.lineIndex = -1;\r\n cursor.lines = sourceCode.split(\"\\n\");\r\n\r\n // Decompose (We keep it in 2 steps so it is easier to maintain and perf hit is insignificant)\r\n this._MoveCursor(cursor, rootNode);\r\n\r\n // Recompose\r\n return rootNode.process(preprocessors, options);\r\n }\r\n\r\n private static _PreparePreProcessors(options: ProcessingOptions, engine: ThinEngine): { [key: string]: string } {\r\n const defines = options.defines;\r\n const preprocessors: { [key: string]: string } = {};\r\n\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n preprocessors[split[0]] = split.length > 1 ? split[1] : \"\";\r\n }\r\n\r\n if (options.processor?.shaderLanguage === ShaderLanguage.GLSL) {\r\n preprocessors[\"GL_ES\"] = \"true\";\r\n }\r\n preprocessors[\"__VERSION__\"] = options.version;\r\n preprocessors[options.platformName] = \"true\";\r\n\r\n engine._getGlobalDefines(preprocessors);\r\n\r\n return preprocessors;\r\n }\r\n\r\n private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = this._ProcessPrecision(sourceCode, options);\r\n\r\n if (!options.processor) {\r\n return preparedSourceCode;\r\n }\r\n\r\n // Already converted\r\n if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf(\"#version 3\") !== -1) {\r\n preparedSourceCode = preparedSourceCode.replace(\"#version 300 es\", \"\");\r\n if (!options.processor.parseGLES3) {\r\n return preparedSourceCode;\r\n }\r\n }\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ApplyPreProcessing(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = sourceCode;\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor?.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor?.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ProcessIncludes(sourceCode: string, options: ProcessingOptions, callback: (data: any) => void): void {\r\n let match = regexShaderInclude.exec(sourceCode);\r\n\r\n let returnValue = new String(sourceCode);\r\n let keepProcessing = false;\r\n\r\n while (match != null) {\r\n let includeFile = match[1];\r\n\r\n // Uniform declaration\r\n if (includeFile.indexOf(\"__decl__\") !== -1) {\r\n includeFile = includeFile.replace(/__decl__/, \"\");\r\n if (options.supportsUniformBuffers) {\r\n includeFile = includeFile.replace(/Vertex/, \"Ubo\");\r\n includeFile = includeFile.replace(/Fragment/, \"Ubo\");\r\n }\r\n includeFile = includeFile + \"Declaration\";\r\n }\r\n\r\n if (options.includesShadersStore[includeFile]) {\r\n // Substitution\r\n let includeContent = options.includesShadersStore[includeFile];\r\n if (match[2]) {\r\n const splits = match[3].split(\",\");\r\n\r\n for (let index = 0; index < splits.length; index += 2) {\r\n const source = new RegExp(splits[index], \"g\");\r\n const dest = splits[index + 1];\r\n\r\n includeContent = includeContent.replace(source, dest);\r\n }\r\n }\r\n\r\n if (match[4]) {\r\n const indexString = match[5];\r\n\r\n if (indexString.indexOf(\"..\") !== -1) {\r\n const indexSplits = indexString.split(\"..\");\r\n const minIndex = parseInt(indexSplits[0]);\r\n let maxIndex = parseInt(indexSplits[1]);\r\n let sourceIncludeContent = includeContent.slice(0);\r\n includeContent = \"\";\r\n\r\n if (isNaN(maxIndex)) {\r\n maxIndex = options.indexParameters[indexSplits[1]];\r\n }\r\n\r\n for (let i = minIndex; i < maxIndex; i++) {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n sourceIncludeContent = sourceIncludeContent.replace(/light\\{X\\}.(\\w*)/g, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent += sourceIncludeContent.replace(/\\{X\\}/g, i.toString()) + \"\\n\";\r\n }\r\n } else {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n includeContent = includeContent.replace(/light\\{X\\}.(\\w*)/g, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent = includeContent.replace(/\\{X\\}/g, indexString);\r\n }\r\n }\r\n\r\n // Replace\r\n returnValue = returnValue.replace(match[0], includeContent);\r\n\r\n keepProcessing = keepProcessing || includeContent.indexOf(\"#include<\") >= 0 || includeContent.indexOf(\"#include <\") >= 0;\r\n } else {\r\n const includeShaderUrl = options.shadersRepository + \"ShadersInclude/\" + includeFile + \".fx\";\r\n\r\n ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => {\r\n options.includesShadersStore[includeFile] = fileContent as string;\r\n this._ProcessIncludes(<string>returnValue, options, callback);\r\n });\r\n return;\r\n }\r\n\r\n match = regexShaderInclude.exec(sourceCode);\r\n }\r\n\r\n if (keepProcessing) {\r\n this._ProcessIncludes(returnValue.toString(), options, callback);\r\n } else {\r\n callback(returnValue);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"shaderProcessor.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/Processors/shaderProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { ShaderCodeNode } from \"./shaderCodeNode\";\r\nimport { ShaderCodeCursor } from \"./shaderCodeCursor\";\r\nimport { ShaderCodeConditionNode } from \"./shaderCodeConditionNode\";\r\nimport { ShaderCodeTestNode } from \"./shaderCodeTestNode\";\r\nimport { ShaderDefineIsDefinedOperator } from \"./Expressions/Operators/shaderDefineIsDefinedOperator\";\r\nimport { ShaderDefineOrOperator } from \"./Expressions/Operators/shaderDefineOrOperator\";\r\nimport { ShaderDefineAndOperator } from \"./Expressions/Operators/shaderDefineAndOperator\";\r\nimport { ShaderDefineExpression } from \"./Expressions/shaderDefineExpression\";\r\nimport { ShaderDefineArithmeticOperator } from \"./Expressions/Operators/shaderDefineArithmeticOperator\";\r\nimport type { ProcessingOptions } from \"./shaderProcessingOptions\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\ndeclare type WebRequest = import(\"../../Misc/webRequest\").WebRequest;\r\ndeclare type LoadFileError = import(\"../../Misc/fileTools\").LoadFileError;\r\ndeclare type IOfflineProvider = import(\"../../Offline/IOfflineProvider\").IOfflineProvider;\r\ndeclare type IFileRequest = import(\"../../Misc/fileRequest\").IFileRequest;\r\ndeclare type ThinEngine = import(\"../thinEngine\").ThinEngine;\r\n\r\nconst regexSE = /defined\\s*?\\((.+?)\\)/g;\r\nconst regexSERevert = /defined\\s*?\\[(.+?)\\]/g;\r\nconst regexShaderInclude = /#include\\s?<(.+)>(\\((.*)\\))*(\\[(.*)\\])*/g;\r\n\r\n/** @internal */\r\nexport class ShaderProcessor {\r\n private static _MoveCursorRegex = /(#ifdef)|(#else)|(#elif)|(#endif)|(#ifndef)|(#if)/;\r\n\r\n public static Initialize(options: ProcessingOptions): void {\r\n if (options.processor && options.processor.initializeShaders) {\r\n options.processor.initializeShaders(options.processingContext);\r\n }\r\n }\r\n\r\n public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static PreProcess(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string, codeBeforeMigration: string) => void, engine: ThinEngine) {\r\n if (options.processor?.preProcessShaderCode) {\r\n sourceCode = options.processor.preProcessShaderCode(sourceCode, options.isFragment);\r\n }\r\n this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {\r\n if (options.processCodeAfterIncludes) {\r\n codeWithIncludes = options.processCodeAfterIncludes(options.isFragment ? \"fragment\" : \"vertex\", codeWithIncludes);\r\n }\r\n const migratedCode = this._ApplyPreProcessing(codeWithIncludes, options, engine);\r\n callback(migratedCode, codeWithIncludes);\r\n });\r\n }\r\n\r\n public static Finalize(vertexCode: string, fragmentCode: string, options: ProcessingOptions): { vertexCode: string; fragmentCode: string } {\r\n if (!options.processor || !options.processor.finalizeShaders) {\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n return options.processor.finalizeShaders(vertexCode, fragmentCode, options.processingContext);\r\n }\r\n\r\n private static _ProcessPrecision(source: string, options: ProcessingOptions): string {\r\n if (options.processor?.noPrecision) {\r\n return source;\r\n }\r\n\r\n const shouldUseHighPrecisionShader = options.shouldUseHighPrecisionShader;\r\n\r\n if (source.indexOf(\"precision highp float\") === -1) {\r\n if (!shouldUseHighPrecisionShader) {\r\n source = \"precision mediump float;\\n\" + source;\r\n } else {\r\n source = \"precision highp float;\\n\" + source;\r\n }\r\n } else {\r\n if (!shouldUseHighPrecisionShader) {\r\n // Moving highp to mediump\r\n source = source.replace(\"precision highp float\", \"precision mediump float\");\r\n }\r\n }\r\n\r\n return source;\r\n }\r\n\r\n private static _ExtractOperation(expression: string) {\r\n const regex = /defined\\((.+)\\)/;\r\n\r\n const match = regex.exec(expression);\r\n\r\n if (match && match.length) {\r\n return new ShaderDefineIsDefinedOperator(match[1].trim(), expression[0] === \"!\");\r\n }\r\n\r\n const operators = [\"==\", \">=\", \"<=\", \"<\", \">\"];\r\n let operator = \"\";\r\n let indexOperator = 0;\r\n\r\n for (operator of operators) {\r\n indexOperator = expression.indexOf(operator);\r\n\r\n if (indexOperator > -1) {\r\n break;\r\n }\r\n }\r\n\r\n if (indexOperator === -1) {\r\n return new ShaderDefineIsDefinedOperator(expression);\r\n }\r\n\r\n const define = expression.substring(0, indexOperator).trim();\r\n const value = expression.substring(indexOperator + operator.length).trim();\r\n\r\n return new ShaderDefineArithmeticOperator(define, operator, value);\r\n }\r\n\r\n private static _BuildSubExpression(expression: string): ShaderDefineExpression {\r\n expression = expression.replace(regexSE, \"defined[$1]\");\r\n\r\n const postfix = ShaderDefineExpression.infixToPostfix(expression);\r\n\r\n const stack: (string | ShaderDefineExpression)[] = [];\r\n\r\n for (const c of postfix) {\r\n if (c !== \"||\" && c !== \"&&\") {\r\n stack.push(c);\r\n } else if (stack.length >= 2) {\r\n let v1 = stack[stack.length - 1],\r\n v2 = stack[stack.length - 2];\r\n\r\n stack.length -= 2;\r\n\r\n const operator = c == \"&&\" ? new ShaderDefineAndOperator() : new ShaderDefineOrOperator();\r\n\r\n if (typeof v1 === \"string\") {\r\n v1 = v1.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n if (typeof v2 === \"string\") {\r\n v2 = v2.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n operator.leftOperand = typeof v2 === \"string\" ? this._ExtractOperation(v2) : v2;\r\n operator.rightOperand = typeof v1 === \"string\" ? this._ExtractOperation(v1) : v1;\r\n\r\n stack.push(operator);\r\n }\r\n }\r\n\r\n let result = stack[stack.length - 1];\r\n\r\n if (typeof result === \"string\") {\r\n result = result.replace(regexSERevert, \"defined($1)\");\r\n }\r\n\r\n // note: stack.length !== 1 if there was an error in the parsing\r\n\r\n return typeof result === \"string\" ? this._ExtractOperation(result) : result;\r\n }\r\n\r\n private static _BuildExpression(line: string, start: number): ShaderCodeTestNode {\r\n const node = new ShaderCodeTestNode();\r\n const command = line.substring(0, start);\r\n let expression = line.substring(start);\r\n\r\n expression = expression.substring(0, (expression.indexOf(\"//\") + 1 || expression.length + 1) - 1).trim();\r\n\r\n if (command === \"#ifdef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression);\r\n } else if (command === \"#ifndef\") {\r\n node.testExpression = new ShaderDefineIsDefinedOperator(expression, true);\r\n } else {\r\n node.testExpression = this._BuildSubExpression(expression);\r\n }\r\n\r\n return node;\r\n }\r\n\r\n private static _MoveCursorWithinIf(cursor: ShaderCodeCursor, rootNode: ShaderCodeConditionNode, ifNode: ShaderCodeNode) {\r\n let line = cursor.currentLine;\r\n while (this._MoveCursor(cursor, ifNode)) {\r\n line = cursor.currentLine;\r\n const first5 = line.substring(0, 5).toLowerCase();\r\n\r\n if (first5 === \"#else\") {\r\n const elseNode = new ShaderCodeNode();\r\n rootNode.children.push(elseNode);\r\n this._MoveCursor(cursor, elseNode);\r\n return;\r\n } else if (first5 === \"#elif\") {\r\n const elifNode = this._BuildExpression(line, 5);\r\n\r\n rootNode.children.push(elifNode);\r\n ifNode = elifNode;\r\n }\r\n }\r\n }\r\n\r\n private static _MoveCursor(cursor: ShaderCodeCursor, rootNode: ShaderCodeNode): boolean {\r\n while (cursor.canRead) {\r\n cursor.lineIndex++;\r\n const line = cursor.currentLine;\r\n\r\n if (line.indexOf(\"#\") >= 0) {\r\n const matches = ShaderProcessor._MoveCursorRegex.exec(line);\r\n\r\n if (matches && matches.length) {\r\n const keyword = matches[0];\r\n\r\n switch (keyword) {\r\n case \"#ifdef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 6);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#else\":\r\n case \"#elif\":\r\n return true;\r\n case \"#endif\":\r\n return false;\r\n case \"#ifndef\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n rootNode.children.push(newRootNode);\r\n\r\n const ifNode = this._BuildExpression(line, 7);\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n case \"#if\": {\r\n const newRootNode = new ShaderCodeConditionNode();\r\n const ifNode = this._BuildExpression(line, 3);\r\n rootNode.children.push(newRootNode);\r\n\r\n newRootNode.children.push(ifNode);\r\n this._MoveCursorWithinIf(cursor, newRootNode, ifNode);\r\n break;\r\n }\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n const newNode = new ShaderCodeNode();\r\n newNode.line = line;\r\n rootNode.children.push(newNode);\r\n\r\n // Detect additional defines\r\n if (line[0] === \"#\" && line[1] === \"d\") {\r\n const split = line.replace(\";\", \"\").split(\" \");\r\n newNode.additionalDefineKey = split[1];\r\n\r\n if (split.length === 3) {\r\n newNode.additionalDefineValue = split[2];\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private static _EvaluatePreProcessors(sourceCode: string, preprocessors: { [key: string]: string }, options: ProcessingOptions): string {\r\n const rootNode = new ShaderCodeNode();\r\n const cursor = new ShaderCodeCursor();\r\n\r\n cursor.lineIndex = -1;\r\n cursor.lines = sourceCode.split(\"\\n\");\r\n\r\n // Decompose (We keep it in 2 steps so it is easier to maintain and perf hit is insignificant)\r\n this._MoveCursor(cursor, rootNode);\r\n\r\n // Recompose\r\n return rootNode.process(preprocessors, options);\r\n }\r\n\r\n private static _PreparePreProcessors(options: ProcessingOptions, engine: ThinEngine): { [key: string]: string } {\r\n const defines = options.defines;\r\n const preprocessors: { [key: string]: string } = {};\r\n\r\n for (const define of defines) {\r\n const keyValue = define.replace(\"#define\", \"\").replace(\";\", \"\").trim();\r\n const split = keyValue.split(\" \");\r\n preprocessors[split[0]] = split.length > 1 ? split[1] : \"\";\r\n }\r\n\r\n if (options.processor?.shaderLanguage === ShaderLanguage.GLSL) {\r\n preprocessors[\"GL_ES\"] = \"true\";\r\n }\r\n preprocessors[\"__VERSION__\"] = options.version;\r\n preprocessors[options.platformName] = \"true\";\r\n\r\n engine._getGlobalDefines(preprocessors);\r\n\r\n return preprocessors;\r\n }\r\n\r\n private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = this._ProcessPrecision(sourceCode, options);\r\n\r\n if (!options.processor) {\r\n return preparedSourceCode;\r\n }\r\n\r\n // Already converted\r\n if (options.processor.shaderLanguage === ShaderLanguage.GLSL && preparedSourceCode.indexOf(\"#version 3\") !== -1) {\r\n preparedSourceCode = preparedSourceCode.replace(\"#version 300 es\", \"\");\r\n if (!options.processor.parseGLES3) {\r\n return preparedSourceCode;\r\n }\r\n }\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ApplyPreProcessing(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {\r\n let preparedSourceCode = sourceCode;\r\n\r\n const defines = options.defines;\r\n\r\n const preprocessors = this._PreparePreProcessors(options, engine);\r\n\r\n // General pre processing\r\n if (options.processor?.preProcessor) {\r\n preparedSourceCode = options.processor.preProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext);\r\n }\r\n\r\n preparedSourceCode = this._EvaluatePreProcessors(preparedSourceCode, preprocessors, options);\r\n\r\n // Post processing\r\n if (options.processor?.postProcessor) {\r\n preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, options.processingContext, engine);\r\n }\r\n\r\n // Inline functions tagged with #define inline\r\n if (engine._features.needShaderCodeInlining) {\r\n preparedSourceCode = engine.inlineShaderCode(preparedSourceCode);\r\n }\r\n\r\n return preparedSourceCode;\r\n }\r\n\r\n private static _ProcessIncludes(sourceCode: string, options: ProcessingOptions, callback: (data: any) => void): void {\r\n let match = regexShaderInclude.exec(sourceCode);\r\n\r\n let returnValue = new String(sourceCode);\r\n let keepProcessing = false;\r\n\r\n while (match != null) {\r\n let includeFile = match[1];\r\n\r\n // Uniform declaration\r\n if (includeFile.indexOf(\"__decl__\") !== -1) {\r\n includeFile = includeFile.replace(/__decl__/, \"\");\r\n if (options.supportsUniformBuffers) {\r\n includeFile = includeFile.replace(/Vertex/, \"Ubo\");\r\n includeFile = includeFile.replace(/Fragment/, \"Ubo\");\r\n }\r\n includeFile = includeFile + \"Declaration\";\r\n }\r\n\r\n if (options.includesShadersStore[includeFile]) {\r\n // Substitution\r\n let includeContent = options.includesShadersStore[includeFile];\r\n if (match[2]) {\r\n const splits = match[3].split(\",\");\r\n\r\n for (let index = 0; index < splits.length; index += 2) {\r\n const source = new RegExp(splits[index], \"g\");\r\n const dest = splits[index + 1];\r\n\r\n includeContent = includeContent.replace(source, dest);\r\n }\r\n }\r\n\r\n if (match[4]) {\r\n const indexString = match[5];\r\n\r\n if (indexString.indexOf(\"..\") !== -1) {\r\n const indexSplits = indexString.split(\"..\");\r\n const minIndex = parseInt(indexSplits[0]);\r\n let maxIndex = parseInt(indexSplits[1]);\r\n let sourceIncludeContent = includeContent.slice(0);\r\n includeContent = \"\";\r\n\r\n if (isNaN(maxIndex)) {\r\n maxIndex = options.indexParameters[indexSplits[1]];\r\n }\r\n\r\n for (let i = minIndex; i < maxIndex; i++) {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n sourceIncludeContent = sourceIncludeContent.replace(/light\\{X\\}.(\\w*)/g, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent += sourceIncludeContent.replace(/\\{X\\}/g, i.toString()) + \"\\n\";\r\n }\r\n } else {\r\n if (!options.supportsUniformBuffers) {\r\n // Ubo replacement\r\n includeContent = includeContent.replace(/light\\{X\\}.(\\w*)/g, (str: string, p1: string) => {\r\n return p1 + \"{X}\";\r\n });\r\n }\r\n includeContent = includeContent.replace(/\\{X\\}/g, indexString);\r\n }\r\n }\r\n\r\n // Replace\r\n returnValue = returnValue.replace(match[0], includeContent);\r\n\r\n keepProcessing = keepProcessing || includeContent.indexOf(\"#include<\") >= 0 || includeContent.indexOf(\"#include <\") >= 0;\r\n } else {\r\n const includeShaderUrl = options.shadersRepository + \"ShadersInclude/\" + includeFile + \".fx\";\r\n\r\n ShaderProcessor._FileToolsLoadFile(includeShaderUrl, (fileContent) => {\r\n options.includesShadersStore[includeFile] = fileContent as string;\r\n this._ProcessIncludes(<string>returnValue, options, callback);\r\n });\r\n return;\r\n }\r\n\r\n match = regexShaderInclude.exec(sourceCode);\r\n }\r\n\r\n if (keepProcessing) {\r\n this._ProcessIncludes(returnValue.toString(), options, callback);\r\n } else {\r\n callback(returnValue);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @internal\r\n */\r\n public static _FileToolsLoadFile(\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void\r\n ): IFileRequest {\r\n throw _WarnImport(\"FileTools\");\r\n }\r\n}\r\n"]}
|
|
@@ -4,6 +4,7 @@ import type { IShaderProcessor } from "../Processors/iShaderProcessor";
|
|
|
4
4
|
export declare class WebGL2ShaderProcessor implements IShaderProcessor {
|
|
5
5
|
shaderLanguage: ShaderLanguage;
|
|
6
6
|
attributeProcessor(attribute: string): string;
|
|
7
|
+
varyingCheck(varying: string, _isFragment: boolean): boolean;
|
|
7
8
|
varyingProcessor(varying: string, isFragment: boolean): string;
|
|
8
9
|
postProcessor(code: string, defines: string[], isFragment: boolean): string;
|
|
9
10
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ShaderLanguage } from "../../Materials/shaderLanguage.js";
|
|
2
|
+
const varyingRegex = /(flat\s)?\s*varying\s*.*/;
|
|
2
3
|
/** @internal */
|
|
3
4
|
export class WebGL2ShaderProcessor {
|
|
4
5
|
constructor() {
|
|
@@ -7,6 +8,9 @@ export class WebGL2ShaderProcessor {
|
|
|
7
8
|
attributeProcessor(attribute) {
|
|
8
9
|
return attribute.replace("attribute", "in");
|
|
9
10
|
}
|
|
11
|
+
varyingCheck(varying, _isFragment) {
|
|
12
|
+
return varyingRegex.test(varying);
|
|
13
|
+
}
|
|
10
14
|
varyingProcessor(varying, isFragment) {
|
|
11
15
|
return varying.replace("varying", isFragment ? "in" : "out");
|
|
12
16
|
}
|