@babylonjs/core 6.2.0 → 6.3.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/Engines/WebGPU/webgpuHardwareTexture.js +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/thinEngine.js +21 -4
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -6
- package/Engines/webgpuEngine.js.map +1 -1
- package/Gizmos/gizmo.js +1 -0
- package/Gizmos/gizmo.js.map +1 -1
- package/Materials/Node/Blocks/PBR/refractionBlock.js +2 -2
- package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.d.ts +4 -0
- package/Materials/Node/Blocks/triPlanarBlock.js +44 -6
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/PBR/pbrMaterial.d.ts +2 -1
- package/Materials/PBR/pbrMaterial.js +3 -2
- package/Materials/PBR/pbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +2 -2
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +6 -0
- package/Materials/Textures/baseTexture.js +8 -0
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/cubeTexture.d.ts +7 -0
- package/Materials/Textures/cubeTexture.js +25 -2
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/standardMaterial.d.ts +2 -1
- package/Materials/standardMaterial.js +3 -2
- package/Materials/standardMaterial.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.d.ts +4 -0
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +19 -4
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/decorators.d.ts +5 -1
- package/Misc/decorators.js +12 -4
- package/Misc/decorators.js.map +1 -1
- package/Misc/error.d.ts +1 -1
- package/Misc/error.js.map +1 -1
- package/Misc/tools.d.ts +6 -6
- package/Misc/tools.js +17 -14
- package/Misc/tools.js.map +1 -1
- package/Physics/physicsRaycastResult.js +6 -6
- package/Physics/physicsRaycastResult.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +2 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +16 -1
- package/Physics/v2/Plugins/havokPlugin.js +43 -3
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsAggregate.d.ts +0 -50
- package/Physics/v2/physicsAggregate.js +3 -2
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/Physics/v2/physicsBody.d.ts +12 -0
- package/Physics/v2/physicsBody.js +17 -1
- package/Physics/v2/physicsBody.js.map +1 -1
- package/assetContainer.d.ts +2 -3
- package/assetContainer.js +13 -4
- package/assetContainer.js.map +1 -1
- package/node.d.ts +8 -0
- package/node.js +23 -1
- package/node.js.map +1 -1
- package/package.json +1 -1
package/Gizmos/gizmo.js
CHANGED
|
@@ -277,6 +277,7 @@ export class Gizmo {
|
|
|
277
277
|
else {
|
|
278
278
|
this._attachedNode._worldMatrix.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, Gizmo.PreserveScaling ? transform : undefined);
|
|
279
279
|
}
|
|
280
|
+
TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);
|
|
280
281
|
transform.scaling.copyFrom(TmpVectors.Vector3[0]);
|
|
281
282
|
if (!transform.billboardMode) {
|
|
282
283
|
if (transform.rotationQuaternion) {
|
package/Gizmos/gizmo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../lts/core/generated/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { WebVRFreeCamera } from \"../Cameras/VR/webVRCamera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable<AbstractMesh>;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable<Node>;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable<Quaternion>;\r\n /** Disposes and replaces the current meshes in the gizmo with the specified mesh */\r\n setCustomMesh(mesh: Mesh): void;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _customRotationQuaternion: Nullable<Quaternion> = null;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _updateScale = true;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n protected _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n let cameraPosition = activeCamera.globalPosition;\r\n if ((<WebVRFreeCamera>activeCamera).devicePosition) {\r\n cameraPosition = (<WebVRFreeCamera>activeCamera).devicePosition;\r\n }\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle position/translation when using an attached node using pivot\r\n */\r\n protected _handlePivot() {\r\n const attachedNodeTransform = this._attachedNode as any;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n localMat.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n }\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n bone.getWorldMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getWorldMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../lts/core/generated/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { WebVRFreeCamera } from \"../Cameras/VR/webVRCamera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable<AbstractMesh>;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable<Node>;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable<Quaternion>;\r\n /** Disposes and replaces the current meshes in the gizmo with the specified mesh */\r\n setCustomMesh(mesh: Mesh): void;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _customRotationQuaternion: Nullable<Quaternion> = null;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _updateScale = true;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n protected _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n let cameraPosition = activeCamera.globalPosition;\r\n if ((<WebVRFreeCamera>activeCamera).devicePosition) {\r\n cameraPosition = (<WebVRFreeCamera>activeCamera).devicePosition;\r\n }\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle position/translation when using an attached node using pivot\r\n */\r\n protected _handlePivot() {\r\n const attachedNodeTransform = this._attachedNode as any;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n localMat.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(TmpVectors.Vector3[0], TmpVectors.Quaternion[0], transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n }\r\n TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n bone.getWorldMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getWorldMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -123,7 +123,7 @@ export class RefractionBlock extends NodeMaterialBlock {
|
|
|
123
123
|
defines.setValue(this._define3DName, refractionTexture.isCube, true);
|
|
124
124
|
defines.setValue(this._defineLODRefractionAlpha, refractionTexture.lodLevelInAlpha, true);
|
|
125
125
|
defines.setValue(this._defineLinearSpecularRefraction, refractionTexture.linearSpecularLOD, true);
|
|
126
|
-
defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem ? !refractionTexture.invertZ : refractionTexture.invertZ, true);
|
|
126
|
+
defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem && refractionTexture.isCube ? !refractionTexture.invertZ : refractionTexture.invertZ, true);
|
|
127
127
|
defines.setValue("SS_LINKREFRACTIONTOTRANSPARENCY", this.linkRefractionWithTransparency, true);
|
|
128
128
|
defines.setValue("SS_GAMMAREFRACTION", refractionTexture.gammaSpace, true);
|
|
129
129
|
defines.setValue("SS_RGBDREFRACTION", refractionTexture.isRGBD, true);
|
|
@@ -150,7 +150,7 @@ export class RefractionBlock extends NodeMaterialBlock {
|
|
|
150
150
|
else {
|
|
151
151
|
effect.setTexture(this._2DSamplerName, refractionTexture);
|
|
152
152
|
}
|
|
153
|
-
effect.setMatrix(this._refractionMatrixName, refractionTexture.
|
|
153
|
+
effect.setMatrix(this._refractionMatrixName, refractionTexture.getRefractionTextureMatrix());
|
|
154
154
|
let depth = 1.0;
|
|
155
155
|
if (!refractionTexture.isCube) {
|
|
156
156
|
if (refractionTexture.depth) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refractionBlock.js","sourceRoot":"","sources":["../../../../../../../lts/core/generated/Materials/Node/Blocks/PBR/refractionBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../nodeMaterialDecorator\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { CubeTexture } from \"../../../Textures/cubeTexture\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport { Scalar } from \"../../../../Maths/math.scalar\";\r\n\r\n/**\r\n * Block used to implement the refraction part of the sub surface module of the PBR material\r\n */\r\nexport class RefractionBlock extends NodeMaterialBlock {\r\n /** @internal */\r\n public _define3DName: string;\r\n /** @internal */\r\n public _refractionMatrixName: string;\r\n /** @internal */\r\n public _defineLODRefractionAlpha: string;\r\n /** @internal */\r\n public _defineLinearSpecularRefraction: string;\r\n /** @internal */\r\n public _defineOppositeZ: string;\r\n /** @internal */\r\n public _cubeSamplerName: string;\r\n /** @internal */\r\n public _2DSamplerName: string;\r\n /** @internal */\r\n public _vRefractionMicrosurfaceInfosName: string;\r\n /** @internal */\r\n public _vRefractionInfosName: string;\r\n /** @internal */\r\n public _vRefractionFilteringInfoName: string;\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * The properties below are set by the main PBR block prior to calling methods of this class.\r\n * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.\r\n * It's less burden on the user side in the editor part.\r\n */\r\n\r\n /** @internal */\r\n public viewConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /** @internal */\r\n public indexOfRefractionConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n @editableInPropertyPage(\"Link refraction to transparency\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public linkRefractionWithTransparency: boolean = false;\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @editableInPropertyPage(\"Invert refraction Y\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public invertRefractionY: boolean = false;\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @editableInPropertyPage(\"Use thickness as depth\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public useThicknessAsDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Create a new RefractionBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"intensity\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"tintAtDistance\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"volumeIndexOfRefraction\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"refraction\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"refraction\", this, NodeMaterialConnectionPointDirection.Output, RefractionBlock, \"RefractionBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"vRefractionPosition\");\r\n state._excludeVariableName(\"vRefractionSize\");\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"RefractionBlock\";\r\n }\r\n\r\n /**\r\n * Gets the intensity input component\r\n */\r\n public get intensity(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tint at distance input component\r\n */\r\n public get tintAtDistance(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the volume index of refraction input component\r\n */\r\n public get volumeIndexOfRefraction(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the view input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this.viewConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the refraction object output component\r\n */\r\n public get refraction(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Returns true if the block has a texture\r\n */\r\n public get hasTexture(): boolean {\r\n return !!this._getTexture();\r\n }\r\n\r\n protected _getTexture(): Nullable<BaseTexture> {\r\n if (this.texture) {\r\n return this.texture;\r\n }\r\n\r\n return this._scene.environmentTexture;\r\n }\r\n\r\n public autoConfigure(material: NodeMaterial) {\r\n if (!this.intensity.isConnected) {\r\n const intensityInput = new InputBlock(\"Refraction intensity\", NodeMaterialBlockTargets.Fragment, NodeMaterialBlockConnectionPointTypes.Float);\r\n intensityInput.value = 1;\r\n intensityInput.output.connectTo(this.intensity);\r\n }\r\n\r\n if (this.view && !this.view.isConnected) {\r\n let viewInput = material.getInputBlockByPredicate((b) => b.systemValue === NodeMaterialSystemValues.View);\r\n\r\n if (!viewInput) {\r\n viewInput = new InputBlock(\"view\");\r\n viewInput.setAsSystemValue(NodeMaterialSystemValues.View);\r\n }\r\n viewInput.output.connectTo(this.view);\r\n }\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const refractionTexture = this._getTexture();\r\n const refraction = refractionTexture && refractionTexture.getTextureMatrix;\r\n\r\n defines.setValue(\"SS_REFRACTION\", refraction, true);\r\n\r\n if (!refraction) {\r\n return;\r\n }\r\n\r\n defines.setValue(this._define3DName, refractionTexture!.isCube, true);\r\n defines.setValue(this._defineLODRefractionAlpha, refractionTexture!.lodLevelInAlpha, true);\r\n defines.setValue(this._defineLinearSpecularRefraction, refractionTexture!.linearSpecularLOD, true);\r\n defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem ? !refractionTexture!.invertZ : refractionTexture!.invertZ, true);\r\n\r\n defines.setValue(\"SS_LINKREFRACTIONTOTRANSPARENCY\", this.linkRefractionWithTransparency, true);\r\n defines.setValue(\"SS_GAMMAREFRACTION\", refractionTexture!.gammaSpace, true);\r\n defines.setValue(\"SS_RGBDREFRACTION\", refractionTexture!.isRGBD, true);\r\n defines.setValue(\"SS_USE_LOCAL_REFRACTIONMAP_CUBIC\", (<any>refractionTexture).boundingBoxSize ? true : false, true);\r\n defines.setValue(\"SS_USE_THICKNESS_AS_DEPTH\", this.useThicknessAsDepth, true);\r\n }\r\n\r\n public isReady() {\r\n const texture = this._getTexture();\r\n\r\n if (texture && !texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n super.bind(effect, nodeMaterial, mesh);\r\n\r\n const refractionTexture = this._getTexture();\r\n\r\n if (!refractionTexture) {\r\n return;\r\n }\r\n\r\n if (refractionTexture.isCube) {\r\n effect.setTexture(this._cubeSamplerName, refractionTexture);\r\n } else {\r\n effect.setTexture(this._2DSamplerName, refractionTexture);\r\n }\r\n\r\n effect.setMatrix(this._refractionMatrixName, refractionTexture.getReflectionTextureMatrix());\r\n\r\n let depth = 1.0;\r\n if (!refractionTexture.isCube) {\r\n if ((<any>refractionTexture).depth) {\r\n depth = (<any>refractionTexture).depth;\r\n }\r\n }\r\n\r\n const indexOfRefraction = this.volumeIndexOfRefraction.connectInputBlock?.value ?? this.indexOfRefractionConnectionPoint.connectInputBlock?.value ?? 1.5;\r\n\r\n effect.setFloat4(this._vRefractionInfosName, refractionTexture.level, 1 / indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);\r\n\r\n effect.setFloat4(\r\n this._vRefractionMicrosurfaceInfosName,\r\n refractionTexture.getSize().width,\r\n refractionTexture.lodGenerationScale,\r\n refractionTexture.lodGenerationOffset,\r\n 1 / indexOfRefraction\r\n );\r\n\r\n const width = refractionTexture.getSize().width;\r\n\r\n effect.setFloat2(this._vRefractionFilteringInfoName, width, Scalar.Log2(width));\r\n\r\n if ((<any>refractionTexture).boundingBoxSize) {\r\n const cubeTexture = <CubeTexture>refractionTexture;\r\n effect.setVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n effect.setVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @returns the shader code\r\n */\r\n public getCode(state: NodeMaterialBuildState): string {\r\n const code = \"\";\r\n\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n\r\n // Samplers\r\n this._cubeSamplerName = state._getFreeVariableName(this.name + \"CubeSampler\");\r\n state.samplers.push(this._cubeSamplerName);\r\n\r\n this._2DSamplerName = state._getFreeVariableName(this.name + \"2DSampler\");\r\n state.samplers.push(this._2DSamplerName);\r\n\r\n this._define3DName = state._getFreeDefineName(\"SS_REFRACTIONMAP_3D\");\r\n\r\n state._samplerDeclaration += `#ifdef ${this._define3DName}\\r\\n`;\r\n state._samplerDeclaration += `uniform samplerCube ${this._cubeSamplerName};\\r\\n`;\r\n state._samplerDeclaration += `#else\\r\\n`;\r\n state._samplerDeclaration += `uniform sampler2D ${this._2DSamplerName};\\r\\n`;\r\n state._samplerDeclaration += `#endif\\r\\n`;\r\n\r\n // Fragment\r\n state.sharedData.blocksWithDefines.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n this._defineLODRefractionAlpha = state._getFreeDefineName(\"SS_LODINREFRACTIONALPHA\");\r\n this._defineLinearSpecularRefraction = state._getFreeDefineName(\"SS_LINEARSPECULARREFRACTION\");\r\n this._defineOppositeZ = state._getFreeDefineName(\"SS_REFRACTIONMAP_OPPOSITEZ\");\r\n\r\n this._refractionMatrixName = state._getFreeVariableName(\"refractionMatrix\");\r\n\r\n state._emitUniformFromString(this._refractionMatrixName, \"mat4\");\r\n\r\n state._emitFunction(\r\n \"sampleRefraction\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleRefraction(s, c) textureCube(s, c)\r\n #else\r\n #define sampleRefraction(s, c) texture2D(s, c)\r\n #endif\\r\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n state._emitFunction(\r\n \"sampleRefractionLod\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleRefractionLod(s, c, l) textureCubeLodEXT(s, c, l)\r\n #else\r\n #define sampleRefractionLod(s, c, l) texture2DLodEXT(s, c, l)\r\n #endif\\r\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n this._vRefractionMicrosurfaceInfosName = state._getFreeVariableName(\"vRefractionMicrosurfaceInfos\");\r\n\r\n state._emitUniformFromString(this._vRefractionMicrosurfaceInfosName, \"vec4\");\r\n\r\n this._vRefractionInfosName = state._getFreeVariableName(\"vRefractionInfos\");\r\n\r\n state._emitUniformFromString(this._vRefractionInfosName, \"vec4\");\r\n\r\n this._vRefractionFilteringInfoName = state._getFreeVariableName(\"vRefractionFilteringInfo\");\r\n\r\n state._emitUniformFromString(this._vRefractionFilteringInfoName, \"vec2\");\r\n\r\n state._emitUniformFromString(\"vRefractionPosition\", \"vec3\");\r\n state._emitUniformFromString(\"vRefractionSize\", \"vec3\");\r\n\r\n return code;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n this._scene = state.sharedData.scene;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n if (this.texture) {\r\n if (this.texture.isCube) {\r\n codeString = `${this._codeVariableName}.texture = new BABYLON.CubeTexture(\"${this.texture.name}\");\\r\\n`;\r\n } else {\r\n codeString = `${this._codeVariableName}.texture = new BABYLON.Texture(\"${this.texture.name}\");\\r\\n`;\r\n }\r\n codeString += `${this._codeVariableName}.texture.coordinatesMode = ${this.texture.coordinatesMode};\\r\\n`;\r\n }\r\n\r\n codeString += `${this._codeVariableName}.linkRefractionWithTransparency = ${this.linkRefractionWithTransparency};\\r\\n`;\r\n codeString += `${this._codeVariableName}.invertRefractionY = ${this.invertRefractionY};\\r\\n`;\r\n codeString += `${this._codeVariableName}.useThicknessAsDepth = ${this.useThicknessAsDepth};\\r\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n serializationObject.linkRefractionWithTransparency = this.linkRefractionWithTransparency;\r\n serializationObject.invertRefractionY = this.invertRefractionY;\r\n serializationObject.useThicknessAsDepth = this.useThicknessAsDepth;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n if (serializationObject.texture.isCube) {\r\n this.texture = CubeTexture.Parse(serializationObject.texture, scene, rootUrl);\r\n } else {\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl);\r\n }\r\n }\r\n\r\n this.linkRefractionWithTransparency = serializationObject.linkRefractionWithTransparency;\r\n this.invertRefractionY = serializationObject.invertRefractionY;\r\n this.useThicknessAsDepth = !!serializationObject.useThicknessAsDepth;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.RefractionBlock\", RefractionBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"refractionBlock.js","sourceRoot":"","sources":["../../../../../../../lts/core/generated/Materials/Node/Blocks/PBR/refractionBlock.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAG1G,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,uCAAuC,EAAE,MAAM,+CAA+C,CAAC;AAMxG,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IA4DlD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QA7BnD;;;WAGG;QAEI,mCAA8B,GAAY,KAAK,CAAC;QAEvD;;WAEG;QAEI,sBAAiB,GAAY,KAAK,CAAC;QAE1C;;WAEG;QAEI,wBAAmB,GAAY,KAAK,CAAC;QAcxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,qCAAqC,CAAC,KAAK,EAAE,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACvH,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,KAAK,EAAE,IAAI,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAC3H,IAAI,CAAC,aAAa,CAAC,yBAAyB,EAAE,qCAAqC,CAAC,KAAK,EAAE,IAAI,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAEpI,IAAI,CAAC,cAAc,CACf,YAAY,EACZ,qCAAqC,CAAC,MAAM,EAC5C,wBAAwB,CAAC,QAAQ,EACjC,IAAI,uCAAuC,CAAC,YAAY,EAAE,IAAI,EAAE,oCAAoC,CAAC,MAAM,EAAE,eAAe,EAAE,iBAAiB,CAAC,CACnJ,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,UAAU,CAAC,KAA6B;QAC3C,KAAK,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;QAClD,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAES,WAAW;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,OAAO,IAAI,CAAC,OAAO,CAAC;SACvB;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;IAC1C,CAAC;IAEM,aAAa,CAAC,QAAsB;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;YAC7B,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,QAAQ,EAAE,qCAAqC,CAAC,KAAK,CAAC,CAAC;YAC9I,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnD;QAED,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrC,IAAI,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAE1G,IAAI,CAAC,SAAS,EAAE;gBACZ,SAAS,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;gBACnC,SAAS,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;aAC7D;YACD,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzC;IACL,CAAC;IAEM,cAAc,CAAC,IAAkB,EAAE,YAA0B,EAAE,OAA4B;QAC9F,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,iBAAiB,IAAI,iBAAiB,CAAC,gBAAgB,CAAC;QAE3E,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAEpD,IAAI,CAAC,UAAU,EAAE;YACb,OAAO;SACV;QAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE,iBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC3F,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,EAAE,iBAAkB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACnG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvK,OAAO,CAAC,QAAQ,CAAC,iCAAiC,EAAE,IAAI,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAC;QAC/F,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,iBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,EAAE,iBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,CAAC,kCAAkC,EAAQ,iBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpH,OAAO,CAAC,QAAQ,CAAC,2BAA2B,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;IAEM,OAAO;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE;YAC5C,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,IAAI,CAAC,MAAc,EAAE,YAA0B,EAAE,IAAW;;QAC/D,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAEvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,CAAC,iBAAiB,EAAE;YACpB,OAAO;SACV;QAED,IAAI,iBAAiB,CAAC,MAAM,EAAE;YAC1B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;SAC/D;aAAM;YACH,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;SAC7D;QAED,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAE7F,IAAI,KAAK,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;YAC3B,IAAU,iBAAkB,CAAC,KAAK,EAAE;gBAChC,KAAK,GAAS,iBAAkB,CAAC,KAAK,CAAC;aAC1C;SACJ;QAED,MAAM,iBAAiB,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,uBAAuB,CAAC,iBAAiB,0CAAE,KAAK,mCAAI,MAAA,IAAI,CAAC,gCAAgC,CAAC,iBAAiB,0CAAE,KAAK,mCAAI,GAAG,CAAC;QAEzJ,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAG,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErI,MAAM,CAAC,SAAS,CACZ,IAAI,CAAC,iCAAiC,EACtC,iBAAiB,CAAC,OAAO,EAAE,CAAC,KAAK,EACjC,iBAAiB,CAAC,kBAAkB,EACpC,iBAAiB,CAAC,mBAAmB,EACrC,CAAC,GAAG,iBAAiB,CACxB,CAAC;QAEF,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QAEhD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,6BAA6B,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEhF,IAAU,iBAAkB,CAAC,eAAe,EAAE;YAC1C,MAAM,WAAW,GAAgB,iBAAiB,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC;YAC1E,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;SACrE;IACL,CAAC;IAED;;;;OAIG;IACI,OAAO,CAAC,KAA6B;QACxC,MAAM,IAAI,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1C,WAAW;QACX,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;QAC9E,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE3C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;QAC1E,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEzC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;QAErE,KAAK,CAAC,mBAAmB,IAAI,UAAU,IAAI,CAAC,aAAa,MAAM,CAAC;QAChE,KAAK,CAAC,mBAAmB,IAAI,uBAAuB,IAAI,CAAC,gBAAgB,OAAO,CAAC;QACjF,KAAK,CAAC,mBAAmB,IAAI,WAAW,CAAC;QACzC,KAAK,CAAC,mBAAmB,IAAI,qBAAqB,IAAI,CAAC,cAAc,OAAO,CAAC;QAC7E,KAAK,CAAC,mBAAmB,IAAI,YAAY,CAAC;QAE1C,WAAW;QACX,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;QACrF,IAAI,CAAC,+BAA+B,GAAG,KAAK,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;QAC/F,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,CAAC;QAE/E,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QAE5E,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAEjE,KAAK,CAAC,aAAa,CACf,kBAAkB,EAClB;qBACS,IAAI,CAAC,aAAa;;;;uBAIhB,EACX,KAAK,IAAI,CAAC,IAAI,EAAE,CACnB,CAAC;QAEF,KAAK,CAAC,aAAa,CACf,qBAAqB,EACrB;qBACS,IAAI,CAAC,aAAa;;;;uBAIhB,EACX,KAAK,IAAI,CAAC,IAAI,EAAE,CACnB,CAAC;QAEF,IAAI,CAAC,iCAAiC,GAAG,KAAK,CAAC,oBAAoB,CAAC,8BAA8B,CAAC,CAAC;QAEpG,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC;QAE7E,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QAE5E,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAEjE,IAAI,CAAC,6BAA6B,GAAG,KAAK,CAAC,oBAAoB,CAAC,0BAA0B,CAAC,CAAC;QAE5F,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC;QAEzE,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC5D,KAAK,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC;IAChB,CAAC;IAES,WAAW,CAAC,KAA6B;QAC/C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAErC,OAAO,IAAI,CAAC;IAChB,CAAC;IAES,mBAAmB;QACzB,IAAI,UAAU,GAAG,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAE7C,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACrB,UAAU,GAAG,GAAG,IAAI,CAAC,iBAAiB,uCAAuC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;aAC3G;iBAAM;gBACH,UAAU,GAAG,GAAG,IAAI,CAAC,iBAAiB,mCAAmC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;aACvG;YACD,UAAU,IAAI,GAAG,IAAI,CAAC,iBAAiB,8BAA8B,IAAI,CAAC,OAAO,CAAC,eAAe,OAAO,CAAC;SAC5G;QAED,UAAU,IAAI,GAAG,IAAI,CAAC,iBAAiB,qCAAqC,IAAI,CAAC,8BAA8B,OAAO,CAAC;QACvH,UAAU,IAAI,GAAG,IAAI,CAAC,iBAAiB,wBAAwB,IAAI,CAAC,iBAAiB,OAAO,CAAC;QAC7F,UAAU,IAAI,GAAG,IAAI,CAAC,iBAAiB,0BAA0B,IAAI,CAAC,mBAAmB,OAAO,CAAC;QAEjG,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,SAAS;QACZ,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAC9C,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;SAC1D;QAED,mBAAmB,CAAC,8BAA8B,GAAG,IAAI,CAAC,8BAA8B,CAAC;QACzF,mBAAmB,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC/D,mBAAmB,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAEnE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAEM,YAAY,CAAC,mBAAwB,EAAE,KAAY,EAAE,OAAe;QACvE,KAAK,CAAC,YAAY,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAExD,IAAI,mBAAmB,CAAC,OAAO,EAAE;YAC7B,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAChF,IAAI,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE;gBACpC,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;aACjF;iBAAM;gBACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;aAC7E;SACJ;QAED,IAAI,CAAC,8BAA8B,GAAG,mBAAmB,CAAC,8BAA8B,CAAC;QACzF,IAAI,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,iBAAiB,CAAC;QAC/D,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;IACzE,CAAC;CACJ;AAnVG;IADC,sBAAsB,CAAC,iCAAiC,EAAE,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;uEAChF;AAMvD;IADC,sBAAsB,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;0DACjF;AAM1C;IADC,sBAAsB,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;4DAClF;AAyUhD,aAAa,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../nodeMaterialDecorator\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { CubeTexture } from \"../../../Textures/cubeTexture\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport { Scalar } from \"../../../../Maths/math.scalar\";\r\n\r\n/**\r\n * Block used to implement the refraction part of the sub surface module of the PBR material\r\n */\r\nexport class RefractionBlock extends NodeMaterialBlock {\r\n /** @internal */\r\n public _define3DName: string;\r\n /** @internal */\r\n public _refractionMatrixName: string;\r\n /** @internal */\r\n public _defineLODRefractionAlpha: string;\r\n /** @internal */\r\n public _defineLinearSpecularRefraction: string;\r\n /** @internal */\r\n public _defineOppositeZ: string;\r\n /** @internal */\r\n public _cubeSamplerName: string;\r\n /** @internal */\r\n public _2DSamplerName: string;\r\n /** @internal */\r\n public _vRefractionMicrosurfaceInfosName: string;\r\n /** @internal */\r\n public _vRefractionInfosName: string;\r\n /** @internal */\r\n public _vRefractionFilteringInfoName: string;\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * The properties below are set by the main PBR block prior to calling methods of this class.\r\n * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.\r\n * It's less burden on the user side in the editor part.\r\n */\r\n\r\n /** @internal */\r\n public viewConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /** @internal */\r\n public indexOfRefractionConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n @editableInPropertyPage(\"Link refraction to transparency\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public linkRefractionWithTransparency: boolean = false;\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @editableInPropertyPage(\"Invert refraction Y\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public invertRefractionY: boolean = false;\r\n\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @editableInPropertyPage(\"Use thickness as depth\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { notifiers: { update: true } })\r\n public useThicknessAsDepth: boolean = false;\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public texture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Create a new RefractionBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"intensity\", NodeMaterialBlockConnectionPointTypes.Float, false, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"tintAtDistance\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n this.registerInput(\"volumeIndexOfRefraction\", NodeMaterialBlockConnectionPointTypes.Float, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"refraction\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"refraction\", this, NodeMaterialConnectionPointDirection.Output, RefractionBlock, \"RefractionBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"vRefractionPosition\");\r\n state._excludeVariableName(\"vRefractionSize\");\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"RefractionBlock\";\r\n }\r\n\r\n /**\r\n * Gets the intensity input component\r\n */\r\n public get intensity(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tint at distance input component\r\n */\r\n public get tintAtDistance(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the volume index of refraction input component\r\n */\r\n public get volumeIndexOfRefraction(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the view input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this.viewConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the refraction object output component\r\n */\r\n public get refraction(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Returns true if the block has a texture\r\n */\r\n public get hasTexture(): boolean {\r\n return !!this._getTexture();\r\n }\r\n\r\n protected _getTexture(): Nullable<BaseTexture> {\r\n if (this.texture) {\r\n return this.texture;\r\n }\r\n\r\n return this._scene.environmentTexture;\r\n }\r\n\r\n public autoConfigure(material: NodeMaterial) {\r\n if (!this.intensity.isConnected) {\r\n const intensityInput = new InputBlock(\"Refraction intensity\", NodeMaterialBlockTargets.Fragment, NodeMaterialBlockConnectionPointTypes.Float);\r\n intensityInput.value = 1;\r\n intensityInput.output.connectTo(this.intensity);\r\n }\r\n\r\n if (this.view && !this.view.isConnected) {\r\n let viewInput = material.getInputBlockByPredicate((b) => b.systemValue === NodeMaterialSystemValues.View);\r\n\r\n if (!viewInput) {\r\n viewInput = new InputBlock(\"view\");\r\n viewInput.setAsSystemValue(NodeMaterialSystemValues.View);\r\n }\r\n viewInput.output.connectTo(this.view);\r\n }\r\n }\r\n\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const refractionTexture = this._getTexture();\r\n const refraction = refractionTexture && refractionTexture.getTextureMatrix;\r\n\r\n defines.setValue(\"SS_REFRACTION\", refraction, true);\r\n\r\n if (!refraction) {\r\n return;\r\n }\r\n\r\n defines.setValue(this._define3DName, refractionTexture!.isCube, true);\r\n defines.setValue(this._defineLODRefractionAlpha, refractionTexture!.lodLevelInAlpha, true);\r\n defines.setValue(this._defineLinearSpecularRefraction, refractionTexture!.linearSpecularLOD, true);\r\n defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem && refractionTexture.isCube ? !refractionTexture!.invertZ : refractionTexture!.invertZ, true);\r\n\r\n defines.setValue(\"SS_LINKREFRACTIONTOTRANSPARENCY\", this.linkRefractionWithTransparency, true);\r\n defines.setValue(\"SS_GAMMAREFRACTION\", refractionTexture!.gammaSpace, true);\r\n defines.setValue(\"SS_RGBDREFRACTION\", refractionTexture!.isRGBD, true);\r\n defines.setValue(\"SS_USE_LOCAL_REFRACTIONMAP_CUBIC\", (<any>refractionTexture).boundingBoxSize ? true : false, true);\r\n defines.setValue(\"SS_USE_THICKNESS_AS_DEPTH\", this.useThicknessAsDepth, true);\r\n }\r\n\r\n public isReady() {\r\n const texture = this._getTexture();\r\n\r\n if (texture && !texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n super.bind(effect, nodeMaterial, mesh);\r\n\r\n const refractionTexture = this._getTexture();\r\n\r\n if (!refractionTexture) {\r\n return;\r\n }\r\n\r\n if (refractionTexture.isCube) {\r\n effect.setTexture(this._cubeSamplerName, refractionTexture);\r\n } else {\r\n effect.setTexture(this._2DSamplerName, refractionTexture);\r\n }\r\n\r\n effect.setMatrix(this._refractionMatrixName, refractionTexture.getRefractionTextureMatrix());\r\n\r\n let depth = 1.0;\r\n if (!refractionTexture.isCube) {\r\n if ((<any>refractionTexture).depth) {\r\n depth = (<any>refractionTexture).depth;\r\n }\r\n }\r\n\r\n const indexOfRefraction = this.volumeIndexOfRefraction.connectInputBlock?.value ?? this.indexOfRefractionConnectionPoint.connectInputBlock?.value ?? 1.5;\r\n\r\n effect.setFloat4(this._vRefractionInfosName, refractionTexture.level, 1 / indexOfRefraction, depth, this.invertRefractionY ? -1 : 1);\r\n\r\n effect.setFloat4(\r\n this._vRefractionMicrosurfaceInfosName,\r\n refractionTexture.getSize().width,\r\n refractionTexture.lodGenerationScale,\r\n refractionTexture.lodGenerationOffset,\r\n 1 / indexOfRefraction\r\n );\r\n\r\n const width = refractionTexture.getSize().width;\r\n\r\n effect.setFloat2(this._vRefractionFilteringInfoName, width, Scalar.Log2(width));\r\n\r\n if ((<any>refractionTexture).boundingBoxSize) {\r\n const cubeTexture = <CubeTexture>refractionTexture;\r\n effect.setVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n effect.setVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @returns the shader code\r\n */\r\n public getCode(state: NodeMaterialBuildState): string {\r\n const code = \"\";\r\n\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n\r\n // Samplers\r\n this._cubeSamplerName = state._getFreeVariableName(this.name + \"CubeSampler\");\r\n state.samplers.push(this._cubeSamplerName);\r\n\r\n this._2DSamplerName = state._getFreeVariableName(this.name + \"2DSampler\");\r\n state.samplers.push(this._2DSamplerName);\r\n\r\n this._define3DName = state._getFreeDefineName(\"SS_REFRACTIONMAP_3D\");\r\n\r\n state._samplerDeclaration += `#ifdef ${this._define3DName}\\r\\n`;\r\n state._samplerDeclaration += `uniform samplerCube ${this._cubeSamplerName};\\r\\n`;\r\n state._samplerDeclaration += `#else\\r\\n`;\r\n state._samplerDeclaration += `uniform sampler2D ${this._2DSamplerName};\\r\\n`;\r\n state._samplerDeclaration += `#endif\\r\\n`;\r\n\r\n // Fragment\r\n state.sharedData.blocksWithDefines.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n this._defineLODRefractionAlpha = state._getFreeDefineName(\"SS_LODINREFRACTIONALPHA\");\r\n this._defineLinearSpecularRefraction = state._getFreeDefineName(\"SS_LINEARSPECULARREFRACTION\");\r\n this._defineOppositeZ = state._getFreeDefineName(\"SS_REFRACTIONMAP_OPPOSITEZ\");\r\n\r\n this._refractionMatrixName = state._getFreeVariableName(\"refractionMatrix\");\r\n\r\n state._emitUniformFromString(this._refractionMatrixName, \"mat4\");\r\n\r\n state._emitFunction(\r\n \"sampleRefraction\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleRefraction(s, c) textureCube(s, c)\r\n #else\r\n #define sampleRefraction(s, c) texture2D(s, c)\r\n #endif\\r\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n state._emitFunction(\r\n \"sampleRefractionLod\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleRefractionLod(s, c, l) textureCubeLodEXT(s, c, l)\r\n #else\r\n #define sampleRefractionLod(s, c, l) texture2DLodEXT(s, c, l)\r\n #endif\\r\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n this._vRefractionMicrosurfaceInfosName = state._getFreeVariableName(\"vRefractionMicrosurfaceInfos\");\r\n\r\n state._emitUniformFromString(this._vRefractionMicrosurfaceInfosName, \"vec4\");\r\n\r\n this._vRefractionInfosName = state._getFreeVariableName(\"vRefractionInfos\");\r\n\r\n state._emitUniformFromString(this._vRefractionInfosName, \"vec4\");\r\n\r\n this._vRefractionFilteringInfoName = state._getFreeVariableName(\"vRefractionFilteringInfo\");\r\n\r\n state._emitUniformFromString(this._vRefractionFilteringInfoName, \"vec2\");\r\n\r\n state._emitUniformFromString(\"vRefractionPosition\", \"vec3\");\r\n state._emitUniformFromString(\"vRefractionSize\", \"vec3\");\r\n\r\n return code;\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n this._scene = state.sharedData.scene;\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n if (this.texture) {\r\n if (this.texture.isCube) {\r\n codeString = `${this._codeVariableName}.texture = new BABYLON.CubeTexture(\"${this.texture.name}\");\\r\\n`;\r\n } else {\r\n codeString = `${this._codeVariableName}.texture = new BABYLON.Texture(\"${this.texture.name}\");\\r\\n`;\r\n }\r\n codeString += `${this._codeVariableName}.texture.coordinatesMode = ${this.texture.coordinatesMode};\\r\\n`;\r\n }\r\n\r\n codeString += `${this._codeVariableName}.linkRefractionWithTransparency = ${this.linkRefractionWithTransparency};\\r\\n`;\r\n codeString += `${this._codeVariableName}.invertRefractionY = ${this.invertRefractionY};\\r\\n`;\r\n codeString += `${this._codeVariableName}.useThicknessAsDepth = ${this.useThicknessAsDepth};\\r\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n if (this.texture && !this.texture.isRenderTarget) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n serializationObject.linkRefractionWithTransparency = this.linkRefractionWithTransparency;\r\n serializationObject.invertRefractionY = this.invertRefractionY;\r\n serializationObject.useThicknessAsDepth = this.useThicknessAsDepth;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n if (serializationObject.texture) {\r\n rootUrl = serializationObject.texture.url.indexOf(\"data:\") === 0 ? \"\" : rootUrl;\r\n if (serializationObject.texture.isCube) {\r\n this.texture = CubeTexture.Parse(serializationObject.texture, scene, rootUrl);\r\n } else {\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl);\r\n }\r\n }\r\n\r\n this.linkRefractionWithTransparency = serializationObject.linkRefractionWithTransparency;\r\n this.invertRefractionY = serializationObject.invertRefractionY;\r\n this.useThicknessAsDepth = !!serializationObject.useThicknessAsDepth;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.RefractionBlock\", RefractionBlock);\r\n"]}
|
|
@@ -20,6 +20,10 @@ export declare class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
20
20
|
private _samplerName;
|
|
21
21
|
private _textureInfoName;
|
|
22
22
|
private _imageSource;
|
|
23
|
+
/**
|
|
24
|
+
* Project the texture(s) for a better fit to a cube
|
|
25
|
+
*/
|
|
26
|
+
projectAsCube: boolean;
|
|
23
27
|
protected _texture: Nullable<Texture>;
|
|
24
28
|
/**
|
|
25
29
|
* Gets or sets the texture associated with the node
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { __decorate } from "../../../tslib.es6.js";
|
|
1
2
|
import { NodeMaterialBlock } from "../nodeMaterialBlock.js";
|
|
2
3
|
import { NodeMaterialBlockConnectionPointTypes } from "../Enums/nodeMaterialBlockConnectionPointTypes.js";
|
|
3
4
|
import { NodeMaterialBlockTargets } from "../Enums/nodeMaterialBlockTargets.js";
|
|
@@ -10,6 +11,7 @@ import "../../../Shaders/ShadersInclude/helperFunctions.js";
|
|
|
10
11
|
import { ImageSourceBlock } from "./Dual/imageSourceBlock.js";
|
|
11
12
|
import { NodeMaterialConnectionPointCustomObject } from "../nodeMaterialConnectionPointCustomObject.js";
|
|
12
13
|
import { EngineStore } from "../../../Engines/engineStore.js";
|
|
14
|
+
import { editableInPropertyPage, PropertyTypeForEdition } from "../nodeMaterialDecorator.js";
|
|
13
15
|
/**
|
|
14
16
|
* Block used to read a texture with triplanar mapping (see "boxmap" in https://iquilezles.org/articles/biplanar/)
|
|
15
17
|
*/
|
|
@@ -139,6 +141,10 @@ export class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
139
141
|
*/
|
|
140
142
|
constructor(name, hideSourceZ = false) {
|
|
141
143
|
super(name, NodeMaterialBlockTargets.Neutral);
|
|
144
|
+
/**
|
|
145
|
+
* Project the texture(s) for a better fit to a cube
|
|
146
|
+
*/
|
|
147
|
+
this.projectAsCube = false;
|
|
142
148
|
this._convertToGammaSpace = false;
|
|
143
149
|
this._convertToLinearSpace = false;
|
|
144
150
|
/**
|
|
@@ -282,14 +288,40 @@ export class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
282
288
|
const x = state._getFreeVariableName("x");
|
|
283
289
|
const y = state._getFreeVariableName("y");
|
|
284
290
|
const z = state._getFreeVariableName("z");
|
|
285
|
-
const w = state._getFreeVariableName("
|
|
291
|
+
const w = state._getFreeVariableName("w");
|
|
292
|
+
const n = state._getFreeVariableName("n");
|
|
293
|
+
const uvx = state._getFreeVariableName("uvx");
|
|
294
|
+
const uvy = state._getFreeVariableName("uvy");
|
|
295
|
+
const uvz = state._getFreeVariableName("uvz");
|
|
296
|
+
state.compilationString += `
|
|
297
|
+
vec3 ${n} = ${this.normal.associatedVariableName}.xyz;
|
|
298
|
+
|
|
299
|
+
vec2 ${uvx} = ${this.position.associatedVariableName}.yz;
|
|
300
|
+
vec2 ${uvy} = ${this.position.associatedVariableName}.zx;
|
|
301
|
+
vec2 ${uvz} = ${this.position.associatedVariableName}.xy;
|
|
302
|
+
`;
|
|
303
|
+
if (this.projectAsCube) {
|
|
304
|
+
state.compilationString += `
|
|
305
|
+
${uvx}.xy = ${uvx}.yx;
|
|
306
|
+
|
|
307
|
+
if (${n}.x >= 0.0) {
|
|
308
|
+
${uvx}.x = -${uvx}.x;
|
|
309
|
+
}
|
|
310
|
+
if (${n}.y < 0.0) {
|
|
311
|
+
${uvy}.y = -${uvy}.y;
|
|
312
|
+
}
|
|
313
|
+
if (${n}.z < 0.0) {
|
|
314
|
+
${uvz}.x = -${uvz}.x;
|
|
315
|
+
}
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
286
318
|
state.compilationString += `
|
|
287
|
-
vec4 ${x} = texture2D(${samplerName}, ${
|
|
288
|
-
vec4 ${y} = texture2D(${samplerYName}, ${
|
|
289
|
-
vec4 ${z} = texture2D(${samplerZName}, ${
|
|
290
|
-
|
|
319
|
+
vec4 ${x} = texture2D(${samplerName}, ${uvx});
|
|
320
|
+
vec4 ${y} = texture2D(${samplerYName}, ${uvy});
|
|
321
|
+
vec4 ${z} = texture2D(${samplerZName}, ${uvz});
|
|
322
|
+
|
|
291
323
|
// blend weights
|
|
292
|
-
vec3 ${w} = pow(abs(${
|
|
324
|
+
vec3 ${w} = pow(abs(${n}), vec3(${sharpness}));
|
|
293
325
|
|
|
294
326
|
// blend and return
|
|
295
327
|
vec4 ${this._tempTextureRead} = (${x}*${w}.x + ${y}*${w}.y + ${z}*${w}.z) / (${w}.x + ${w}.y + ${w}.z);
|
|
@@ -356,6 +388,7 @@ export class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
356
388
|
codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace};\r\n`;
|
|
357
389
|
codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace};\r\n`;
|
|
358
390
|
codeString += `${this._codeVariableName}.disableLevelMultiplication = ${this.disableLevelMultiplication};\r\n`;
|
|
391
|
+
codeString += `${this._codeVariableName}.projectAsCube = ${this.projectAsCube};\r\n`;
|
|
359
392
|
if (!this.texture) {
|
|
360
393
|
return codeString;
|
|
361
394
|
}
|
|
@@ -377,6 +410,7 @@ export class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
377
410
|
serializationObject.convertToGammaSpace = this.convertToGammaSpace;
|
|
378
411
|
serializationObject.convertToLinearSpace = this.convertToLinearSpace;
|
|
379
412
|
serializationObject.disableLevelMultiplication = this.disableLevelMultiplication;
|
|
413
|
+
serializationObject.projectAsCube = this.projectAsCube;
|
|
380
414
|
if (!this.hasImageSource && this.texture && !this.texture.isRenderTarget && this.texture.getClassName() !== "VideoTexture") {
|
|
381
415
|
serializationObject.texture = this.texture.serialize();
|
|
382
416
|
}
|
|
@@ -387,11 +421,15 @@ export class TriPlanarBlock extends NodeMaterialBlock {
|
|
|
387
421
|
this.convertToGammaSpace = serializationObject.convertToGammaSpace;
|
|
388
422
|
this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;
|
|
389
423
|
this.disableLevelMultiplication = !!serializationObject.disableLevelMultiplication;
|
|
424
|
+
this.projectAsCube = !!serializationObject.projectAsCube;
|
|
390
425
|
if (serializationObject.texture && !NodeMaterial.IgnoreTexturesAtLoadTime && serializationObject.texture.url !== undefined) {
|
|
391
426
|
rootUrl = serializationObject.texture.url.indexOf("data:") === 0 ? "" : rootUrl;
|
|
392
427
|
this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl);
|
|
393
428
|
}
|
|
394
429
|
}
|
|
395
430
|
}
|
|
431
|
+
__decorate([
|
|
432
|
+
editableInPropertyPage("Project as cube", PropertyTypeForEdition.Boolean, "ADVANCED", { notifiers: { update: true } })
|
|
433
|
+
], TriPlanarBlock.prototype, "projectAsCube", void 0);
|
|
396
434
|
RegisterClass("BABYLON.TriPlanarBlock", TriPlanarBlock);
|
|
397
435
|
//# sourceMappingURL=triPlanarBlock.js.map
|