@onerjs/core 8.52.4 → 8.52.5

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.
Files changed (42) hide show
  1. package/Cameras/arcRotateCamera.pure.d.ts +6 -0
  2. package/Cameras/arcRotateCamera.pure.js +13 -0
  3. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  4. package/FrameGraph/Node/Blocks/Layers/selectionOutlineLayerBlock.pure.d.ts +3 -0
  5. package/FrameGraph/Node/Blocks/Layers/selectionOutlineLayerBlock.pure.js +16 -1
  6. package/FrameGraph/Node/Blocks/Layers/selectionOutlineLayerBlock.pure.js.map +1 -1
  7. package/FrameGraph/Tasks/Layers/selectionOutlineTask.d.ts +2 -1
  8. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +5 -2
  9. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
  10. package/Layers/selectionOutlineLayer.pure.d.ts +9 -2
  11. package/Layers/selectionOutlineLayer.pure.js +29 -6
  12. package/Layers/selectionOutlineLayer.pure.js.map +1 -1
  13. package/Layers/thinEffectLayer.d.ts +1 -0
  14. package/Layers/thinEffectLayer.js +7 -4
  15. package/Layers/thinEffectLayer.js.map +1 -1
  16. package/Layers/thinSelectionOutlineLayer.d.ts +17 -3
  17. package/Layers/thinSelectionOutlineLayer.js +82 -17
  18. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  19. package/Meshes/GaussianSplatting/gaussianSplattingCompoundMesh.pure.d.ts +2 -1
  20. package/Meshes/GaussianSplatting/gaussianSplattingCompoundMesh.pure.js +3 -2
  21. package/Meshes/GaussianSplatting/gaussianSplattingCompoundMesh.pure.js.map +1 -1
  22. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +32 -2
  23. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +180 -22
  24. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  25. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +12 -10
  26. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +20 -5
  27. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  28. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +12 -1
  29. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  30. package/Rendering/geometryBufferRenderer.pure.js +8 -0
  31. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  32. package/Rendering/objectRenderer.js +4 -2
  33. package/Rendering/objectRenderer.js.map +1 -1
  34. package/Shaders/gaussianSplattingVoxel.vertex.js +1 -0
  35. package/Shaders/gaussianSplattingVoxel.vertex.js.map +1 -1
  36. package/Shaders/selectionOutline.fragment.js +16 -4
  37. package/Shaders/selectionOutline.fragment.js.map +1 -1
  38. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +1 -0
  39. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -1
  40. package/ShadersWGSL/selectionOutline.fragment.js +14 -2
  41. package/ShadersWGSL/selectionOutline.fragment.js.map +1 -1
  42. package/package.json +1 -1
@@ -45,6 +45,9 @@ export declare class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRende
45
45
  /** The occlusion threshold */
46
46
  get occlusionThreshold(): number;
47
47
  set occlusionThreshold(value: number);
48
+ /** Whether to use depth when drawing selection outlines */
49
+ get useDepthOcclusion(): boolean;
50
+ set useDepthOcclusion(value: boolean);
48
51
  /**
49
52
  * Gets the current class name
50
53
  * @returns the class name
@@ -34,7 +34,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
34
34
  this.registerInput("target", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);
35
35
  this.registerInput("layer", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);
36
36
  this.registerInput("objectRenderer", NodeRenderGraphBlockConnectionPointTypes.Object, false, new NodeRenderGraphConnectionPointCustomObject("objectRenderer", this, 0 /* NodeRenderGraphConnectionPointDirection.Input */, NodeRenderGraphBaseObjectRendererBlock, "NodeRenderGraphBaseObjectRendererBlock"));
37
- this.registerInput("depth", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);
37
+ this.registerInput("depth", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);
38
38
  this.depth.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureViewDepth | NodeRenderGraphBlockConnectionPointTypes.TextureNormalizedViewDepth);
39
39
  this._addDependenciesInput();
40
40
  this.registerOutput("output", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);
@@ -52,6 +52,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
52
52
  const outlineThickness = this.outlineThickness;
53
53
  const occlusionStrength = this.occlusionStrength;
54
54
  const occlusionThreshold = this.occlusionThreshold;
55
+ const useDepthOcclusion = this.useDepthOcclusion;
55
56
  this._frameGraphTask?.dispose();
56
57
  this._frameGraphTask = new FrameGraphSelectionOutlineLayerTask(this.name, this._frameGraph, this._scene, {
57
58
  mainTextureRatio: layerTextureRatio,
@@ -62,6 +63,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
62
63
  this.outlineThickness = outlineThickness;
63
64
  this.occlusionStrength = occlusionStrength;
64
65
  this.occlusionThreshold = occlusionThreshold;
66
+ this.useDepthOcclusion = useDepthOcclusion;
65
67
  this._additionalConstructionParameters = [layerTextureRatio, layerTextureFixedSize, layerTextureType];
66
68
  }
67
69
  /** Multiplication factor applied to the main texture size to compute the size of the layer render target texture */
@@ -116,6 +118,13 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
116
118
  set occlusionThreshold(value) {
117
119
  this._frameGraphTask.layer.occlusionThreshold = value;
118
120
  }
121
+ /** Whether to use depth when drawing selection outlines */
122
+ get useDepthOcclusion() {
123
+ return this._frameGraphTask.layer.useDepthOcclusion;
124
+ }
125
+ set useDepthOcclusion(value) {
126
+ this._frameGraphTask.layer.useDepthOcclusion = value;
127
+ }
119
128
  /**
120
129
  * Gets the current class name
121
130
  * @returns the class name
@@ -167,6 +176,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
167
176
  codes.push(`${this._codeVariableName}.outlineThickness = ${this.outlineThickness};`);
168
177
  codes.push(`${this._codeVariableName}.occlusionStrength = ${this.occlusionStrength};`);
169
178
  codes.push(`${this._codeVariableName}.occlusionThreshold = ${this.occlusionThreshold};`);
179
+ codes.push(`${this._codeVariableName}.useDepthOcclusion = ${this.useDepthOcclusion};`);
170
180
  return super._dumpPropertiesCode() + codes.join("\n");
171
181
  }
172
182
  serialize() {
@@ -175,6 +185,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
175
185
  serializationObject.outlineThickness = this.outlineThickness;
176
186
  serializationObject.occlusionStrength = this.occlusionStrength;
177
187
  serializationObject.occlusionThreshold = this.occlusionThreshold;
188
+ serializationObject.useDepthOcclusion = this.useDepthOcclusion;
178
189
  return serializationObject;
179
190
  }
180
191
  _deserialize(serializationObject) {
@@ -183,6 +194,7 @@ export class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBl
183
194
  this.outlineThickness = serializationObject.outlineThickness;
184
195
  this.occlusionStrength = serializationObject.occlusionStrength;
185
196
  this.occlusionThreshold = serializationObject.occlusionThreshold;
197
+ this.useDepthOcclusion = serializationObject.useDepthOcclusion ?? true;
186
198
  }
187
199
  }
188
200
  __decorate([
@@ -206,6 +218,9 @@ __decorate([
206
218
  __decorate([
207
219
  editableInPropertyPage("Occlusion threshold", 1 /* PropertyTypeForEdition.Float */, "PROPERTIES", { min: 0, max: 1 })
208
220
  ], NodeRenderGraphSelectionOutlineLayerBlock.prototype, "occlusionThreshold", null);
221
+ __decorate([
222
+ editableInPropertyPage("Use depth occlusion", 0 /* PropertyTypeForEdition.Boolean */, "PROPERTIES")
223
+ ], NodeRenderGraphSelectionOutlineLayerBlock.prototype, "useDepthOcclusion", null);
209
224
  let _Registered = false;
210
225
  /**
211
226
  * Register side effects for selectionOutlineLayerBlock.
@@ -1 +1 @@
1
- {"version":3,"file":"selectionOutlineLayerBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FrameGraph/Node/Blocks/Layers/selectionOutlineLayerBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport {\r\n type Scene,\r\n type NodeRenderGraphBuildState,\r\n type FrameGraph,\r\n type FrameGraphTextureHandle,\r\n type NodeRenderGraphConnectionPoint,\r\n type FrameGraphObjectRendererTask,\r\n} from \"core/index\";\r\nimport { NodeRenderGraphBlock } from \"../../nodeRenderGraphBlock\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes, NodeRenderGraphConnectionPointDirection } from \"../../Types/nodeRenderGraphTypes\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { FrameGraphSelectionOutlineLayerTask } from \"core/FrameGraph/Tasks/Layers/selectionOutlineTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { NodeRenderGraphConnectionPointCustomObject } from \"../../nodeRenderGraphConnectionPointCustomObject\";\r\nimport { NodeRenderGraphBaseObjectRendererBlock } from \"../Rendering/baseObjectRendererBlock\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block that implements the selection outline layer\r\n */\r\nexport class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphSelectionOutlineLayerTask;\r\n\r\n public override _additionalConstructionParameters: [number, number | undefined, number];\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphSelectionOutlineLayerBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n * @param layerTextureRatio multiplication factor applied to the main texture size to compute the size of the layer render target texture (default: 1.0)\r\n * @param layerTextureFixedSize defines the fixed size of the layer render target texture. Takes precedence over layerTextureRatio if provided (default: undefined)\r\n * @param layerTextureType defines the type of the layer texture (default: Constants.TEXTURETYPE_HALF_FLOAT)\r\n */\r\n public constructor(\r\n name: string,\r\n frameGraph: FrameGraph,\r\n scene: Scene,\r\n layerTextureRatio = 1.0,\r\n layerTextureFixedSize?: number,\r\n layerTextureType = Constants.TEXTURETYPE_HALF_FLOAT\r\n ) {\r\n super(name, frameGraph, scene);\r\n\r\n this._additionalConstructionParameters = [layerTextureRatio, layerTextureFixedSize, layerTextureType];\r\n\r\n this.registerInput(\"target\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"layer\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\r\n \"objectRenderer\",\r\n NodeRenderGraphBlockConnectionPointTypes.Object,\r\n false,\r\n new NodeRenderGraphConnectionPointCustomObject(\r\n \"objectRenderer\",\r\n this,\r\n NodeRenderGraphConnectionPointDirection.Input,\r\n NodeRenderGraphBaseObjectRendererBlock,\r\n \"NodeRenderGraphBaseObjectRendererBlock\"\r\n )\r\n );\r\n this.registerInput(\"depth\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);\r\n\r\n this.depth.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.TextureViewDepth | NodeRenderGraphBlockConnectionPointTypes.TextureNormalizedViewDepth\r\n );\r\n\r\n this._addDependenciesInput();\r\n\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this.target.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBufferDepthStencil);\r\n this.layer.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBuffer);\r\n\r\n this.output._typeConnectionSource = this.target;\r\n\r\n this._frameGraphTask = new FrameGraphSelectionOutlineLayerTask(this.name, this._frameGraph, this._scene, {\r\n mainTextureRatio: layerTextureRatio,\r\n mainTextureFixedSize: layerTextureFixedSize,\r\n mainTextureType: layerTextureType,\r\n });\r\n }\r\n\r\n private _createTask(layerTextureRatio: number, layerTextureFixedSize: number, layerTextureType: number) {\r\n const outlineColor = this.outlineColor;\r\n const outlineThickness = this.outlineThickness;\r\n const occlusionStrength = this.occlusionStrength;\r\n const occlusionThreshold = this.occlusionThreshold;\r\n\r\n this._frameGraphTask?.dispose();\r\n\r\n this._frameGraphTask = new FrameGraphSelectionOutlineLayerTask(this.name, this._frameGraph, this._scene, {\r\n mainTextureRatio: layerTextureRatio,\r\n mainTextureFixedSize: layerTextureFixedSize,\r\n mainTextureType: layerTextureType,\r\n });\r\n\r\n this.outlineColor = outlineColor;\r\n this.outlineThickness = outlineThickness;\r\n this.occlusionStrength = occlusionStrength;\r\n this.occlusionThreshold = occlusionThreshold;\r\n\r\n this._additionalConstructionParameters = [layerTextureRatio, layerTextureFixedSize, layerTextureType];\r\n }\r\n\r\n /** Multiplication factor applied to the main texture size to compute the size of the layer render target texture */\r\n @editableInPropertyPage(\"Layer texture ratio\", PropertyTypeForEdition.Float, \"PROPERTIES\")\r\n public get layerTextureRatio() {\r\n return this._frameGraphTask.layer._options.mainTextureRatio;\r\n }\r\n\r\n public set layerTextureRatio(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(value, options.mainTextureFixedSize, options.mainTextureType);\r\n }\r\n\r\n /** Defines the fixed size of the layer render target texture. Takes precedence over layerTextureRatio if provided */\r\n @editableInPropertyPage(\"Layer texture fixed size\", PropertyTypeForEdition.Float, \"PROPERTIES\")\r\n public get layerTextureFixedSize() {\r\n return this._frameGraphTask.layer._options.mainTextureFixedSize;\r\n }\r\n\r\n public set layerTextureFixedSize(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(options.mainTextureRatio, value, options.mainTextureType);\r\n }\r\n\r\n /** Defines the type of the layer texture */\r\n @editableInPropertyPage(\"Layer texture type\", PropertyTypeForEdition.TextureType, \"PROPERTIES\")\r\n public get layerTextureType() {\r\n return this._frameGraphTask.layer._options.mainTextureType;\r\n }\r\n\r\n public set layerTextureType(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(options.mainTextureRatio, options.mainTextureFixedSize, value);\r\n }\r\n\r\n /** The outline color */\r\n @editableInPropertyPage(\"Outline color\", PropertyTypeForEdition.Color3, \"PROPERTIES\")\r\n public get outlineColor() {\r\n return this._frameGraphTask.layer.outlineColor;\r\n }\r\n\r\n public set outlineColor(value: Color3) {\r\n this._frameGraphTask.layer.outlineColor = value;\r\n }\r\n\r\n /** The thickness of the edges */\r\n @editableInPropertyPage(\"Outline thickness\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 30 })\r\n public get outlineThickness() {\r\n return this._frameGraphTask.layer.outlineThickness;\r\n }\r\n\r\n public set outlineThickness(value: number) {\r\n this._frameGraphTask.layer.outlineThickness = value;\r\n }\r\n\r\n /** The strength of the occlusion effect */\r\n @editableInPropertyPage(\"Occlusion strength\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 1 })\r\n public get occlusionStrength() {\r\n return this._frameGraphTask.layer.occlusionStrength;\r\n }\r\n\r\n public set occlusionStrength(value: number) {\r\n this._frameGraphTask.layer.occlusionStrength = value;\r\n }\r\n\r\n /** The occlusion threshold */\r\n @editableInPropertyPage(\"Occlusion threshold\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 1 })\r\n public get occlusionThreshold() {\r\n return this._frameGraphTask.layer.occlusionThreshold;\r\n }\r\n\r\n public set occlusionThreshold(value: number) {\r\n this._frameGraphTask.layer.occlusionThreshold = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"NodeRenderGraphSelectionOutlineLayerBlock\";\r\n }\r\n\r\n /**\r\n * Gets the target texture input component\r\n */\r\n public get target(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the layer texture input component\r\n */\r\n public get layer(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the objectRenderer input component\r\n */\r\n public get objectRenderer(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the depth input component\r\n */\r\n public get depth(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputTexture;\r\n\r\n this._frameGraphTask.targetTexture = this.target.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.layerTexture = this.layer.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.objectRendererTask = this.objectRenderer.connectedPoint?.value as FrameGraphObjectRendererTask;\r\n this._frameGraphTask.depthTexture = this.depth.connectedPoint?.value as FrameGraphTextureHandle;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n const codes: string[] = [];\r\n codes.push(`${this._codeVariableName}.outlineColor = new BABYLON.Color3(${this.outlineColor.r}, ${this.outlineColor.g}, ${this.outlineColor.b});`);\r\n codes.push(`${this._codeVariableName}.outlineThickness = ${this.outlineThickness};`);\r\n codes.push(`${this._codeVariableName}.occlusionStrength = ${this.occlusionStrength};`);\r\n codes.push(`${this._codeVariableName}.occlusionThreshold = ${this.occlusionThreshold};`);\r\n return super._dumpPropertiesCode() + codes.join(\"\\n\");\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.outlineColor = this.outlineColor.asArray();\r\n serializationObject.outlineThickness = this.outlineThickness;\r\n serializationObject.occlusionStrength = this.occlusionStrength;\r\n serializationObject.occlusionThreshold = this.occlusionThreshold;\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n this.outlineColor = Color3.FromArray(serializationObject.outlineColor);\r\n this.outlineThickness = serializationObject.outlineThickness;\r\n this.occlusionStrength = serializationObject.occlusionStrength;\r\n this.occlusionThreshold = serializationObject.occlusionThreshold;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for selectionOutlineLayerBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterSelectionOutlineLayerBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.NodeRenderGraphSelectionOutlineLayerBlock\", NodeRenderGraphSelectionOutlineLayerBlock);\r\n}\r\n"]}
1
+ {"version":3,"file":"selectionOutlineLayerBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FrameGraph/Node/Blocks/Layers/selectionOutlineLayerBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport {\r\n type Scene,\r\n type NodeRenderGraphBuildState,\r\n type FrameGraph,\r\n type FrameGraphTextureHandle,\r\n type NodeRenderGraphConnectionPoint,\r\n type FrameGraphObjectRendererTask,\r\n} from \"core/index\";\r\nimport { NodeRenderGraphBlock } from \"../../nodeRenderGraphBlock\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes, NodeRenderGraphConnectionPointDirection } from \"../../Types/nodeRenderGraphTypes\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { FrameGraphSelectionOutlineLayerTask } from \"core/FrameGraph/Tasks/Layers/selectionOutlineTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { NodeRenderGraphConnectionPointCustomObject } from \"../../nodeRenderGraphConnectionPointCustomObject\";\r\nimport { NodeRenderGraphBaseObjectRendererBlock } from \"../Rendering/baseObjectRendererBlock\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block that implements the selection outline layer\r\n */\r\nexport class NodeRenderGraphSelectionOutlineLayerBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphSelectionOutlineLayerTask;\r\n\r\n public override _additionalConstructionParameters: [number, number | undefined, number];\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphSelectionOutlineLayerBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n * @param layerTextureRatio multiplication factor applied to the main texture size to compute the size of the layer render target texture (default: 1.0)\r\n * @param layerTextureFixedSize defines the fixed size of the layer render target texture. Takes precedence over layerTextureRatio if provided (default: undefined)\r\n * @param layerTextureType defines the type of the layer texture (default: Constants.TEXTURETYPE_HALF_FLOAT)\r\n */\r\n public constructor(\r\n name: string,\r\n frameGraph: FrameGraph,\r\n scene: Scene,\r\n layerTextureRatio = 1.0,\r\n layerTextureFixedSize?: number,\r\n layerTextureType = Constants.TEXTURETYPE_HALF_FLOAT\r\n ) {\r\n super(name, frameGraph, scene);\r\n\r\n this._additionalConstructionParameters = [layerTextureRatio, layerTextureFixedSize, layerTextureType];\r\n\r\n this.registerInput(\"target\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"layer\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\r\n \"objectRenderer\",\r\n NodeRenderGraphBlockConnectionPointTypes.Object,\r\n false,\r\n new NodeRenderGraphConnectionPointCustomObject(\r\n \"objectRenderer\",\r\n this,\r\n NodeRenderGraphConnectionPointDirection.Input,\r\n NodeRenderGraphBaseObjectRendererBlock,\r\n \"NodeRenderGraphBaseObjectRendererBlock\"\r\n )\r\n );\r\n this.registerInput(\"depth\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n\r\n this.depth.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.TextureViewDepth | NodeRenderGraphBlockConnectionPointTypes.TextureNormalizedViewDepth\r\n );\r\n\r\n this._addDependenciesInput();\r\n\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this.target.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBufferDepthStencil);\r\n this.layer.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBuffer);\r\n\r\n this.output._typeConnectionSource = this.target;\r\n\r\n this._frameGraphTask = new FrameGraphSelectionOutlineLayerTask(this.name, this._frameGraph, this._scene, {\r\n mainTextureRatio: layerTextureRatio,\r\n mainTextureFixedSize: layerTextureFixedSize,\r\n mainTextureType: layerTextureType,\r\n });\r\n }\r\n\r\n private _createTask(layerTextureRatio: number, layerTextureFixedSize: number, layerTextureType: number) {\r\n const outlineColor = this.outlineColor;\r\n const outlineThickness = this.outlineThickness;\r\n const occlusionStrength = this.occlusionStrength;\r\n const occlusionThreshold = this.occlusionThreshold;\r\n const useDepthOcclusion = this.useDepthOcclusion;\r\n\r\n this._frameGraphTask?.dispose();\r\n\r\n this._frameGraphTask = new FrameGraphSelectionOutlineLayerTask(this.name, this._frameGraph, this._scene, {\r\n mainTextureRatio: layerTextureRatio,\r\n mainTextureFixedSize: layerTextureFixedSize,\r\n mainTextureType: layerTextureType,\r\n });\r\n\r\n this.outlineColor = outlineColor;\r\n this.outlineThickness = outlineThickness;\r\n this.occlusionStrength = occlusionStrength;\r\n this.occlusionThreshold = occlusionThreshold;\r\n this.useDepthOcclusion = useDepthOcclusion;\r\n\r\n this._additionalConstructionParameters = [layerTextureRatio, layerTextureFixedSize, layerTextureType];\r\n }\r\n\r\n /** Multiplication factor applied to the main texture size to compute the size of the layer render target texture */\r\n @editableInPropertyPage(\"Layer texture ratio\", PropertyTypeForEdition.Float, \"PROPERTIES\")\r\n public get layerTextureRatio() {\r\n return this._frameGraphTask.layer._options.mainTextureRatio;\r\n }\r\n\r\n public set layerTextureRatio(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(value, options.mainTextureFixedSize, options.mainTextureType);\r\n }\r\n\r\n /** Defines the fixed size of the layer render target texture. Takes precedence over layerTextureRatio if provided */\r\n @editableInPropertyPage(\"Layer texture fixed size\", PropertyTypeForEdition.Float, \"PROPERTIES\")\r\n public get layerTextureFixedSize() {\r\n return this._frameGraphTask.layer._options.mainTextureFixedSize;\r\n }\r\n\r\n public set layerTextureFixedSize(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(options.mainTextureRatio, value, options.mainTextureType);\r\n }\r\n\r\n /** Defines the type of the layer texture */\r\n @editableInPropertyPage(\"Layer texture type\", PropertyTypeForEdition.TextureType, \"PROPERTIES\")\r\n public get layerTextureType() {\r\n return this._frameGraphTask.layer._options.mainTextureType;\r\n }\r\n\r\n public set layerTextureType(value: number) {\r\n const options = this._frameGraphTask.layer._options;\r\n\r\n this._createTask(options.mainTextureRatio, options.mainTextureFixedSize, value);\r\n }\r\n\r\n /** The outline color */\r\n @editableInPropertyPage(\"Outline color\", PropertyTypeForEdition.Color3, \"PROPERTIES\")\r\n public get outlineColor() {\r\n return this._frameGraphTask.layer.outlineColor;\r\n }\r\n\r\n public set outlineColor(value: Color3) {\r\n this._frameGraphTask.layer.outlineColor = value;\r\n }\r\n\r\n /** The thickness of the edges */\r\n @editableInPropertyPage(\"Outline thickness\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 30 })\r\n public get outlineThickness() {\r\n return this._frameGraphTask.layer.outlineThickness;\r\n }\r\n\r\n public set outlineThickness(value: number) {\r\n this._frameGraphTask.layer.outlineThickness = value;\r\n }\r\n\r\n /** The strength of the occlusion effect */\r\n @editableInPropertyPage(\"Occlusion strength\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 1 })\r\n public get occlusionStrength() {\r\n return this._frameGraphTask.layer.occlusionStrength;\r\n }\r\n\r\n public set occlusionStrength(value: number) {\r\n this._frameGraphTask.layer.occlusionStrength = value;\r\n }\r\n\r\n /** The occlusion threshold */\r\n @editableInPropertyPage(\"Occlusion threshold\", PropertyTypeForEdition.Float, \"PROPERTIES\", { min: 0, max: 1 })\r\n public get occlusionThreshold() {\r\n return this._frameGraphTask.layer.occlusionThreshold;\r\n }\r\n\r\n public set occlusionThreshold(value: number) {\r\n this._frameGraphTask.layer.occlusionThreshold = value;\r\n }\r\n\r\n /** Whether to use depth when drawing selection outlines */\r\n @editableInPropertyPage(\"Use depth occlusion\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get useDepthOcclusion() {\r\n return this._frameGraphTask.layer.useDepthOcclusion;\r\n }\r\n\r\n public set useDepthOcclusion(value: boolean) {\r\n this._frameGraphTask.layer.useDepthOcclusion = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"NodeRenderGraphSelectionOutlineLayerBlock\";\r\n }\r\n\r\n /**\r\n * Gets the target texture input component\r\n */\r\n public get target(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the layer texture input component\r\n */\r\n public get layer(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the objectRenderer input component\r\n */\r\n public get objectRenderer(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the depth input component\r\n */\r\n public get depth(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputTexture;\r\n\r\n this._frameGraphTask.targetTexture = this.target.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.layerTexture = this.layer.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.objectRendererTask = this.objectRenderer.connectedPoint?.value as FrameGraphObjectRendererTask;\r\n this._frameGraphTask.depthTexture = this.depth.connectedPoint?.value as FrameGraphTextureHandle;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n const codes: string[] = [];\r\n codes.push(`${this._codeVariableName}.outlineColor = new BABYLON.Color3(${this.outlineColor.r}, ${this.outlineColor.g}, ${this.outlineColor.b});`);\r\n codes.push(`${this._codeVariableName}.outlineThickness = ${this.outlineThickness};`);\r\n codes.push(`${this._codeVariableName}.occlusionStrength = ${this.occlusionStrength};`);\r\n codes.push(`${this._codeVariableName}.occlusionThreshold = ${this.occlusionThreshold};`);\r\n codes.push(`${this._codeVariableName}.useDepthOcclusion = ${this.useDepthOcclusion};`);\r\n return super._dumpPropertiesCode() + codes.join(\"\\n\");\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.outlineColor = this.outlineColor.asArray();\r\n serializationObject.outlineThickness = this.outlineThickness;\r\n serializationObject.occlusionStrength = this.occlusionStrength;\r\n serializationObject.occlusionThreshold = this.occlusionThreshold;\r\n serializationObject.useDepthOcclusion = this.useDepthOcclusion;\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n this.outlineColor = Color3.FromArray(serializationObject.outlineColor);\r\n this.outlineThickness = serializationObject.outlineThickness;\r\n this.occlusionStrength = serializationObject.occlusionStrength;\r\n this.occlusionThreshold = serializationObject.occlusionThreshold;\r\n this.useDepthOcclusion = serializationObject.useDepthOcclusion ?? true;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for selectionOutlineLayerBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterSelectionOutlineLayerBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.NodeRenderGraphSelectionOutlineLayerBlock\", NodeRenderGraphSelectionOutlineLayerBlock);\r\n}\r\n"]}
@@ -13,8 +13,9 @@ export declare class FrameGraphSelectionOutlineLayerTask extends FrameGraphBaseL
13
13
  * The depth texture to use when rendering the selection outline layer.
14
14
  * It must store the scene depth in camera view space Z, normalized or not.
15
15
  * If not normalized, the storeCameraSpaceZ option must be passed to the constructor.
16
+ * Required only when layer.useDepthOcclusion is true and layer.occlusionStrength is greater than zero.
16
17
  */
17
- depthTexture: FrameGraphTextureHandle;
18
+ depthTexture: FrameGraphTextureHandle | undefined;
18
19
  /**
19
20
  * Constructs a new selection outline layer task.
20
21
  * @param name Name of the task.
@@ -22,12 +22,15 @@ export class FrameGraphSelectionOutlineLayerTask extends FrameGraphBaseLayerTask
22
22
  return "FrameGraphSelectionOutlineLayerTask";
23
23
  }
24
24
  record() {
25
- if (this.depthTexture === undefined) {
25
+ const useDepthOcclusion = this.layer.useDepthOcclusion && this.layer.occlusionStrength > 0;
26
+ if (useDepthOcclusion && this.depthTexture === undefined) {
26
27
  throw new Error(`FrameGraphSelectionOutlineLayerTask "${this.name}": depthTexture is required`);
27
28
  }
28
29
  super.record(false, (context, effect) => {
29
- context.bindTextureHandle(effect, "depthSampler", this.depthTexture);
30
30
  context.bindTextureHandle(effect, "maskSampler", this._objectRendererForLayerTask.outputTexture);
31
+ if (useDepthOcclusion) {
32
+ context.bindTextureHandle(effect, "depthSampler", this.depthTexture);
33
+ }
31
34
  });
32
35
  this.layer.textureWidth = this._layerTextureDimensions.width;
33
36
  this.layer.textureHeight = this._layerTextureDimensions.height;
@@ -1 +1 @@
1
- {"version":3,"file":"selectionOutlineTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Layers/selectionOutlineTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAC;AAEvF;;GAEG;AACH,MAAM,OAAO,mCAAoC,SAAQ,uBAAuB;IAa5E;;;;;;OAMG;IACH,YAAY,IAAY,EAAE,UAAsB,EAAE,KAAY,EAAE,OAA2C;QACvG,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,iDAAoC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEpJ,IAAI,CAAC,2BAA2B,CAAC,UAAU,GAAG;YAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE;YACnC,eAAe,EAAE,EAAE;SACtB,CAAC;IACN,CAAC;IAEe,YAAY;QACxB,OAAO,qCAAqC,CAAC;IACjD,CAAC;IAEe,MAAM;QAClB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;QACpG,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,OAAgC,EAAE,MAAc,EAAE,EAAE;YACrE,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACrE,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;IACnE,CAAC;CACJ","sourcesContent":["import { type FrameGraph, type Scene, type IThinSelectionOutlineLayerOptions, type FrameGraphTextureHandle, type Effect, type FrameGraphRenderContext } from \"core/index\";\r\nimport { ThinSelectionOutlineLayer } from \"core/Layers/thinSelectionOutlineLayer\";\r\nimport { FrameGraphBaseLayerTask, FrameGraphBaseLayerBlurType } from \"./baseLayerTask\";\r\n\r\n/**\r\n * Task which applies a selection outline effect to a texture.\r\n */\r\nexport class FrameGraphSelectionOutlineLayerTask extends FrameGraphBaseLayerTask {\r\n /**\r\n * The selection outline layer object. Use this object to update the selection outline layer properties (e.g. intensity, blur kernel size).\r\n */\r\n public override readonly layer: ThinSelectionOutlineLayer;\r\n\r\n /**\r\n * The depth texture to use when rendering the selection outline layer.\r\n * It must store the scene depth in camera view space Z, normalized or not.\r\n * If not normalized, the storeCameraSpaceZ option must be passed to the constructor.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Constructs a new selection outline layer task.\r\n * @param name Name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n * @param scene The scene to render the selection outline layer in.\r\n * @param options Options for the selection outline layer.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: IThinSelectionOutlineLayerOptions) {\r\n super(name, frameGraph, scene, new ThinSelectionOutlineLayer(name, scene, options, true), 0, FrameGraphBaseLayerBlurType.None, false, false, false);\r\n\r\n this._objectRendererForLayerTask.objectList = {\r\n meshes: this.layer._selection || [],\r\n particleSystems: [],\r\n };\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphSelectionOutlineLayerTask\";\r\n }\r\n\r\n public override record() {\r\n if (this.depthTexture === undefined) {\r\n throw new Error(`FrameGraphSelectionOutlineLayerTask \"${this.name}\": depthTexture is required`);\r\n }\r\n\r\n super.record(false, (context: FrameGraphRenderContext, effect: Effect) => {\r\n context.bindTextureHandle(effect, \"depthSampler\", this.depthTexture);\r\n context.bindTextureHandle(effect, \"maskSampler\", this._objectRendererForLayerTask.outputTexture);\r\n });\r\n\r\n this.layer.textureWidth = this._layerTextureDimensions.width;\r\n this.layer.textureHeight = this._layerTextureDimensions.height;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"selectionOutlineTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Layers/selectionOutlineTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAA+B,MAAM,iBAAiB,CAAC;AAEvF;;GAEG;AACH,MAAM,OAAO,mCAAoC,SAAQ,uBAAuB;IAc5E;;;;;;OAMG;IACH,YAAY,IAAY,EAAE,UAAsB,EAAE,KAAY,EAAE,OAA2C;QACvG,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,iDAAoC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEpJ,IAAI,CAAC,2BAA2B,CAAC,UAAU,GAAG;YAC1C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE;YACnC,eAAe,EAAE,EAAE;SACtB,CAAC;IACN,CAAC;IAEe,YAAY;QACxB,OAAO,qCAAqC,CAAC;IACjD,CAAC;IAEe,MAAM;QAClB,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAE3F,IAAI,iBAAiB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;QACpG,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,OAAgC,EAAE,MAAc,EAAE,EAAE;YACrE,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;YACjG,IAAI,iBAAiB,EAAE,CAAC;gBACpB,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,YAAa,CAAC,CAAC;YAC1E,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;IACnE,CAAC;CACJ","sourcesContent":["import { type FrameGraph, type Scene, type IThinSelectionOutlineLayerOptions, type FrameGraphTextureHandle, type Effect, type FrameGraphRenderContext } from \"core/index\";\r\nimport { ThinSelectionOutlineLayer } from \"core/Layers/thinSelectionOutlineLayer\";\r\nimport { FrameGraphBaseLayerTask, FrameGraphBaseLayerBlurType } from \"./baseLayerTask\";\r\n\r\n/**\r\n * Task which applies a selection outline effect to a texture.\r\n */\r\nexport class FrameGraphSelectionOutlineLayerTask extends FrameGraphBaseLayerTask {\r\n /**\r\n * The selection outline layer object. Use this object to update the selection outline layer properties (e.g. intensity, blur kernel size).\r\n */\r\n public override readonly layer: ThinSelectionOutlineLayer;\r\n\r\n /**\r\n * The depth texture to use when rendering the selection outline layer.\r\n * It must store the scene depth in camera view space Z, normalized or not.\r\n * If not normalized, the storeCameraSpaceZ option must be passed to the constructor.\r\n * Required only when layer.useDepthOcclusion is true and layer.occlusionStrength is greater than zero.\r\n */\r\n public depthTexture: FrameGraphTextureHandle | undefined;\r\n\r\n /**\r\n * Constructs a new selection outline layer task.\r\n * @param name Name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n * @param scene The scene to render the selection outline layer in.\r\n * @param options Options for the selection outline layer.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: IThinSelectionOutlineLayerOptions) {\r\n super(name, frameGraph, scene, new ThinSelectionOutlineLayer(name, scene, options, true), 0, FrameGraphBaseLayerBlurType.None, false, false, false);\r\n\r\n this._objectRendererForLayerTask.objectList = {\r\n meshes: this.layer._selection || [],\r\n particleSystems: [],\r\n };\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphSelectionOutlineLayerTask\";\r\n }\r\n\r\n public override record() {\r\n const useDepthOcclusion = this.layer.useDepthOcclusion && this.layer.occlusionStrength > 0;\r\n\r\n if (useDepthOcclusion && this.depthTexture === undefined) {\r\n throw new Error(`FrameGraphSelectionOutlineLayerTask \"${this.name}\": depthTexture is required`);\r\n }\r\n\r\n super.record(false, (context: FrameGraphRenderContext, effect: Effect) => {\r\n context.bindTextureHandle(effect, \"maskSampler\", this._objectRendererForLayerTask.outputTexture);\r\n if (useDepthOcclusion) {\r\n context.bindTextureHandle(effect, \"depthSampler\", this.depthTexture!);\r\n }\r\n });\r\n\r\n this.layer.textureWidth = this._layerTextureDimensions.width;\r\n this.layer.textureHeight = this._layerTextureDimensions.height;\r\n }\r\n}\r\n"]}
@@ -49,6 +49,12 @@ export declare class SelectionOutlineLayer extends EffectLayer {
49
49
  */
50
50
  get occlusionThreshold(): number;
51
51
  set occlusionThreshold(value: number);
52
+ /**
53
+ * Whether to use depth when drawing selection outlines.
54
+ * Disable this to avoid depth renderer usage; selected outlines will not be clipped by scene or selected geometry.
55
+ */
56
+ get useDepthOcclusion(): boolean;
57
+ set useDepthOcclusion(value: boolean);
52
58
  private _options;
53
59
  protected readonly _thinEffectLayer: ThinSelectionOutlineLayer;
54
60
  /**
@@ -58,10 +64,11 @@ export declare class SelectionOutlineLayer extends EffectLayer {
58
64
  * @param options Sets of none mandatory options to use with the layer (see ISelectionOutlineLayerOptions for more information)
59
65
  */
60
66
  constructor(name: string, scene?: Scene, options?: Partial<ISelectionOutlineLayerOptions>);
67
+ private _enableDepthRenderer;
61
68
  /**
62
69
  * Checks if the layer is ready to render.
63
- * When selections are active, this also lazily creates the depth renderer
64
- * and checks that its depth map is ready.
70
+ * When selections are active and depth occlusion is enabled, this also
71
+ * lazily creates the depth renderer and checks that its depth map is ready.
65
72
  * @returns true if the layer is ready
66
73
  */
67
74
  isLayerReady(): boolean;
@@ -6,6 +6,8 @@ import { EffectLayer } from "./effectLayer.js";
6
6
 
7
7
  import { SerializationHelper } from "../Misc/decorators.serialization.js";
8
8
  import { ThinSelectionOutlineLayer } from "./thinSelectionOutlineLayer.js";
9
+ import { DepthRenderer } from "../Rendering/depthRenderer.pure.js";
10
+ import { RegisterDepthRendererSceneComponent } from "../Rendering/depthRendererSceneComponent.pure.js";
9
11
  import { RegisterClass } from "../Misc/typeStore.js";
10
12
  /**
11
13
  * The selection outline layer Helps adding a outline effect around a mesh.
@@ -56,6 +58,17 @@ export class SelectionOutlineLayer extends EffectLayer {
56
58
  set occlusionThreshold(value) {
57
59
  this._thinEffectLayer.occlusionThreshold = value;
58
60
  }
61
+ /**
62
+ * Whether to use depth when drawing selection outlines.
63
+ * Disable this to avoid depth renderer usage; selected outlines will not be clipped by scene or selected geometry.
64
+ */
65
+ get useDepthOcclusion() {
66
+ return this._thinEffectLayer.useDepthOcclusion;
67
+ }
68
+ set useDepthOcclusion(value) {
69
+ this._thinEffectLayer.useDepthOcclusion = value;
70
+ this._options.useDepthOcclusion = value;
71
+ }
59
72
  /**
60
73
  * Instantiates a new selection outline Layer and references it to the scene..
61
74
  * @param name The name of the layer
@@ -77,6 +90,7 @@ export class SelectionOutlineLayer extends EffectLayer {
77
90
  forceGLSL: false,
78
91
  storeCameraSpaceZ: false,
79
92
  outlineMethod: 0,
93
+ useDepthOcclusion: true,
80
94
  ...options,
81
95
  };
82
96
  // Fall back to a supported mask texture type if the device doesn't support rendering to float framebuffers
@@ -92,18 +106,22 @@ export class SelectionOutlineLayer extends EffectLayer {
92
106
  // Do not render as long as no meshes have been added
93
107
  this._shouldRender = false;
94
108
  }
109
+ _enableDepthRenderer() {
110
+ RegisterDepthRendererSceneComponent(DepthRenderer);
111
+ return this._scene.enableDepthRenderer();
112
+ }
95
113
  /**
96
114
  * Checks if the layer is ready to render.
97
- * When selections are active, this also lazily creates the depth renderer
98
- * and checks that its depth map is ready.
115
+ * When selections are active and depth occlusion is enabled, this also
116
+ * lazily creates the depth renderer and checks that its depth map is ready.
99
117
  * @returns true if the layer is ready
100
118
  */
101
119
  isLayerReady() {
102
120
  if (!super.isLayerReady()) {
103
121
  return false;
104
122
  }
105
- if (this.shouldRender()) {
106
- const depthRenderer = this._scene.enableDepthRenderer();
123
+ if (this.shouldRender() && this.useDepthOcclusion && this.occlusionStrength > 0) {
124
+ const depthRenderer = this._enableDepthRenderer();
107
125
  if (!depthRenderer.getDepthMap().isReadyForRendering()) {
108
126
  return false;
109
127
  }
@@ -135,8 +153,10 @@ export class SelectionOutlineLayer extends EffectLayer {
135
153
  this._textures = [];
136
154
  this._thinEffectLayer.bindTexturesForCompose = (effect) => {
137
155
  effect.setTexture("maskSampler", this._mainTexture);
138
- const depthRenderer = this._scene.enableDepthRenderer();
139
- effect.setTexture("depthSampler", depthRenderer.getDepthMap());
156
+ if (this.useDepthOcclusion && this.occlusionStrength > 0) {
157
+ const depthRenderer = this._enableDepthRenderer();
158
+ effect.setTexture("depthSampler", depthRenderer.getDepthMap());
159
+ }
140
160
  const mainTextureDesiredSize = this._mainTextureDesiredSize;
141
161
  this._thinEffectLayer.textureWidth = mainTextureDesiredSize.width;
142
162
  this._thinEffectLayer.textureHeight = mainTextureDesiredSize.height;
@@ -338,6 +358,9 @@ __decorate([
338
358
  __decorate([
339
359
  serialize()
340
360
  ], SelectionOutlineLayer.prototype, "occlusionThreshold", null);
361
+ __decorate([
362
+ serialize()
363
+ ], SelectionOutlineLayer.prototype, "useDepthOcclusion", null);
341
364
  __decorate([
342
365
  serialize("options")
343
366
  ], SelectionOutlineLayer.prototype, "_options", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"selectionOutlineLayer.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/selectionOutlineLayer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsColor3 } from \"../Misc/decorators\";\r\nimport { Scene } from \"../scene.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type Effect } from \"../Materials/effect.pure\";\r\nimport { type Material } from \"../Materials/material.pure\";\r\nimport { EffectLayer } from \"./effectLayer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { ThinSelectionOutlineLayer, type IThinSelectionOutlineLayerOptions } from \"./thinSelectionOutlineLayer\";\r\n\r\nimport { type Color3 } from \"../Maths/math.color.pure\";\r\nimport { type Nullable } from \"../types\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * Selection outline layer options. This helps customizing the behaviour\r\n * of the selection outline layer.\r\n */\r\nexport interface ISelectionOutlineLayerOptions extends IThinSelectionOutlineLayerOptions {\r\n /**\r\n * Enable MSAA by choosing the number of samples. Default: 1\r\n */\r\n mainTextureSamples?: number;\r\n}\r\n\r\n/**\r\n * The selection outline layer Helps adding a outline effect around a mesh.\r\n *\r\n * Once instantiated in a scene, simply use the addMesh or removeMesh method to add or remove\r\n * outlined meshes to your scene.\r\n */\r\nexport class SelectionOutlineLayer extends EffectLayer {\r\n /**\r\n * Effect Name of the selection outline layer.\r\n */\r\n public static get EffectName() {\r\n return ThinSelectionOutlineLayer.EffectName;\r\n }\r\n\r\n /**\r\n * The outline color (default (1, 0.5, 0))\r\n */\r\n @serializeAsColor3()\r\n public get outlineColor(): Color3 {\r\n return this._thinEffectLayer.outlineColor;\r\n }\r\n\r\n public set outlineColor(value: Color3) {\r\n this._thinEffectLayer.outlineColor = value;\r\n }\r\n\r\n /**\r\n * The thickness of the edges (default: 2.0)\r\n */\r\n @serialize()\r\n public get outlineThickness(): number {\r\n return this._thinEffectLayer.outlineThickness;\r\n }\r\n\r\n public set outlineThickness(value: number) {\r\n this._thinEffectLayer.outlineThickness = value;\r\n }\r\n\r\n /**\r\n * The strength of the occlusion effect (default: 0.8)\r\n */\r\n @serialize()\r\n public get occlusionStrength(): number {\r\n return this._thinEffectLayer.occlusionStrength;\r\n }\r\n\r\n public set occlusionStrength(value: number) {\r\n this._thinEffectLayer.occlusionStrength = value;\r\n }\r\n\r\n /**\r\n * The occlusion threshold (default: 0.01)\r\n */\r\n @serialize()\r\n public get occlusionThreshold(): number {\r\n return this._thinEffectLayer.occlusionThreshold;\r\n }\r\n\r\n public set occlusionThreshold(value: number) {\r\n this._thinEffectLayer.occlusionThreshold = value;\r\n }\r\n\r\n @serialize(\"options\")\r\n private _options: Required<ISelectionOutlineLayerOptions>;\r\n\r\n protected override readonly _thinEffectLayer: ThinSelectionOutlineLayer;\r\n\r\n /**\r\n * Instantiates a new selection outline Layer and references it to the scene..\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param options Sets of none mandatory options to use with the layer (see ISelectionOutlineLayerOptions for more information)\r\n */\r\n public constructor(name: string, scene?: Scene, options?: Partial<ISelectionOutlineLayerOptions>) {\r\n super(name, scene, options !== undefined ? !!options.forceGLSL : false, new ThinSelectionOutlineLayer(name, scene, options));\r\n\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 1.0,\r\n mainTextureFixedSize: 0,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n mainTextureSamples: 1,\r\n renderingGroupId: -1,\r\n mainTextureType: Constants.TEXTURETYPE_FLOAT,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RG,\r\n forceGLSL: false,\r\n storeCameraSpaceZ: false,\r\n outlineMethod: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL,\r\n ...options,\r\n };\r\n\r\n // Fall back to a supported mask texture type if the device doesn't support rendering to float framebuffers\r\n // or linear filtering of float textures (e.g. OES_texture_float_linear missing on some iOS versions)\r\n if (this._options.mainTextureType === Constants.TEXTURETYPE_FLOAT && !(this._engine.getCaps().textureFloatRender && this._engine.getCaps().textureFloatLinearFiltering)) {\r\n this._options.mainTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n if (this._options.mainTextureType === Constants.TEXTURETYPE_HALF_FLOAT && !this._engine.getCaps().textureHalfFloatRender && !this._options.storeCameraSpaceZ) {\r\n this._options.mainTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n }\r\n\r\n // Initialize the layer\r\n this._init(this._options);\r\n\r\n // Do not render as long as no meshes have been added\r\n this._shouldRender = false;\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to render.\r\n * When selections are active, this also lazily creates the depth renderer\r\n * and checks that its depth map is ready.\r\n * @returns true if the layer is ready\r\n */\r\n public override isLayerReady(): boolean {\r\n if (!super.isLayerReady()) {\r\n return false;\r\n }\r\n\r\n if (this.shouldRender()) {\r\n const depthRenderer = this._scene.enableDepthRenderer();\r\n if (!depthRenderer.getDepthMap().isReadyForRendering()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @returns The effect name\r\n */\r\n public getEffectName(): string {\r\n return SelectionOutlineLayer.EffectName;\r\n }\r\n\r\n protected override _numInternalDraws(): number {\r\n return 1; // draw depth mask on main pass and outline on merge pass\r\n }\r\n\r\n /**\r\n * Create the merge effect. This is the shader use to blit the information back\r\n * to the main canvas at the end of the scene rendering.\r\n * @returns The effect created\r\n */\r\n protected _createMergeEffect(): Effect {\r\n return this._thinEffectLayer._createMergeEffect();\r\n }\r\n\r\n /**\r\n * Creates the render target textures and post processes used in the selection outline layer.\r\n */\r\n protected _createTextureAndPostProcesses(): void {\r\n this._textures = [];\r\n\r\n this._thinEffectLayer.bindTexturesForCompose = (effect: Effect): void => {\r\n effect.setTexture(\"maskSampler\", this._mainTexture);\r\n const depthRenderer = this._scene.enableDepthRenderer();\r\n effect.setTexture(\"depthSampler\", depthRenderer.getDepthMap());\r\n\r\n const mainTextureDesiredSize = this._mainTextureDesiredSize;\r\n this._thinEffectLayer.textureWidth = mainTextureDesiredSize.width;\r\n this._thinEffectLayer.textureHeight = mainTextureDesiredSize.height;\r\n };\r\n\r\n this._thinEffectLayer._createTextureAndPostProcesses();\r\n\r\n this._postProcesses = [];\r\n\r\n this._mainTexture.samples = this._options.mainTextureSamples;\r\n this._mainTexture.onAfterUnbindObservable.add(() => {\r\n // glow layer and highlight layer both call this._scene.postProcessManager.directRender\r\n // when you call this._scene.postProcessManager.directRender, it has 4 side effects:\r\n // 1. binds the framebuffer\r\n // 2. setAlphaMode(ALPHA_DISABLE)\r\n // 3. setDepthBuffer(true)\r\n // 4. setDepthWrite(true)\r\n // glow layer and highlight layer are restore framebuffer and depends on other side effects\r\n // but for now 3 and 4 are not needed to resolve the state management issue, so we just restore alpha mode\r\n this._scene.getEngine().setAlphaMode(Constants.ALPHA_DISABLE);\r\n });\r\n }\r\n\r\n /**\r\n * Creates the main texture for the effect layer.\r\n */\r\n protected override _createMainTexture(): void {\r\n super._createMainTexture();\r\n // set the render list for selective rendering\r\n this._mainTexture.renderList = this._thinEffectLayer._selection;\r\n }\r\n\r\n /**\r\n * @returns whether or not the layer needs stencil enabled during the mesh rendering.\r\n */\r\n public needStencil(): boolean {\r\n return this._thinEffectLayer.needStencil();\r\n }\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @returns true if ready otherwise, false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n return this._thinEffectLayer.isReady(subMesh, useInstances);\r\n }\r\n\r\n /**\r\n * Implementation specific of rendering the generating effect on the main canvas.\r\n * @param effect The effect used to render through\r\n * @param renderIndex\r\n */\r\n protected _internalRender(effect: Effect, renderIndex: number): void {\r\n this._thinEffectLayer._internalCompose(effect, renderIndex);\r\n }\r\n\r\n /**\r\n * @returns true if the layer contains information to display, otherwise false.\r\n */\r\n public override shouldRender(): boolean {\r\n return this._thinEffectLayer.shouldRender();\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected override _shouldRenderMesh(mesh: Mesh): boolean {\r\n return this._thinEffectLayer._shouldRenderMesh(mesh);\r\n }\r\n\r\n /**\r\n * Returns true if the mesh can be rendered, otherwise false.\r\n * @param mesh The mesh to render\r\n * @param material The material used on the mesh\r\n * @returns true if it can be rendered otherwise false\r\n */\r\n protected override _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return this._thinEffectLayer._canRenderMesh(mesh, material);\r\n }\r\n\r\n /**\r\n * Adds specific effects defines.\r\n * @param defines The defines to add specifics to.\r\n */\r\n protected override _addCustomEffectDefines(defines: string[]): void {\r\n this._thinEffectLayer._addCustomEffectDefines(defines);\r\n }\r\n\r\n /**\r\n * Sets the required values for both the emissive texture and and the main color.\r\n * @param mesh\r\n * @param subMesh\r\n * @param material\r\n */\r\n protected _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void {\r\n this._thinEffectLayer._setEmissiveTextureAndColor(mesh, subMesh, material);\r\n }\r\n\r\n /**\r\n * Determine if a given mesh will be highlighted by the current SelectionOutlineLayer\r\n * @param mesh mesh to test\r\n * @returns true if the mesh will be highlighted by the current SelectionOutlineLayer\r\n */\r\n public override hasMesh(mesh: AbstractMesh): boolean {\r\n return this._thinEffectLayer.hasMesh(mesh);\r\n }\r\n\r\n /**\r\n * Remove all the meshes currently referenced in the selection outline layer\r\n */\r\n public clearSelection(): void {\r\n this._thinEffectLayer.clearSelection();\r\n this._mainTexture.renderList = this._thinEffectLayer._selection; // update render list\r\n }\r\n\r\n /**\r\n * Adds mesh or group of mesh to the current selection\r\n *\r\n * If a group of meshes is provided, they will outline as a single unit\r\n * @param meshOrGroup Meshes to add to the selection\r\n */\r\n public addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\r\n this._thinEffectLayer.addSelection(meshOrGroup);\r\n }\r\n\r\n /**\r\n * Adds mesh or group of mesh to the current selection\r\n * @param meshOrGroup Meshes to remove from the selection\r\n */\r\n public removeSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\r\n this._thinEffectLayer.removeSelection(meshOrGroup);\r\n }\r\n\r\n /**\r\n * Free any resources and references associated to a mesh.\r\n * Internal use\r\n * @param mesh The mesh to free.\r\n * @internal\r\n */\r\n public _disposeMesh(mesh: Mesh): void {\r\n this._thinEffectLayer._disposeMesh(mesh);\r\n }\r\n\r\n /**\r\n * Gets the class name of the effect layer\r\n * @returns the string with the class name of the effect layer\r\n */\r\n public override getClassName(): string {\r\n return \"SelectionOutlineLayer\";\r\n }\r\n\r\n /**\r\n * Serializes this SelectionOutline layer\r\n * @returns a serialized SelectionOutline layer object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.SelectionOutlineLayer\";\r\n\r\n // Selected meshes\r\n serializationObject.selection = [];\r\n\r\n const selection = this._thinEffectLayer._selection;\r\n if (selection) {\r\n const meshUniqueIdToSelectionId = this._thinEffectLayer._meshUniqueIdToSelectionId;\r\n\r\n // selection can be sparse since _removeMesh can remove entries\r\n const selectionMap: {\r\n [uniqueId: number]: {\r\n meshIds: string[];\r\n };\r\n } = {};\r\n\r\n for (let i = 0; i < selection.length; ++i) {\r\n const mesh = selection[i];\r\n const selectionId = meshUniqueIdToSelectionId[mesh.uniqueId];\r\n\r\n if (!selectionMap[selectionId]) {\r\n selectionMap[selectionId] = {\r\n meshIds: [],\r\n };\r\n }\r\n selectionMap[selectionId].meshIds.push(mesh.id);\r\n }\r\n serializationObject.selection = selectionMap;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a SelectionOutline layer from parsed SelectionOutline layer data\r\n * @param parsedSelectionOutlineLayer defines the SelectionOutline layer data\r\n * @param scene defines the current scene\r\n * @param rootUrl defines the root URL containing the SelectionOutline layer information\r\n * @returns a parsed SelectionOutline layer\r\n */\r\n public static override Parse(parsedSelectionOutlineLayer: any, scene: Scene, rootUrl: string): SelectionOutlineLayer {\r\n const selectionOutlineLayer = SerializationHelper.Parse(\r\n () => new SelectionOutlineLayer(parsedSelectionOutlineLayer.name, scene, parsedSelectionOutlineLayer.options),\r\n parsedSelectionOutlineLayer,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n const selectionMap = parsedSelectionOutlineLayer.selection as { [uniqueId: number]: { meshIds: string[] } };\r\n\r\n // Selected meshes\r\n for (const outlinedMeshes of Object.values(selectionMap)) {\r\n const meshes: AbstractMesh[] = [];\r\n for (let meshIndex = 0; meshIndex < outlinedMeshes.meshIds.length; meshIndex++) {\r\n const meshId = outlinedMeshes.meshIds[meshIndex];\r\n const mesh = scene.getMeshById(meshId);\r\n if (mesh) {\r\n meshes.push(mesh);\r\n }\r\n }\r\n\r\n selectionOutlineLayer.addSelection(meshes);\r\n }\r\n\r\n return selectionOutlineLayer;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for selectionOutlineLayer.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterSelectionOutlineLayer(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n Scene.prototype.getSelectionOutlineLayerByName = function (name: string): Nullable<SelectionOutlineLayer> {\r\n for (let index = 0; index < this.effectLayers?.length; index++) {\r\n if (this.effectLayers[index].name === name && this.effectLayers[index].getEffectName() === SelectionOutlineLayer.EffectName) {\r\n return (<any>this.effectLayers[index]) as SelectionOutlineLayer;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n RegisterClass(\"BABYLON.SelectionOutlineLayer\", SelectionOutlineLayer);\r\n}\r\n"]}
1
+ {"version":3,"file":"selectionOutlineLayer.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/selectionOutlineLayer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { serialize, serializeAsColor3 } from \"../Misc/decorators\";\r\nimport { Scene } from \"../scene.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh.pure\";\r\nimport { type Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type Effect } from \"../Materials/effect.pure\";\r\nimport { type Material } from \"../Materials/material.pure\";\r\nimport { EffectLayer } from \"./effectLayer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SerializationHelper } from \"../Misc/decorators.serialization\";\r\nimport { ThinSelectionOutlineLayer, type IThinSelectionOutlineLayerOptions } from \"./thinSelectionOutlineLayer\";\r\nimport { DepthRenderer } from \"../Rendering/depthRenderer.pure\";\r\nimport { RegisterDepthRendererSceneComponent } from \"../Rendering/depthRendererSceneComponent.pure\";\r\n\r\nimport { type Color3 } from \"../Maths/math.color.pure\";\r\nimport { type Nullable } from \"../types\";\r\nimport { RegisterClass } from \"../Misc/typeStore\";\r\n\r\n/**\r\n * Selection outline layer options. This helps customizing the behaviour\r\n * of the selection outline layer.\r\n */\r\nexport interface ISelectionOutlineLayerOptions extends IThinSelectionOutlineLayerOptions {\r\n /**\r\n * Enable MSAA by choosing the number of samples. Default: 1\r\n */\r\n mainTextureSamples?: number;\r\n}\r\n\r\n/**\r\n * The selection outline layer Helps adding a outline effect around a mesh.\r\n *\r\n * Once instantiated in a scene, simply use the addMesh or removeMesh method to add or remove\r\n * outlined meshes to your scene.\r\n */\r\nexport class SelectionOutlineLayer extends EffectLayer {\r\n /**\r\n * Effect Name of the selection outline layer.\r\n */\r\n public static get EffectName() {\r\n return ThinSelectionOutlineLayer.EffectName;\r\n }\r\n\r\n /**\r\n * The outline color (default (1, 0.5, 0))\r\n */\r\n @serializeAsColor3()\r\n public get outlineColor(): Color3 {\r\n return this._thinEffectLayer.outlineColor;\r\n }\r\n\r\n public set outlineColor(value: Color3) {\r\n this._thinEffectLayer.outlineColor = value;\r\n }\r\n\r\n /**\r\n * The thickness of the edges (default: 2.0)\r\n */\r\n @serialize()\r\n public get outlineThickness(): number {\r\n return this._thinEffectLayer.outlineThickness;\r\n }\r\n\r\n public set outlineThickness(value: number) {\r\n this._thinEffectLayer.outlineThickness = value;\r\n }\r\n\r\n /**\r\n * The strength of the occlusion effect (default: 0.8)\r\n */\r\n @serialize()\r\n public get occlusionStrength(): number {\r\n return this._thinEffectLayer.occlusionStrength;\r\n }\r\n\r\n public set occlusionStrength(value: number) {\r\n this._thinEffectLayer.occlusionStrength = value;\r\n }\r\n\r\n /**\r\n * The occlusion threshold (default: 0.01)\r\n */\r\n @serialize()\r\n public get occlusionThreshold(): number {\r\n return this._thinEffectLayer.occlusionThreshold;\r\n }\r\n\r\n public set occlusionThreshold(value: number) {\r\n this._thinEffectLayer.occlusionThreshold = value;\r\n }\r\n\r\n /**\r\n * Whether to use depth when drawing selection outlines.\r\n * Disable this to avoid depth renderer usage; selected outlines will not be clipped by scene or selected geometry.\r\n */\r\n @serialize()\r\n public get useDepthOcclusion(): boolean {\r\n return this._thinEffectLayer.useDepthOcclusion;\r\n }\r\n\r\n public set useDepthOcclusion(value: boolean) {\r\n this._thinEffectLayer.useDepthOcclusion = value;\r\n this._options.useDepthOcclusion = value;\r\n }\r\n\r\n @serialize(\"options\")\r\n private _options: Required<ISelectionOutlineLayerOptions>;\r\n\r\n protected override readonly _thinEffectLayer: ThinSelectionOutlineLayer;\r\n\r\n /**\r\n * Instantiates a new selection outline Layer and references it to the scene..\r\n * @param name The name of the layer\r\n * @param scene The scene to use the layer in\r\n * @param options Sets of none mandatory options to use with the layer (see ISelectionOutlineLayerOptions for more information)\r\n */\r\n public constructor(name: string, scene?: Scene, options?: Partial<ISelectionOutlineLayerOptions>) {\r\n super(name, scene, options !== undefined ? !!options.forceGLSL : false, new ThinSelectionOutlineLayer(name, scene, options));\r\n\r\n // Adapt options\r\n this._options = {\r\n mainTextureRatio: 1.0,\r\n mainTextureFixedSize: 0,\r\n alphaBlendingMode: Constants.ALPHA_COMBINE,\r\n camera: null,\r\n mainTextureSamples: 1,\r\n renderingGroupId: -1,\r\n mainTextureType: Constants.TEXTURETYPE_FLOAT,\r\n mainTextureFormat: Constants.TEXTUREFORMAT_RG,\r\n forceGLSL: false,\r\n storeCameraSpaceZ: false,\r\n outlineMethod: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL,\r\n useDepthOcclusion: true,\r\n ...options,\r\n };\r\n\r\n // Fall back to a supported mask texture type if the device doesn't support rendering to float framebuffers\r\n // or linear filtering of float textures (e.g. OES_texture_float_linear missing on some iOS versions)\r\n if (this._options.mainTextureType === Constants.TEXTURETYPE_FLOAT && !(this._engine.getCaps().textureFloatRender && this._engine.getCaps().textureFloatLinearFiltering)) {\r\n this._options.mainTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n if (this._options.mainTextureType === Constants.TEXTURETYPE_HALF_FLOAT && !this._engine.getCaps().textureHalfFloatRender && !this._options.storeCameraSpaceZ) {\r\n this._options.mainTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n }\r\n\r\n // Initialize the layer\r\n this._init(this._options);\r\n\r\n // Do not render as long as no meshes have been added\r\n this._shouldRender = false;\r\n }\r\n\r\n private _enableDepthRenderer(): DepthRenderer {\r\n RegisterDepthRendererSceneComponent(DepthRenderer);\r\n return this._scene.enableDepthRenderer();\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to render.\r\n * When selections are active and depth occlusion is enabled, this also\r\n * lazily creates the depth renderer and checks that its depth map is ready.\r\n * @returns true if the layer is ready\r\n */\r\n public override isLayerReady(): boolean {\r\n if (!super.isLayerReady()) {\r\n return false;\r\n }\r\n\r\n if (this.shouldRender() && this.useDepthOcclusion && this.occlusionStrength > 0) {\r\n const depthRenderer = this._enableDepthRenderer();\r\n if (!depthRenderer.getDepthMap().isReadyForRendering()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the effect name of the layer.\r\n * @returns The effect name\r\n */\r\n public getEffectName(): string {\r\n return SelectionOutlineLayer.EffectName;\r\n }\r\n\r\n protected override _numInternalDraws(): number {\r\n return 1; // draw depth mask on main pass and outline on merge pass\r\n }\r\n\r\n /**\r\n * Create the merge effect. This is the shader use to blit the information back\r\n * to the main canvas at the end of the scene rendering.\r\n * @returns The effect created\r\n */\r\n protected _createMergeEffect(): Effect {\r\n return this._thinEffectLayer._createMergeEffect();\r\n }\r\n\r\n /**\r\n * Creates the render target textures and post processes used in the selection outline layer.\r\n */\r\n protected _createTextureAndPostProcesses(): void {\r\n this._textures = [];\r\n\r\n this._thinEffectLayer.bindTexturesForCompose = (effect: Effect): void => {\r\n effect.setTexture(\"maskSampler\", this._mainTexture);\r\n if (this.useDepthOcclusion && this.occlusionStrength > 0) {\r\n const depthRenderer = this._enableDepthRenderer();\r\n effect.setTexture(\"depthSampler\", depthRenderer.getDepthMap());\r\n }\r\n\r\n const mainTextureDesiredSize = this._mainTextureDesiredSize;\r\n this._thinEffectLayer.textureWidth = mainTextureDesiredSize.width;\r\n this._thinEffectLayer.textureHeight = mainTextureDesiredSize.height;\r\n };\r\n\r\n this._thinEffectLayer._createTextureAndPostProcesses();\r\n\r\n this._postProcesses = [];\r\n\r\n this._mainTexture.samples = this._options.mainTextureSamples;\r\n this._mainTexture.onAfterUnbindObservable.add(() => {\r\n // glow layer and highlight layer both call this._scene.postProcessManager.directRender\r\n // when you call this._scene.postProcessManager.directRender, it has 4 side effects:\r\n // 1. binds the framebuffer\r\n // 2. setAlphaMode(ALPHA_DISABLE)\r\n // 3. setDepthBuffer(true)\r\n // 4. setDepthWrite(true)\r\n // glow layer and highlight layer are restore framebuffer and depends on other side effects\r\n // but for now 3 and 4 are not needed to resolve the state management issue, so we just restore alpha mode\r\n this._scene.getEngine().setAlphaMode(Constants.ALPHA_DISABLE);\r\n });\r\n }\r\n\r\n /**\r\n * Creates the main texture for the effect layer.\r\n */\r\n protected override _createMainTexture(): void {\r\n super._createMainTexture();\r\n // set the render list for selective rendering\r\n this._mainTexture.renderList = this._thinEffectLayer._selection;\r\n }\r\n\r\n /**\r\n * @returns whether or not the layer needs stencil enabled during the mesh rendering.\r\n */\r\n public needStencil(): boolean {\r\n return this._thinEffectLayer.needStencil();\r\n }\r\n\r\n /**\r\n * Checks for the readiness of the element composing the layer.\r\n * @param subMesh the mesh to check for\r\n * @param useInstances specify whether or not to use instances to render the mesh\r\n * @returns true if ready otherwise, false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean): boolean {\r\n return this._thinEffectLayer.isReady(subMesh, useInstances);\r\n }\r\n\r\n /**\r\n * Implementation specific of rendering the generating effect on the main canvas.\r\n * @param effect The effect used to render through\r\n * @param renderIndex\r\n */\r\n protected _internalRender(effect: Effect, renderIndex: number): void {\r\n this._thinEffectLayer._internalCompose(effect, renderIndex);\r\n }\r\n\r\n /**\r\n * @returns true if the layer contains information to display, otherwise false.\r\n */\r\n public override shouldRender(): boolean {\r\n return this._thinEffectLayer.shouldRender();\r\n }\r\n\r\n /**\r\n * Returns true if the mesh should render, otherwise false.\r\n * @param mesh The mesh to render\r\n * @returns true if it should render otherwise false\r\n */\r\n protected override _shouldRenderMesh(mesh: Mesh): boolean {\r\n return this._thinEffectLayer._shouldRenderMesh(mesh);\r\n }\r\n\r\n /**\r\n * Returns true if the mesh can be rendered, otherwise false.\r\n * @param mesh The mesh to render\r\n * @param material The material used on the mesh\r\n * @returns true if it can be rendered otherwise false\r\n */\r\n protected override _canRenderMesh(mesh: AbstractMesh, material: Material): boolean {\r\n return this._thinEffectLayer._canRenderMesh(mesh, material);\r\n }\r\n\r\n /**\r\n * Adds specific effects defines.\r\n * @param defines The defines to add specifics to.\r\n */\r\n protected override _addCustomEffectDefines(defines: string[]): void {\r\n this._thinEffectLayer._addCustomEffectDefines(defines);\r\n }\r\n\r\n /**\r\n * Sets the required values for both the emissive texture and and the main color.\r\n * @param mesh\r\n * @param subMesh\r\n * @param material\r\n */\r\n protected _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void {\r\n this._thinEffectLayer._setEmissiveTextureAndColor(mesh, subMesh, material);\r\n }\r\n\r\n /**\r\n * Determine if a given mesh will be highlighted by the current SelectionOutlineLayer\r\n * @param mesh mesh to test\r\n * @returns true if the mesh will be highlighted by the current SelectionOutlineLayer\r\n */\r\n public override hasMesh(mesh: AbstractMesh): boolean {\r\n return this._thinEffectLayer.hasMesh(mesh);\r\n }\r\n\r\n /**\r\n * Remove all the meshes currently referenced in the selection outline layer\r\n */\r\n public clearSelection(): void {\r\n this._thinEffectLayer.clearSelection();\r\n this._mainTexture.renderList = this._thinEffectLayer._selection; // update render list\r\n }\r\n\r\n /**\r\n * Adds mesh or group of mesh to the current selection\r\n *\r\n * If a group of meshes is provided, they will outline as a single unit\r\n * @param meshOrGroup Meshes to add to the selection\r\n */\r\n public addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\r\n this._thinEffectLayer.addSelection(meshOrGroup);\r\n }\r\n\r\n /**\r\n * Adds mesh or group of mesh to the current selection\r\n * @param meshOrGroup Meshes to remove from the selection\r\n */\r\n public removeSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\r\n this._thinEffectLayer.removeSelection(meshOrGroup);\r\n }\r\n\r\n /**\r\n * Free any resources and references associated to a mesh.\r\n * Internal use\r\n * @param mesh The mesh to free.\r\n * @internal\r\n */\r\n public _disposeMesh(mesh: Mesh): void {\r\n this._thinEffectLayer._disposeMesh(mesh);\r\n }\r\n\r\n /**\r\n * Gets the class name of the effect layer\r\n * @returns the string with the class name of the effect layer\r\n */\r\n public override getClassName(): string {\r\n return \"SelectionOutlineLayer\";\r\n }\r\n\r\n /**\r\n * Serializes this SelectionOutline layer\r\n * @returns a serialized SelectionOutline layer object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.SelectionOutlineLayer\";\r\n\r\n // Selected meshes\r\n serializationObject.selection = [];\r\n\r\n const selection = this._thinEffectLayer._selection;\r\n if (selection) {\r\n const meshUniqueIdToSelectionId = this._thinEffectLayer._meshUniqueIdToSelectionId;\r\n\r\n // selection can be sparse since _removeMesh can remove entries\r\n const selectionMap: {\r\n [uniqueId: number]: {\r\n meshIds: string[];\r\n };\r\n } = {};\r\n\r\n for (let i = 0; i < selection.length; ++i) {\r\n const mesh = selection[i];\r\n const selectionId = meshUniqueIdToSelectionId[mesh.uniqueId];\r\n\r\n if (!selectionMap[selectionId]) {\r\n selectionMap[selectionId] = {\r\n meshIds: [],\r\n };\r\n }\r\n selectionMap[selectionId].meshIds.push(mesh.id);\r\n }\r\n serializationObject.selection = selectionMap;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a SelectionOutline layer from parsed SelectionOutline layer data\r\n * @param parsedSelectionOutlineLayer defines the SelectionOutline layer data\r\n * @param scene defines the current scene\r\n * @param rootUrl defines the root URL containing the SelectionOutline layer information\r\n * @returns a parsed SelectionOutline layer\r\n */\r\n public static override Parse(parsedSelectionOutlineLayer: any, scene: Scene, rootUrl: string): SelectionOutlineLayer {\r\n const selectionOutlineLayer = SerializationHelper.Parse(\r\n () => new SelectionOutlineLayer(parsedSelectionOutlineLayer.name, scene, parsedSelectionOutlineLayer.options),\r\n parsedSelectionOutlineLayer,\r\n scene,\r\n rootUrl\r\n );\r\n\r\n const selectionMap = parsedSelectionOutlineLayer.selection as { [uniqueId: number]: { meshIds: string[] } };\r\n\r\n // Selected meshes\r\n for (const outlinedMeshes of Object.values(selectionMap)) {\r\n const meshes: AbstractMesh[] = [];\r\n for (let meshIndex = 0; meshIndex < outlinedMeshes.meshIds.length; meshIndex++) {\r\n const meshId = outlinedMeshes.meshIds[meshIndex];\r\n const mesh = scene.getMeshById(meshId);\r\n if (mesh) {\r\n meshes.push(mesh);\r\n }\r\n }\r\n\r\n selectionOutlineLayer.addSelection(meshes);\r\n }\r\n\r\n return selectionOutlineLayer;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for selectionOutlineLayer.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterSelectionOutlineLayer(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n Scene.prototype.getSelectionOutlineLayerByName = function (name: string): Nullable<SelectionOutlineLayer> {\r\n for (let index = 0; index < this.effectLayers?.length; index++) {\r\n if (this.effectLayers[index].name === name && this.effectLayers[index].getEffectName() === SelectionOutlineLayer.EffectName) {\r\n return (<any>this.effectLayers[index]) as SelectionOutlineLayer;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n RegisterClass(\"BABYLON.SelectionOutlineLayer\", SelectionOutlineLayer);\r\n}\r\n"]}
@@ -243,6 +243,7 @@ export declare class ThinEffectLayer {
243
243
  protected _importShadersAsync(): Promise<void>;
244
244
  /** @internal */
245
245
  _internalIsLayerReady(): boolean;
246
+ protected _disposeMergeEffects(): void;
246
247
  /**
247
248
  * Checks if the layer is ready to be used.
248
249
  * @returns true if the layer is ready to be used
@@ -572,6 +572,12 @@ export class ThinEffectLayer {
572
572
  }
573
573
  return isReady;
574
574
  }
575
+ _disposeMergeEffects() {
576
+ for (const drawWrapper of this._mergeDrawWrapper) {
577
+ drawWrapper.dispose();
578
+ }
579
+ this._mergeDrawWrapper = [];
580
+ }
575
581
  /**
576
582
  * Checks if the layer is ready to be used.
577
583
  * @returns true if the layer is ready to be used
@@ -816,10 +822,7 @@ export class ThinEffectLayer {
816
822
  this._scene.getEngine()._releaseBuffer(this._indexBuffer);
817
823
  this._indexBuffer = null;
818
824
  }
819
- for (const drawWrapper of this._mergeDrawWrapper) {
820
- drawWrapper.dispose();
821
- }
822
- this._mergeDrawWrapper = [];
825
+ this._disposeMergeEffects();
823
826
  this._objectRenderer.dispose();
824
827
  // Callback
825
828
  this.onDisposeObservable.notifyObservers(this);