@babylonjs/core 9.2.2 → 9.3.1

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 (76) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Engines/engine.d.ts +49 -1118
  4. package/FlowGraph/flowGraph.d.ts +11 -0
  5. package/FlowGraph/flowGraph.js +20 -0
  6. package/FlowGraph/flowGraph.js.map +1 -1
  7. package/FlowGraph/flowGraphContext.d.ts +30 -0
  8. package/FlowGraph/flowGraphContext.js +42 -0
  9. package/FlowGraph/flowGraphContext.js.map +1 -1
  10. package/FlowGraph/flowGraphParser.js +13 -0
  11. package/FlowGraph/flowGraphParser.js.map +1 -1
  12. package/FlowGraph/typeDefinitions.d.ts +16 -0
  13. package/FlowGraph/typeDefinitions.js.map +1 -1
  14. package/Layers/thinSelectionOutlineLayer.js +25 -1
  15. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  16. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +18 -0
  17. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +110 -1
  18. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  19. package/Materials/Textures/baseTexture.d.ts +1 -0
  20. package/Materials/Textures/baseTexture.js +1 -0
  21. package/Materials/Textures/baseTexture.js.map +1 -1
  22. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +5 -1
  23. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -4
  24. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  25. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.d.ts +24 -0
  26. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +128 -0
  27. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
  28. package/Misc/tools.js +1 -1
  29. package/Misc/tools.js.map +1 -1
  30. package/Particles/IParticleSystem.d.ts +7 -1
  31. package/Particles/IParticleSystem.js.map +1 -1
  32. package/Particles/baseParticleSystem.d.ts +18 -2
  33. package/Particles/baseParticleSystem.js +53 -11
  34. package/Particles/baseParticleSystem.js.map +1 -1
  35. package/Particles/computeShaderParticleSystem.js +16 -0
  36. package/Particles/computeShaderParticleSystem.js.map +1 -1
  37. package/Particles/gpuParticleSystem.d.ts +14 -72
  38. package/Particles/gpuParticleSystem.js +130 -106
  39. package/Particles/gpuParticleSystem.js.map +1 -1
  40. package/Particles/particleSystem.d.ts +0 -80
  41. package/Particles/particleSystem.functions.d.ts +16 -0
  42. package/Particles/particleSystem.functions.js +18 -0
  43. package/Particles/particleSystem.functions.js.map +1 -1
  44. package/Particles/particleSystem.js +0 -114
  45. package/Particles/particleSystem.js.map +1 -1
  46. package/Particles/webgl2ParticleSystem.js +12 -0
  47. package/Particles/webgl2ParticleSystem.js.map +1 -1
  48. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +17 -0
  49. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  50. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +10 -0
  51. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +146 -24
  52. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  53. package/Rendering/objectRenderer.d.ts +2 -0
  54. package/Rendering/objectRenderer.js +10 -0
  55. package/Rendering/objectRenderer.js.map +1 -1
  56. package/Shaders/ShadersInclude/gaussianSplatting.js +21 -1
  57. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  58. package/Shaders/gaussianSplattingVoxel.fragment.d.ts +5 -0
  59. package/Shaders/gaussianSplattingVoxel.fragment.js +27 -0
  60. package/Shaders/gaussianSplattingVoxel.fragment.js.map +1 -0
  61. package/Shaders/gaussianSplattingVoxel.vertex.d.ts +8 -0
  62. package/Shaders/gaussianSplattingVoxel.vertex.js +31 -0
  63. package/Shaders/gaussianSplattingVoxel.vertex.js.map +1 -0
  64. package/Shaders/gpuUpdateParticles.vertex.js +13 -0
  65. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  66. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +21 -1
  67. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  68. package/ShadersWGSL/gaussianSplattingVoxel.fragment.d.ts +5 -0
  69. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js +22 -0
  70. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js.map +1 -0
  71. package/ShadersWGSL/gaussianSplattingVoxel.vertex.d.ts +8 -0
  72. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +42 -0
  73. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -0
  74. package/ShadersWGSL/gpuUpdateParticles.compute.js +19 -0
  75. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  76. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphParser.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/flowGraphParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IAssetContainer } from \"core/IAssetContainer\";\nimport { blockFactory } from \"./Blocks/flowGraphBlockFactory\";\nimport { type FlowGraphBlockNames } from \"./Blocks/flowGraphBlockNames\";\nimport { type FlowGraph, type IFlowGraphParseOptions } from \"./flowGraph\";\nimport { type FlowGraphBlock, type IFlowGraphBlockParseOptions } from \"./flowGraphBlock\";\nimport { type FlowGraphContext, type IFlowGraphContextParseOptions } from \"./flowGraphContext\";\nimport { type IFlowGraphCoordinatorParseOptions, FlowGraphCoordinator } from \"./flowGraphCoordinator\";\nimport { type FlowGraphDataConnection } from \"./flowGraphDataConnection\";\nimport { FlowGraphEventBlock } from \"./flowGraphEventBlock\";\nimport { FlowGraphExecutionBlock } from \"./flowGraphExecutionBlock\";\nimport { type FlowGraphSignalConnection } from \"./flowGraphSignalConnection\";\nimport { defaultValueParseFunction, needsPathConverter } from \"./serialization\";\nimport { type ISerializedFlowGraph, type ISerializedFlowGraphBlock, type ISerializedFlowGraphContext } from \"./typeDefinitions\";\nimport { type Node } from \"core/node\";\nimport { getRichTypeByFlowGraphType, RichType } from \"./flowGraphRichTypes\";\nimport { type FlowGraphConnection } from \"./flowGraphConnection\";\n\n/**\n * Given a list of blocks, find an output data connection that has a specific unique id\n * @param blocks a list of flow graph blocks\n * @param uniqueId the unique id of a connection\n * @returns the connection that has this unique id. throws an error if none was found\n */\nexport function GetDataOutConnectionByUniqueId(blocks: FlowGraphBlock[], uniqueId: string): FlowGraphDataConnection<any> {\n for (const block of blocks) {\n for (const dataOut of block.dataOutputs) {\n if (dataOut.uniqueId === uniqueId) {\n return dataOut;\n }\n }\n }\n throw new Error(\"Could not find data out connection with unique id \" + uniqueId);\n}\n\n/**\n * Given a list of blocks, find an input signal connection that has a specific unique id\n * @param blocks a list of flow graph blocks\n * @param uniqueId the unique id of a connection\n * @returns the connection that has this unique id. throws an error if none was found\n */\nexport function GetSignalInConnectionByUniqueId(blocks: FlowGraphBlock[], uniqueId: string): FlowGraphSignalConnection {\n for (const block of blocks) {\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalIn of block.signalInputs) {\n if (signalIn.uniqueId === uniqueId) {\n return signalIn;\n }\n }\n }\n }\n throw new Error(\"Could not find signal in connection with unique id \" + uniqueId);\n}\n\n/**\n * Parses a serialized coordinator.\n * @param serializedObject the object to parse\n * @param options the options to use when parsing\n * @returns the parsed coordinator\n */\nexport async function ParseCoordinatorAsync(serializedObject: any, options: IFlowGraphCoordinatorParseOptions) {\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n const coordinator = new FlowGraphCoordinator({ scene: options.scene });\n\n if (serializedObject.dispatchEventsSynchronously) {\n coordinator.dispatchEventsSynchronously = serializedObject.dispatchEventsSynchronously;\n }\n\n await options.scene.whenReadyAsync();\n // if custom default values are defined, set them in the global context\n if (serializedObject._defaultValues) {\n for (const key in serializedObject._defaultValues) {\n // key is the FlowGraphType, value is the default value\n const value = serializedObject._defaultValues[key];\n getRichTypeByFlowGraphType(key).defaultValue = value;\n }\n }\n // async-parse the flow graphs. This can be done in parallel\n await Promise.all(\n serializedObject._flowGraphs?.map(\n async (serializedGraph: any) => await ParseFlowGraphAsync(serializedGraph, { coordinator, valueParseFunction, pathConverter: options.pathConverter })\n )\n );\n return coordinator;\n}\n\n/**\n * Parses a graph from a given serialization object\n * @param serializationObject the object where the values are written\n * @param options options for parsing the graph\n * @returns the parsed graph\n */\nexport async function ParseFlowGraphAsync(serializationObject: ISerializedFlowGraph, options: IFlowGraphParseOptions): Promise<FlowGraph> {\n // get all classes types needed for the blocks using the block factory\n const resolvedClasses = await Promise.all(\n serializationObject.allBlocks.map(async (serializedBlock) => {\n const classFactory = blockFactory(serializedBlock.className as FlowGraphBlockNames);\n return await classFactory();\n })\n );\n // async will be used when we start using the block async factory\n return ParseFlowGraph(serializationObject, options, resolvedClasses);\n}\n\n/**\n * Parses a graph from a given serialization object\n * @param serializationObject the object where the values are written\n * @param options options for parsing the graph\n * @param resolvedClasses the resolved classes for the blocks\n * @returns the parsed graph\n */\nexport function ParseFlowGraph(serializationObject: ISerializedFlowGraph, options: IFlowGraphParseOptions, resolvedClasses: (typeof FlowGraphBlock)[]) {\n const graph = options.coordinator.createGraph();\n const blocks: FlowGraphBlock[] = [];\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n // Parse all blocks\n // for (const serializedBlock of serializationObject.allBlocks) {\n for (let i = 0; i < serializationObject.allBlocks.length; i++) {\n const serializedBlock = serializationObject.allBlocks[i];\n const block = ParseFlowGraphBlockWithClassType(\n serializedBlock,\n { scene: options.coordinator.config.scene, pathConverter: options.pathConverter, assetsContainer: options.coordinator.config.scene, valueParseFunction },\n resolvedClasses[i]\n );\n blocks.push(block);\n graph.addBlock(block);\n if (block instanceof FlowGraphEventBlock) {\n graph.addEventBlock(block);\n }\n }\n // After parsing all blocks, connect them.\n // Build lookup maps for O(1) connection resolution instead of O(B*P) linear scans.\n const dataOutMap = new Map<string, FlowGraphDataConnection<any>>();\n const signalInMap = new Map<string, FlowGraphSignalConnection>();\n for (const block of blocks) {\n for (const dataOut of block.dataOutputs) {\n dataOutMap.set(dataOut.uniqueId, dataOut);\n }\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalIn of block.signalInputs) {\n signalInMap.set(signalIn.uniqueId, signalIn);\n }\n }\n }\n for (const block of blocks) {\n for (const dataIn of block.dataInputs) {\n for (const serializedConnection of dataIn.connectedPointIds) {\n const connection = dataOutMap.get(serializedConnection);\n if (!connection) {\n throw new Error(\"Could not find data out connection with unique id \" + serializedConnection);\n }\n dataIn.connectTo(connection);\n }\n }\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalOut of block.signalOutputs) {\n for (const serializedConnection of signalOut.connectedPointIds) {\n const connection = signalInMap.get(serializedConnection);\n if (!connection) {\n throw new Error(\"Could not find signal in connection with unique id \" + serializedConnection);\n }\n signalOut.connectTo(connection);\n }\n }\n }\n }\n for (const serializedContext of serializationObject.executionContexts) {\n ParseFlowGraphContext(serializedContext, { graph, valueParseFunction }, serializationObject.rightHanded);\n }\n return graph;\n}\n\n/**\n * Parses a context\n * @param serializationObject the object containing the context serialization values\n * @param options the options for parsing the context\n * @param rightHanded whether the serialized data is right handed\n * @returns\n */\nexport function ParseFlowGraphContext(serializationObject: ISerializedFlowGraphContext, options: IFlowGraphContextParseOptions, rightHanded?: boolean): FlowGraphContext {\n const result = options.graph.createContext();\n if (serializationObject.enableLogging) {\n result.enableLogging = true;\n }\n result.treatDataAsRightHanded = rightHanded || false;\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n result.uniqueId = serializationObject.uniqueId;\n const scene = result.getScene();\n // check if assets context is available\n if (serializationObject._assetsContext) {\n const ac = serializationObject._assetsContext;\n const assetsContext: IAssetContainer = {\n meshes: ac.meshes?.map((m: string) => scene.getMeshById(m)),\n lights: ac.lights?.map((l: string) => scene.getLightByName(l)),\n cameras: ac.cameras?.map((c: string) => scene.getCameraByName(c)),\n materials: ac.materials?.map((m: string) => scene.getMaterialById(m)),\n textures: ac.textures?.map((t: string) => scene.getTextureByName(t)),\n animations: ac.animations?.map((a: string) => scene.animations.find((anim) => anim.name === a)),\n skeletons: ac.skeletons?.map((s: string) => scene.getSkeletonByName(s)),\n particleSystems: ac.particleSystems?.map((ps: string) => scene.getParticleSystemById(ps)),\n animationGroups: ac.animationGroups?.map((ag: string) => scene.getAnimationGroupByName(ag)),\n transformNodes: ac.transformNodes?.map((tn: string) => scene.getTransformNodeById(tn)),\n rootNodes: [],\n multiMaterials: [],\n morphTargetManagers: [],\n geometries: [],\n actionManagers: [],\n environmentTexture: null,\n postProcesses: [],\n sounds: null,\n effectLayers: [],\n layers: [],\n reflectionProbes: [],\n lensFlareSystems: [],\n proceduralTextures: [],\n getNodes: function (): Array<Node> {\n throw new Error(\"Function not implemented.\");\n },\n };\n result.assetsContext = assetsContext;\n }\n for (const key in serializationObject._userVariables) {\n const value = valueParseFunction(key, serializationObject._userVariables, result.assetsContext, scene);\n result.userVariables[key] = value;\n }\n for (const key in serializationObject._connectionValues) {\n const value = valueParseFunction(key, serializationObject._connectionValues, result.assetsContext, scene);\n result._setConnectionValueByKey(key, value);\n }\n\n return result;\n}\n\n/**\n * Parses a block from a serialization object\n * This function is async due to the factory method that is used to create the block's class. If you load the class externally use ParseBlockWithClassType\n * @param serializationObject the object to parse from\n * @param parseOptions options for parsing the block\n * @returns the parsed block\n */\nexport async function ParseBlockAsync(serializationObject: ISerializedFlowGraphBlock, parseOptions: IFlowGraphBlockParseOptions): Promise<FlowGraphBlock> {\n const classFactory = blockFactory(serializationObject.className as FlowGraphBlockNames);\n const classType = await classFactory();\n return ParseFlowGraphBlockWithClassType(serializationObject, parseOptions, classType);\n}\n\n/**\n * Parses a block from a serialization object\n * @param serializationObject the object to parse from\n * @param parseOptions options for parsing the block\n * @param classType the class type of the block. This is used when the class is not loaded asynchronously\n * @returns the parsed block\n */\nexport function ParseFlowGraphBlockWithClassType(\n serializationObject: ISerializedFlowGraphBlock,\n parseOptions: IFlowGraphBlockParseOptions,\n classType: typeof FlowGraphBlock\n): FlowGraphBlock {\n const parsedConfig: any = {};\n const valueParseFunction = parseOptions.valueParseFunction ?? defaultValueParseFunction;\n if (serializationObject.config) {\n for (const key in serializationObject.config) {\n parsedConfig[key] = valueParseFunction(key, serializationObject.config, parseOptions.assetsContainer || parseOptions.scene, parseOptions.scene);\n }\n }\n if (needsPathConverter(serializationObject.className)) {\n if (!parseOptions.pathConverter) {\n throw new Error(\"Block \" + serializationObject.className + \" requires a path converter to be provided in parse options.\");\n }\n parsedConfig.pathConverter = parseOptions.pathConverter;\n }\n const obj = new classType(parsedConfig);\n obj.uniqueId = serializationObject.uniqueId;\n for (let i = 0; i < serializationObject.dataInputs.length; i++) {\n const dataInput = obj.getDataInput(serializationObject.dataInputs[i].name);\n if (dataInput) {\n dataInput.deserialize(serializationObject.dataInputs[i]);\n } else {\n throw new Error(\"Could not find data input with name \" + serializationObject.dataInputs[i].name + \" in block \" + serializationObject.className);\n }\n }\n for (let i = 0; i < serializationObject.dataOutputs.length; i++) {\n const dataOutput = obj.getDataOutput(serializationObject.dataOutputs[i].name);\n if (dataOutput) {\n dataOutput.deserialize(serializationObject.dataOutputs[i]);\n } else {\n throw new Error(\"Could not find data output with name \" + serializationObject.dataOutputs[i].name + \" in block \" + serializationObject.className);\n }\n }\n obj.metadata = serializationObject.metadata;\n obj.deserialize && obj.deserialize(serializationObject);\n return obj;\n}\n\n/**\n * Parses a connection from an object\n * @param serializationObject the object to parse from.\n * @param ownerBlock the block that owns the connection.\n * @param classType the class type of the connection.\n * @returns the parsed connection.\n */\nexport function ParseGraphConnectionWithClassType<BlockT extends FlowGraphBlock>(serializationObject: any = {}, ownerBlock: BlockT, classType: typeof FlowGraphConnection) {\n const connection = new classType(serializationObject.name, serializationObject._connectionType, ownerBlock);\n connection.deserialize(serializationObject);\n return connection;\n}\n\n/**\n * Parses a data connection from a serialized object.\n * @param serializationObject the object to parse from\n * @param ownerBlock the block that owns the connection\n * @param classType the class type of the data connection\n * @returns the parsed connection\n */\nexport function ParseGraphDataConnection(serializationObject: any, ownerBlock: FlowGraphBlock, classType: typeof FlowGraphDataConnection): FlowGraphDataConnection<any> {\n const richType = ParseRichType(serializationObject.richType);\n const defaultValue = serializationObject.defaultValue;\n const connection = new classType(serializationObject.name, serializationObject._connectionType, ownerBlock, richType, defaultValue, !!serializationObject._optional);\n connection.deserialize(serializationObject);\n return connection;\n}\n\n/**\n * Parses a rich type from a serialization object.\n * @param serializationObject a serialization object\n * @returns the parsed rich type\n */\nfunction ParseRichType(serializationObject: any): RichType<any> {\n return new RichType(serializationObject.typeName, serializationObject.defaultValue);\n}\n"]}
1
+ {"version":3,"file":"flowGraphParser.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/flowGraphParser.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IAssetContainer } from \"core/IAssetContainer\";\nimport { blockFactory } from \"./Blocks/flowGraphBlockFactory\";\nimport { type FlowGraphBlockNames } from \"./Blocks/flowGraphBlockNames\";\nimport { type FlowGraph, type IFlowGraphParseOptions } from \"./flowGraph\";\nimport { type FlowGraphBlock, type IFlowGraphBlockParseOptions } from \"./flowGraphBlock\";\nimport { type FlowGraphContext, type IFlowGraphContextParseOptions } from \"./flowGraphContext\";\nimport { type IFlowGraphCoordinatorParseOptions, FlowGraphCoordinator } from \"./flowGraphCoordinator\";\nimport { type FlowGraphDataConnection } from \"./flowGraphDataConnection\";\nimport { FlowGraphEventBlock } from \"./flowGraphEventBlock\";\nimport { FlowGraphExecutionBlock } from \"./flowGraphExecutionBlock\";\nimport { type FlowGraphSignalConnection } from \"./flowGraphSignalConnection\";\nimport { defaultValueParseFunction, needsPathConverter } from \"./serialization\";\nimport { type ISerializedFlowGraph, type ISerializedFlowGraphBlock, type ISerializedFlowGraphContext } from \"./typeDefinitions\";\nimport { type Node } from \"core/node\";\nimport { getRichTypeByFlowGraphType, RichType } from \"./flowGraphRichTypes\";\nimport { type FlowGraphConnection } from \"./flowGraphConnection\";\n\n/**\n * Given a list of blocks, find an output data connection that has a specific unique id\n * @param blocks a list of flow graph blocks\n * @param uniqueId the unique id of a connection\n * @returns the connection that has this unique id. throws an error if none was found\n */\nexport function GetDataOutConnectionByUniqueId(blocks: FlowGraphBlock[], uniqueId: string): FlowGraphDataConnection<any> {\n for (const block of blocks) {\n for (const dataOut of block.dataOutputs) {\n if (dataOut.uniqueId === uniqueId) {\n return dataOut;\n }\n }\n }\n throw new Error(\"Could not find data out connection with unique id \" + uniqueId);\n}\n\n/**\n * Given a list of blocks, find an input signal connection that has a specific unique id\n * @param blocks a list of flow graph blocks\n * @param uniqueId the unique id of a connection\n * @returns the connection that has this unique id. throws an error if none was found\n */\nexport function GetSignalInConnectionByUniqueId(blocks: FlowGraphBlock[], uniqueId: string): FlowGraphSignalConnection {\n for (const block of blocks) {\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalIn of block.signalInputs) {\n if (signalIn.uniqueId === uniqueId) {\n return signalIn;\n }\n }\n }\n }\n throw new Error(\"Could not find signal in connection with unique id \" + uniqueId);\n}\n\n/**\n * Parses a serialized coordinator.\n * @param serializedObject the object to parse\n * @param options the options to use when parsing\n * @returns the parsed coordinator\n */\nexport async function ParseCoordinatorAsync(serializedObject: any, options: IFlowGraphCoordinatorParseOptions) {\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n const coordinator = new FlowGraphCoordinator({ scene: options.scene });\n\n if (serializedObject.dispatchEventsSynchronously) {\n coordinator.dispatchEventsSynchronously = serializedObject.dispatchEventsSynchronously;\n }\n\n await options.scene.whenReadyAsync();\n // if custom default values are defined, set them in the global context\n if (serializedObject._defaultValues) {\n for (const key in serializedObject._defaultValues) {\n // key is the FlowGraphType, value is the default value\n const value = serializedObject._defaultValues[key];\n getRichTypeByFlowGraphType(key).defaultValue = value;\n }\n }\n // async-parse the flow graphs. This can be done in parallel\n await Promise.all(\n serializedObject._flowGraphs?.map(\n async (serializedGraph: any) => await ParseFlowGraphAsync(serializedGraph, { coordinator, valueParseFunction, pathConverter: options.pathConverter })\n )\n );\n return coordinator;\n}\n\n/**\n * Parses a graph from a given serialization object\n * @param serializationObject the object where the values are written\n * @param options options for parsing the graph\n * @returns the parsed graph\n */\nexport async function ParseFlowGraphAsync(serializationObject: ISerializedFlowGraph, options: IFlowGraphParseOptions): Promise<FlowGraph> {\n // get all classes types needed for the blocks using the block factory\n const resolvedClasses = await Promise.all(\n serializationObject.allBlocks.map(async (serializedBlock) => {\n const classFactory = blockFactory(serializedBlock.className as FlowGraphBlockNames);\n return await classFactory();\n })\n );\n // async will be used when we start using the block async factory\n return ParseFlowGraph(serializationObject, options, resolvedClasses);\n}\n\n/**\n * Parses a graph from a given serialization object\n * @param serializationObject the object where the values are written\n * @param options options for parsing the graph\n * @param resolvedClasses the resolved classes for the blocks\n * @returns the parsed graph\n */\nexport function ParseFlowGraph(serializationObject: ISerializedFlowGraph, options: IFlowGraphParseOptions, resolvedClasses: (typeof FlowGraphBlock)[]) {\n const graph = options.coordinator.createGraph();\n const blocks: FlowGraphBlock[] = [];\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n // Parse all blocks\n // for (const serializedBlock of serializationObject.allBlocks) {\n for (let i = 0; i < serializationObject.allBlocks.length; i++) {\n const serializedBlock = serializationObject.allBlocks[i];\n const block = ParseFlowGraphBlockWithClassType(\n serializedBlock,\n { scene: options.coordinator.config.scene, pathConverter: options.pathConverter, assetsContainer: options.coordinator.config.scene, valueParseFunction },\n resolvedClasses[i]\n );\n blocks.push(block);\n graph.addBlock(block);\n if (block instanceof FlowGraphEventBlock) {\n graph.addEventBlock(block);\n }\n }\n // After parsing all blocks, connect them.\n // Build lookup maps for O(1) connection resolution instead of O(B*P) linear scans.\n const dataOutMap = new Map<string, FlowGraphDataConnection<any>>();\n const signalInMap = new Map<string, FlowGraphSignalConnection>();\n for (const block of blocks) {\n for (const dataOut of block.dataOutputs) {\n dataOutMap.set(dataOut.uniqueId, dataOut);\n }\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalIn of block.signalInputs) {\n signalInMap.set(signalIn.uniqueId, signalIn);\n }\n }\n }\n for (const block of blocks) {\n for (const dataIn of block.dataInputs) {\n for (const serializedConnection of dataIn.connectedPointIds) {\n const connection = dataOutMap.get(serializedConnection);\n if (!connection) {\n throw new Error(\"Could not find data out connection with unique id \" + serializedConnection);\n }\n dataIn.connectTo(connection);\n }\n }\n if (block instanceof FlowGraphExecutionBlock) {\n for (const signalOut of block.signalOutputs) {\n for (const serializedConnection of signalOut.connectedPointIds) {\n const connection = signalInMap.get(serializedConnection);\n if (!connection) {\n throw new Error(\"Could not find signal in connection with unique id \" + serializedConnection);\n }\n signalOut.connectTo(connection);\n }\n }\n }\n }\n for (const serializedContext of serializationObject.executionContexts) {\n ParseFlowGraphContext(serializedContext, { graph, valueParseFunction }, serializationObject.rightHanded);\n }\n return graph;\n}\n\n/**\n * Parses a context\n * @param serializationObject the object containing the context serialization values\n * @param options the options for parsing the context\n * @param rightHanded whether the serialized data is right handed\n * @returns\n */\nexport function ParseFlowGraphContext(serializationObject: ISerializedFlowGraphContext, options: IFlowGraphContextParseOptions, rightHanded?: boolean): FlowGraphContext {\n const result = options.graph.createContext();\n if (serializationObject.enableLogging) {\n result.enableLogging = true;\n }\n result.treatDataAsRightHanded = rightHanded || false;\n const valueParseFunction = options.valueParseFunction ?? defaultValueParseFunction;\n result.uniqueId = serializationObject.uniqueId;\n result.name = serializationObject.name ?? \"\";\n const scene = result.getScene();\n // check if assets context is available\n if (serializationObject._assetsContext) {\n const ac = serializationObject._assetsContext;\n const assetsContext: IAssetContainer = {\n meshes: ac.meshes?.map((m: string) => scene.getMeshById(m)),\n lights: ac.lights?.map((l: string) => scene.getLightByName(l)),\n cameras: ac.cameras?.map((c: string) => scene.getCameraByName(c)),\n materials: ac.materials?.map((m: string) => scene.getMaterialById(m)),\n textures: ac.textures?.map((t: string) => scene.getTextureByName(t)),\n animations: ac.animations?.map((a: string) => scene.animations.find((anim) => anim.name === a)),\n skeletons: ac.skeletons?.map((s: string) => scene.getSkeletonByName(s)),\n particleSystems: ac.particleSystems?.map((ps: string) => scene.getParticleSystemById(ps)),\n animationGroups: ac.animationGroups?.map((ag: string) => scene.getAnimationGroupByName(ag)),\n transformNodes: ac.transformNodes?.map((tn: string) => scene.getTransformNodeById(tn)),\n rootNodes: [],\n multiMaterials: [],\n morphTargetManagers: [],\n geometries: [],\n actionManagers: [],\n environmentTexture: null,\n postProcesses: [],\n sounds: null,\n effectLayers: [],\n layers: [],\n reflectionProbes: [],\n lensFlareSystems: [],\n proceduralTextures: [],\n getNodes: function (): Array<Node> {\n throw new Error(\"Function not implemented.\");\n },\n };\n result.assetsContext = assetsContext;\n }\n for (const key in serializationObject._userVariables) {\n const value = valueParseFunction(key, serializationObject._userVariables, result.assetsContext, scene);\n result.userVariables[key] = value;\n }\n // Restore variable type annotations\n if (serializationObject._variableTypes) {\n for (const key in serializationObject._variableTypes) {\n result.setVariableType(key, serializationObject._variableTypes[key]);\n }\n }\n for (const key in serializationObject._connectionValues) {\n const value = valueParseFunction(key, serializationObject._connectionValues, result.assetsContext, scene);\n result._setConnectionValueByKey(key, value);\n }\n\n return result;\n}\n\n/**\n * Parses a block from a serialization object\n * This function is async due to the factory method that is used to create the block's class. If you load the class externally use ParseBlockWithClassType\n * @param serializationObject the object to parse from\n * @param parseOptions options for parsing the block\n * @returns the parsed block\n */\nexport async function ParseBlockAsync(serializationObject: ISerializedFlowGraphBlock, parseOptions: IFlowGraphBlockParseOptions): Promise<FlowGraphBlock> {\n const classFactory = blockFactory(serializationObject.className as FlowGraphBlockNames);\n const classType = await classFactory();\n return ParseFlowGraphBlockWithClassType(serializationObject, parseOptions, classType);\n}\n\n/**\n * Parses a block from a serialization object\n * @param serializationObject the object to parse from\n * @param parseOptions options for parsing the block\n * @param classType the class type of the block. This is used when the class is not loaded asynchronously\n * @returns the parsed block\n */\nexport function ParseFlowGraphBlockWithClassType(\n serializationObject: ISerializedFlowGraphBlock,\n parseOptions: IFlowGraphBlockParseOptions,\n classType: typeof FlowGraphBlock\n): FlowGraphBlock {\n const parsedConfig: any = {};\n const valueParseFunction = parseOptions.valueParseFunction ?? defaultValueParseFunction;\n if (serializationObject.config) {\n for (const key in serializationObject.config) {\n parsedConfig[key] = valueParseFunction(key, serializationObject.config, parseOptions.assetsContainer || parseOptions.scene, parseOptions.scene);\n }\n }\n if (needsPathConverter(serializationObject.className)) {\n if (!parseOptions.pathConverter) {\n throw new Error(\"Block \" + serializationObject.className + \" requires a path converter to be provided in parse options.\");\n }\n parsedConfig.pathConverter = parseOptions.pathConverter;\n }\n const obj = new classType(parsedConfig);\n obj.uniqueId = serializationObject.uniqueId;\n for (let i = 0; i < serializationObject.dataInputs.length; i++) {\n const dataInput = obj.getDataInput(serializationObject.dataInputs[i].name);\n if (dataInput) {\n dataInput.deserialize(serializationObject.dataInputs[i]);\n // Restore _defaultValue if it was serialized. Without this, the\n // user-set inline value (e.g. \"2\" on an Add input, or \"position\"\n // on a GetProperty's propertyName) is lost during round-trips.\n if (serializationObject.dataInputs[i].defaultValue !== undefined) {\n (dataInput as any)._defaultValue = valueParseFunction(\n \"defaultValue\",\n serializationObject.dataInputs[i],\n parseOptions.assetsContainer || parseOptions.scene,\n parseOptions.scene\n );\n }\n } else {\n throw new Error(\"Could not find data input with name \" + serializationObject.dataInputs[i].name + \" in block \" + serializationObject.className);\n }\n }\n for (let i = 0; i < serializationObject.dataOutputs.length; i++) {\n const dataOutput = obj.getDataOutput(serializationObject.dataOutputs[i].name);\n if (dataOutput) {\n dataOutput.deserialize(serializationObject.dataOutputs[i]);\n } else {\n throw new Error(\"Could not find data output with name \" + serializationObject.dataOutputs[i].name + \" in block \" + serializationObject.className);\n }\n }\n obj.metadata = serializationObject.metadata;\n obj.deserialize && obj.deserialize(serializationObject);\n return obj;\n}\n\n/**\n * Parses a connection from an object\n * @param serializationObject the object to parse from.\n * @param ownerBlock the block that owns the connection.\n * @param classType the class type of the connection.\n * @returns the parsed connection.\n */\nexport function ParseGraphConnectionWithClassType<BlockT extends FlowGraphBlock>(serializationObject: any = {}, ownerBlock: BlockT, classType: typeof FlowGraphConnection) {\n const connection = new classType(serializationObject.name, serializationObject._connectionType, ownerBlock);\n connection.deserialize(serializationObject);\n return connection;\n}\n\n/**\n * Parses a data connection from a serialized object.\n * @param serializationObject the object to parse from\n * @param ownerBlock the block that owns the connection\n * @param classType the class type of the data connection\n * @returns the parsed connection\n */\nexport function ParseGraphDataConnection(serializationObject: any, ownerBlock: FlowGraphBlock, classType: typeof FlowGraphDataConnection): FlowGraphDataConnection<any> {\n const richType = ParseRichType(serializationObject.richType);\n const defaultValue = serializationObject.defaultValue;\n const connection = new classType(serializationObject.name, serializationObject._connectionType, ownerBlock, richType, defaultValue, !!serializationObject._optional);\n connection.deserialize(serializationObject);\n return connection;\n}\n\n/**\n * Parses a rich type from a serialization object.\n * @param serializationObject a serialization object\n * @returns the parsed rich type\n */\nfunction ParseRichType(serializationObject: any): RichType<any> {\n return new RichType(serializationObject.typeName, serializationObject.defaultValue);\n}\n"]}
@@ -76,12 +76,23 @@ export interface ISerializedFlowGraphContext {
76
76
  * The unique id of the context
77
77
  */
78
78
  uniqueId: string;
79
+ /**
80
+ * An optional user-facing name for the context
81
+ */
82
+ name?: string;
79
83
  /**
80
84
  * User variables
81
85
  */
82
86
  _userVariables: {
83
87
  [key: string]: any;
84
88
  };
89
+ /**
90
+ * Optional type annotations for user variables.
91
+ * Keys are variable names; values are type name strings.
92
+ */
93
+ _variableTypes?: {
94
+ [key: string]: string;
95
+ };
85
96
  /**
86
97
  * Values of the connection points
87
98
  */
@@ -119,6 +130,11 @@ export interface ISerializedFlowGraphConnection {
119
130
  * The id of the connection that this is connected to
120
131
  */
121
132
  connectedPointIds: string[];
133
+ /**
134
+ * The serialized default value of a data connection (set by the user for
135
+ * unconnected inputs). Only present on data connections.
136
+ */
137
+ defaultValue?: any;
122
138
  }
123
139
  /**
124
140
  * A Serialized Flow Graph Block
@@ -1 +1 @@
1
- {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/typeDefinitions.ts"],"names":[],"mappings":"","sourcesContent":["import { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type FlowGraphConnectionType } from \"./flowGraphConnection\";\r\n\r\n/**\r\n * Interpolation generator\r\n */\r\nexport interface IInterpolationPropertyInfo {\r\n /**\r\n * type of the interpolation\r\n */\r\n type: number;\r\n /**\r\n * The name of the property\r\n */\r\n name: string;\r\n /** @internal */\r\n getValue: (target: any, source: Float32Array, offset: number, scale: number) => any;\r\n /** @internal */\r\n getStride: (target: any) => number;\r\n /**\r\n * @internal\r\n */\r\n buildAnimations(target: any, name: string, fps: number, keys: any[]): { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[];\r\n}\r\n\r\n/**\r\n * An accessor that allows modifying properties on some other object.\r\n */\r\nexport interface IObjectAccessor<GLTFTargetType = any, BabylonTargetType = any, BabylonValueType = any> {\r\n /**\r\n * The number of components that are changed in the property when setting this value.\r\n * This will usually be 1. But, for example, Babylon has both orthoLeft and orthoRight (two components) properties that are changed when setting xmag (single value in glTF).\r\n * Defaults to 1 if not provided!\r\n */\r\n componentsCount?: number;\r\n /**\r\n * The (babylon) type of the property.\r\n */\r\n type: string;\r\n /**\r\n * Get the value of the property.\r\n */\r\n get: (target: GLTFTargetType, index?: number, payload?: any) => BabylonValueType | undefined;\r\n /**\r\n * Get the target of the property.\r\n */\r\n getTarget: (target: GLTFTargetType, index?: number, payload?: any) => BabylonTargetType | undefined;\r\n /**\r\n * is the property readonly?\r\n */\r\n isReadOnly?: boolean;\r\n /**\r\n * @deprecated Use get instead\r\n */\r\n getPropertyName?: Array<(target: GLTFTargetType) => string>;\r\n /**\r\n * Set a new value to the property.\r\n * @param newValue the new value to set\r\n * @param target the target object\r\n * @param index the index of the target object in the array (optional)\r\n */\r\n set?: (newValue: BabylonValueType, target: GLTFTargetType, index?: number, payload?: any) => void;\r\n /**\r\n * Interpolation/animation information for the property.\r\n * This is an array that can be used to animate the value over time.\r\n */\r\n interpolation?: IInterpolationPropertyInfo[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Context\r\n */\r\nexport interface ISerializedFlowGraphContext {\r\n /**\r\n * The unique id of the context\r\n */\r\n uniqueId: string;\r\n /**\r\n * User variables\r\n */\r\n _userVariables: { [key: string]: any };\r\n /**\r\n * Values of the connection points\r\n */\r\n _connectionValues: { [key: string]: any };\r\n\r\n /**\r\n * Assets context, if not the scene\r\n */\r\n _assetsContext?: { [key: string]: any };\r\n\r\n /**\r\n * Should logging be enabled?\r\n */\r\n enableLogging?: boolean;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Connection\r\n */\r\nexport interface ISerializedFlowGraphConnection {\r\n /**\r\n * The unique id of the connection\r\n */\r\n uniqueId: string;\r\n /**\r\n * The name of the connection\r\n */\r\n name: string;\r\n /**\r\n * The type of the connection\r\n */\r\n _connectionType: FlowGraphConnectionType;\r\n /**\r\n * The id of the connection that this is connected to\r\n */\r\n connectedPointIds: string[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Block\r\n */\r\nexport interface ISerializedFlowGraphBlock {\r\n /**\r\n * The class name of the block\r\n */\r\n className: string;\r\n /**\r\n * The glTF type of the block\r\n */\r\n type: string;\r\n /**\r\n * Configuration parameters for the block\r\n */\r\n config: any;\r\n /**\r\n * The unique id of the block\r\n */\r\n uniqueId: string;\r\n /**\r\n * Input connection data\r\n */\r\n dataInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection data\r\n */\r\n dataOutputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Metadata for the block\r\n */\r\n metadata: any;\r\n /**\r\n * Input connection signal\r\n */\r\n signalInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection signal\r\n */\r\n signalOutputs: ISerializedFlowGraphConnection[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph\r\n */\r\nexport interface ISerializedFlowGraph {\r\n /**\r\n * Contexts belonging to the flow graph\r\n */\r\n executionContexts: ISerializedFlowGraphContext[];\r\n /**\r\n * Blocks belonging to the flow graph\r\n */\r\n allBlocks: ISerializedFlowGraphBlock[];\r\n\r\n /**\r\n * Is the flow graph in RHS mode?\r\n */\r\n rightHanded?: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"typeDefinitions.js","sourceRoot":"","sources":["../../../../dev/core/src/FlowGraph/typeDefinitions.ts"],"names":[],"mappings":"","sourcesContent":["import { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type FlowGraphConnectionType } from \"./flowGraphConnection\";\r\n\r\n/**\r\n * Interpolation generator\r\n */\r\nexport interface IInterpolationPropertyInfo {\r\n /**\r\n * type of the interpolation\r\n */\r\n type: number;\r\n /**\r\n * The name of the property\r\n */\r\n name: string;\r\n /** @internal */\r\n getValue: (target: any, source: Float32Array, offset: number, scale: number) => any;\r\n /** @internal */\r\n getStride: (target: any) => number;\r\n /**\r\n * @internal\r\n */\r\n buildAnimations(target: any, name: string, fps: number, keys: any[]): { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[];\r\n}\r\n\r\n/**\r\n * An accessor that allows modifying properties on some other object.\r\n */\r\nexport interface IObjectAccessor<GLTFTargetType = any, BabylonTargetType = any, BabylonValueType = any> {\r\n /**\r\n * The number of components that are changed in the property when setting this value.\r\n * This will usually be 1. But, for example, Babylon has both orthoLeft and orthoRight (two components) properties that are changed when setting xmag (single value in glTF).\r\n * Defaults to 1 if not provided!\r\n */\r\n componentsCount?: number;\r\n /**\r\n * The (babylon) type of the property.\r\n */\r\n type: string;\r\n /**\r\n * Get the value of the property.\r\n */\r\n get: (target: GLTFTargetType, index?: number, payload?: any) => BabylonValueType | undefined;\r\n /**\r\n * Get the target of the property.\r\n */\r\n getTarget: (target: GLTFTargetType, index?: number, payload?: any) => BabylonTargetType | undefined;\r\n /**\r\n * is the property readonly?\r\n */\r\n isReadOnly?: boolean;\r\n /**\r\n * @deprecated Use get instead\r\n */\r\n getPropertyName?: Array<(target: GLTFTargetType) => string>;\r\n /**\r\n * Set a new value to the property.\r\n * @param newValue the new value to set\r\n * @param target the target object\r\n * @param index the index of the target object in the array (optional)\r\n */\r\n set?: (newValue: BabylonValueType, target: GLTFTargetType, index?: number, payload?: any) => void;\r\n /**\r\n * Interpolation/animation information for the property.\r\n * This is an array that can be used to animate the value over time.\r\n */\r\n interpolation?: IInterpolationPropertyInfo[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Context\r\n */\r\nexport interface ISerializedFlowGraphContext {\r\n /**\r\n * The unique id of the context\r\n */\r\n uniqueId: string;\r\n /**\r\n * An optional user-facing name for the context\r\n */\r\n name?: string;\r\n /**\r\n * User variables\r\n */\r\n _userVariables: { [key: string]: any };\r\n /**\r\n * Optional type annotations for user variables.\r\n * Keys are variable names; values are type name strings.\r\n */\r\n _variableTypes?: { [key: string]: string };\r\n /**\r\n * Values of the connection points\r\n */\r\n _connectionValues: { [key: string]: any };\r\n\r\n /**\r\n * Assets context, if not the scene\r\n */\r\n _assetsContext?: { [key: string]: any };\r\n\r\n /**\r\n * Should logging be enabled?\r\n */\r\n enableLogging?: boolean;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Connection\r\n */\r\nexport interface ISerializedFlowGraphConnection {\r\n /**\r\n * The unique id of the connection\r\n */\r\n uniqueId: string;\r\n /**\r\n * The name of the connection\r\n */\r\n name: string;\r\n /**\r\n * The type of the connection\r\n */\r\n _connectionType: FlowGraphConnectionType;\r\n /**\r\n * The id of the connection that this is connected to\r\n */\r\n connectedPointIds: string[];\r\n /**\r\n * The serialized default value of a data connection (set by the user for\r\n * unconnected inputs). Only present on data connections.\r\n */\r\n defaultValue?: any;\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph Block\r\n */\r\nexport interface ISerializedFlowGraphBlock {\r\n /**\r\n * The class name of the block\r\n */\r\n className: string;\r\n /**\r\n * The glTF type of the block\r\n */\r\n type: string;\r\n /**\r\n * Configuration parameters for the block\r\n */\r\n config: any;\r\n /**\r\n * The unique id of the block\r\n */\r\n uniqueId: string;\r\n /**\r\n * Input connection data\r\n */\r\n dataInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection data\r\n */\r\n dataOutputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Metadata for the block\r\n */\r\n metadata: any;\r\n /**\r\n * Input connection signal\r\n */\r\n signalInputs: ISerializedFlowGraphConnection[];\r\n /**\r\n * Output connection signal\r\n */\r\n signalOutputs: ISerializedFlowGraphConnection[];\r\n}\r\n\r\n/**\r\n * A Serialized Flow Graph\r\n */\r\nexport interface ISerializedFlowGraph {\r\n /**\r\n * Contexts belonging to the flow graph\r\n */\r\n executionContexts: ISerializedFlowGraphContext[];\r\n /**\r\n * Blocks belonging to the flow graph\r\n */\r\n allBlocks: ISerializedFlowGraphBlock[];\r\n\r\n /**\r\n * Is the flow graph in RHS mode?\r\n */\r\n rightHanded?: boolean;\r\n}\r\n"]}
@@ -357,6 +357,13 @@ export class ThinSelectionOutlineLayer extends ThinEffectLayer {
357
357
  renderingMesh.hasThinInstances ||
358
358
  (!!renderingMesh._userInstancedBuffersStorage &&
359
359
  ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName in renderingMesh._userInstancedBuffersStorage.vertexBuffers);
360
+ // When LOD transitions cause a different mesh to render with hardware instancing,
361
+ // the LOD mesh's own instanceSelectionId must reflect the source mesh's value so
362
+ // the "self" draw (representing the source mesh) gets the correct selection ID.
363
+ if (hardwareInstancedRendering && renderingMesh._masterMesh && renderingMesh.instancedBuffers) {
364
+ renderingMesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] =
365
+ renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] ?? null;
366
+ }
360
367
  this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);
361
368
  this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);
362
369
  // selection outline layer is not compatible with custom materials
@@ -439,7 +446,11 @@ export class ThinSelectionOutlineLayer extends ThinEffectLayer {
439
446
  if (selectionId === undefined && renderingMesh._masterMesh) {
440
447
  selectionId = this._meshUniqueIdToSelectionId[renderingMesh._masterMesh.uniqueId];
441
448
  if (selectionId === undefined) {
442
- selectionId = renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];
449
+ // Prefer the ownerMesh (submesh owner) which is the actual instance
450
+ // being rendered during LOD, then fall back to the master (source) mesh.
451
+ selectionId =
452
+ ownerMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] ??
453
+ renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];
443
454
  }
444
455
  }
445
456
  if (!renderingMesh.hasInstances && !renderingMesh.hasThinInstances && !renderingMesh.isAnInstance && selectionId !== undefined) {
@@ -606,6 +617,19 @@ export class ThinSelectionOutlineLayer extends ThinEffectLayer {
606
617
  }
607
618
  this._instancedBufferSources.add(sourceMesh);
608
619
  mesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] = nextId;
620
+ // Also register instanceSelectionId on LOD meshes so hardware instancing
621
+ // works during LOD transitions (LOD meshes replace the source mesh as the
622
+ // renderingMesh, and _processInstancedBuffers only processes kinds that
623
+ // are registered on the rendering mesh).
624
+ const lodLevels = sourceMesh.getLODLevels();
625
+ for (const level of lodLevels) {
626
+ if (level.mesh) {
627
+ if (level.mesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] === undefined) {
628
+ level.mesh.registerInstancedBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, 1);
629
+ }
630
+ this._instancedBufferSources.add(level.mesh);
631
+ }
632
+ }
609
633
  }
610
634
  else if (mesh.hasThinInstances) {
611
635
  const thinInstanceCount = mesh.thinInstanceCount;
@@ -1 +1 @@
1
- {"version":3,"file":"thinSelectionOutlineLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinSelectionOutlineLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"../Buffers/buffer\";\nimport { Camera } from \"../Cameras/camera\";\nimport { Constants } from \"../Engines/constants\";\nimport { type ThinEngine } from \"../Engines/thinEngine\";\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\nimport { type Effect, type IEffectCreationOptions } from \"../Materials/effect\";\nimport { EffectFallbacks } from \"../Materials/effectFallbacks\";\nimport { Material } from \"../Materials/material\";\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\nimport { Color3, Color4 } from \"../Maths/math.color\";\nimport { type AbstractMesh } from \"../Meshes/abstractMesh\";\nimport { type InstancedMesh } from \"../Meshes/instancedMesh\";\nimport { type Mesh } from \"../Meshes/mesh\";\nimport { type SubMesh } from \"../Meshes/subMesh\";\nimport { type Scene } from \"../scene\";\nimport { type Nullable } from \"../types\";\nimport { type IThinEffectLayerOptions, ThinEffectLayer } from \"./thinEffectLayer\";\n\n/**\n * Selection outline layer options. This helps customizing the behaviour\n * of the selection outline layer.\n */\nexport interface IThinSelectionOutlineLayerOptions extends IThinEffectLayerOptions {\n /**\n * Use the GLSL code generation for the shader (even on WebGPU). Default is false\n */\n forceGLSL?: boolean;\n\n /**\n * Specifies whether the depth stored is the Z coordinate in camera space.\n */\n storeCameraSpaceZ?: boolean;\n\n /**\n * Outline method to use (default: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL)\n *\n * @see {@link Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL}\n */\n outlineMethod?: number;\n}\n\n/**\n * @internal\n */\nexport class ThinSelectionOutlineLayer extends ThinEffectLayer {\n /**\n * Effect Name of the layer.\n */\n public static readonly EffectName = \"SelectionOutlineLayer\";\n\n /**\n * Name of the instance selection ID attribute\n * @internal\n */\n public static readonly InstanceSelectionIdAttributeName = \"instanceSelectionId\";\n\n /**\n * The outline color\n */\n public outlineColor: Color3 = new Color3(1, 0.5, 0);\n\n /**\n * The thickness of the edges\n */\n public outlineThickness: number = 2.0;\n\n /**\n * The strength of the occlusion effect (default: 0.8)\n */\n public occlusionStrength: number = 0.8;\n\n /**\n * The occlusion threshold (default: 0.0001)\n */\n public occlusionThreshold: number = 0.0001;\n\n /**\n * The width of the source texture\n */\n public textureWidth: number = 0;\n\n /**\n * The height of the source texture\n */\n public textureHeight: number = 0;\n\n /** @internal */\n public override _options: Required<IThinSelectionOutlineLayerOptions>;\n\n /** @internal */\n public readonly _meshUniqueIdToSelectionId: number[] = [];\n /** @internal */\n public _selection: Nullable<AbstractMesh[]> = [];\n private _instancedBufferSources: Set<Mesh> = new Set();\n private _nextSelectionId = 1;\n\n /**\n * Instantiates a new selection outline Layer and references it to the scene..\n * @param name The name of the layer\n * @param scene The scene to use the layer in\n * @param options Sets of none mandatory options to use with the layer (see IThinSelectionOutlineLayerOptions for more information)\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\n */\n public constructor(name: string, scene?: Scene, options?: Partial<IThinSelectionOutlineLayerOptions>, dontCheckIfReady = false) {\n super(name, scene, options !== undefined ? !!options.forceGLSL : false);\n\n // Adapt options\n this._options = {\n mainTextureRatio: 1.0,\n mainTextureFixedSize: 0,\n alphaBlendingMode: Constants.ALPHA_COMBINE,\n camera: null,\n renderingGroupId: -1,\n forceGLSL: false,\n mainTextureType: Constants.TEXTURETYPE_FLOAT,\n mainTextureFormat: Constants.TEXTUREFORMAT_RG,\n storeCameraSpaceZ: false,\n outlineMethod: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL,\n ...options,\n };\n\n // Fall back to a supported mask texture type if the device doesn't support rendering to float framebuffers\n // or linear filtering of float textures (e.g. OES_texture_float_linear missing on some iOS versions)\n if (this._options.mainTextureType === Constants.TEXTURETYPE_FLOAT && !(this._engine.getCaps().textureFloatRender && this._engine.getCaps().textureFloatLinearFiltering)) {\n this._options.mainTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\n }\n if (\n this._options.mainTextureType === Constants.TEXTURETYPE_HALF_FLOAT &&\n !(this._engine.getCaps().textureHalfFloatRender && this._engine.getCaps().textureHalfFloatLinearFiltering)\n ) {\n this._options.mainTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\n }\n\n // When using an 8-bit render target, we cannot reliably store camera-space Z in the mask texture:\n // depth would be clamped/quantized, breaking occlusion comparisons. In that case, force-disable\n // storeCameraSpaceZ so the layer falls back to the supported behavior.\n if (this._options.storeCameraSpaceZ && this._options.mainTextureType === Constants.TEXTURETYPE_UNSIGNED_BYTE) {\n this._options.storeCameraSpaceZ = false;\n }\n // set clear color\n this.neutralColor = new Color4(0.0, this._options.storeCameraSpaceZ ? 0.0 : 1.0, 0.0, 1.0);\n\n // Initialize the layer\n this._init(this._options);\n\n // Do not render as long as no meshes have been added\n this._shouldRender = false;\n\n if (dontCheckIfReady) {\n // When dontCheckIfReady is true, we are in the new ThinXXX layer mode, so we must call _createTextureAndPostProcesses ourselves (it is called by EffectLayer otherwise)\n this._createTextureAndPostProcesses();\n }\n }\n\n /**\n * Gets the class name of the effect layer\n * @returns the string with the class name of the effect layer\n */\n public getClassName(): string {\n return \"SelectionOutlineLayer\";\n }\n\n /** @internal */\n public override _internalIsSubMeshReady(subMesh: SubMesh, useInstances: boolean, _emissiveTexture: Nullable<BaseTexture>): boolean {\n const engine = this._scene.getEngine();\n const mesh = subMesh.getMesh();\n\n const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\n\n if (renderingMaterial) {\n return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);\n }\n\n const material = subMesh.getMaterial();\n\n if (!material) {\n return false;\n }\n\n // selection outline layer is not compatible with custom materials\n // if (this._useMeshMaterial(subMesh.getRenderingMesh())) {\n // return material.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances);\n // }\n\n const defines: string[] = [];\n\n const attribs = [VertexBuffer.PositionKind];\n\n let uv1 = false;\n let uv2 = false;\n const color = false;\n\n // Alpha test\n if (material.needAlphaTestingForMesh(mesh)) {\n defines.push(\"#define ALPHATEST\");\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\n attribs.push(VertexBuffer.UVKind);\n defines.push(\"#define UV1\");\n uv1 = true;\n }\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\n attribs.push(VertexBuffer.UV2Kind);\n defines.push(\"#define UV2\");\n uv2 = true;\n }\n }\n\n // Bones\n const fallbacks = new EffectFallbacks();\n if (mesh.useBones && mesh.computeBonesUsingShaders) {\n attribs.push(VertexBuffer.MatricesIndicesKind);\n attribs.push(VertexBuffer.MatricesWeightsKind);\n if (mesh.numBoneInfluencers > 4) {\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\n }\n\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\n\n const skeleton = mesh.skeleton;\n if (skeleton && skeleton.isUsingTextureForMatrices) {\n defines.push(\"#define BONETEXTURE\");\n } else {\n defines.push(\"#define BonesPerMesh \" + (skeleton ? skeleton.bones.length + 1 : 0));\n }\n\n if (mesh.numBoneInfluencers > 0) {\n fallbacks.addCPUSkinningFallback(0, mesh);\n }\n } else {\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\n }\n\n // Morph targets\n const numMorphInfluencers = mesh.morphTargetManager\n ? PrepareDefinesAndAttributesForMorphTargets(\n mesh.morphTargetManager,\n defines,\n attribs,\n mesh,\n true, // usePositionMorph\n false, // useNormalMorph\n false, // useTangentMorph\n uv1, // useUVMorph\n uv2, // useUV2Morph\n color // useColorMorph\n )\n : 0;\n\n // Instances\n if (useInstances) {\n defines.push(\"#define INSTANCES\");\n PushAttributesForInstances(attribs);\n if (subMesh.getRenderingMesh().hasThinInstances) {\n defines.push(\"#define THIN_INSTANCES\");\n }\n }\n\n // Baked vertex animations\n const bvaManager = mesh.bakedVertexAnimationManager;\n if (bvaManager && bvaManager.isEnabled) {\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\n if (useInstances) {\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\n }\n }\n\n // ClipPlanes\n PrepareStringDefinesForClipPlanes(material, this._scene, defines);\n\n // Selection ID\n if (useInstances) {\n attribs.push(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName);\n }\n\n this._addCustomEffectDefines(defines);\n\n // Get correct effect\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\n const cachedDefines = drawWrapper.defines as string;\n const join = defines.join(\"\\n\");\n if (cachedDefines !== join) {\n const uniforms = [\n \"world\",\n \"mBones\",\n \"viewProjection\",\n \"view\",\n \"morphTargetInfluences\",\n \"morphTargetCount\",\n \"boneTextureInfo\",\n \"diffuseMatrix\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\",\n \"bakedVertexAnimationSettings\",\n \"bakedVertexAnimationTextureSizeInverted\",\n \"bakedVertexAnimationTime\",\n \"bakedVertexAnimationTexture\",\n \"depthValues\",\n \"selectionId\",\n ];\n\n AddClipPlaneUniforms(uniforms);\n\n drawWrapper.setEffect(\n this._engine.createEffect(\n \"selection\",\n <IEffectCreationOptions>{\n attributes: attribs,\n uniformsNames: uniforms,\n uniformBuffersNames: [],\n samplers: [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"],\n defines: join,\n fallbacks: fallbacks,\n onCompiled: null,\n onError: null,\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: this._shadersLoaded\n ? undefined\n : async () => {\n await this._importShadersAsync();\n this._shadersLoaded = true;\n },\n },\n this._engine\n ),\n join\n );\n }\n\n const effectIsReady = drawWrapper.effect!.isReady();\n\n return effectIsReady && (this._dontCheckIfReady || (!this._dontCheckIfReady && this.isLayerReady()));\n }\n\n protected override async _importShadersAsync(): Promise<void> {\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\n await Promise.all([\n import(\"../ShadersWGSL/selection.vertex\"),\n import(\"../ShadersWGSL/selection.fragment\"),\n import(\"../ShadersWGSL/glowMapMerge.vertex\"),\n import(\"../ShadersWGSL/selectionOutline.fragment\"),\n ]);\n } else {\n await Promise.all([\n import(\"../Shaders/selection.vertex\"),\n import(\"../Shaders/selection.fragment\"),\n import(\"../Shaders/glowMapMerge.vertex\"),\n import(\"../Shaders/selectionOutline.fragment\"),\n ]);\n }\n\n await super._importShadersAsync();\n }\n\n /**\n * Get the effect name of the layer.\n * @returns The effect name\n */\n public override getEffectName(): string {\n return ThinSelectionOutlineLayer.EffectName;\n }\n\n /** @internal */\n public override _createMergeEffect(): Effect {\n const defines: string[] = [];\n switch (this._options.outlineMethod) {\n case Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL:\n defines.push(\"#define OUTLINELAYER_SAMPLING_TRIDIRECTIONAL\");\n break;\n case Constants.OUTLINELAYER_SAMPLING_OCTADIRECTIONAL:\n defines.push(\"#define OUTLINELAYER_SAMPLING_OCTADIRECTIONAL\");\n break;\n }\n const join = defines.join(\"\\n\");\n\n return this._engine.createEffect(\n {\n // glowMapMerge vertex is just a basic vertex shader for drawing a quad. so we reuse it here\n vertex: \"glowMapMerge\",\n // selection outline fragment does computation of outline with alpha channel for blending\n fragment: \"selectionOutline\",\n },\n <IEffectCreationOptions>{\n attributes: [VertexBuffer.PositionKind],\n uniformsNames: [\"screenSize\", \"outlineColor\", \"outlineThickness\", \"occlusionStrength\", \"occlusionThreshold\"],\n samplers: [\"maskSampler\", \"depthSampler\"],\n defines: join,\n fallbacks: null,\n onCompiled: null,\n onError: null,\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: this._shadersLoaded\n ? undefined\n : async () => {\n await this._importShadersAsync();\n this._shadersLoaded = true;\n },\n },\n this._engine\n );\n }\n\n /** @internal */\n public override _createTextureAndPostProcesses(): void {\n // we don't need to create a texture for this layer. since all computation is done in the merge effect\n }\n\n /**\n * Checks for the readiness of the element composing the layer.\n * @param subMesh the mesh to check for\n * @param useInstances specify whether or not to use instances to render the mesh\n * @returns true if ready otherwise, false\n */\n public override isReady(subMesh: SubMesh, useInstances: boolean): boolean {\n const material = subMesh.getMaterial();\n const mesh = subMesh.getRenderingMesh();\n\n if (!material || !mesh || !this._selection) {\n return false;\n }\n\n return super._isSubMeshReady(subMesh, useInstances, null);\n }\n\n /** @internal */\n public override _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean {\n return true;\n }\n\n protected override _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\n if (!this._internalShouldRender()) {\n return;\n }\n\n const material = subMesh.getMaterial();\n const ownerMesh = subMesh.getMesh();\n const replacementMesh = subMesh.getReplacementMesh();\n const renderingMesh = subMesh.getRenderingMesh();\n const effectiveMesh = subMesh.getEffectiveMesh();\n const scene = this._scene;\n const engine = scene.getEngine();\n\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\n\n if (!material) {\n return;\n }\n\n // Do not block in blend mode.\n if (!this._canRenderMesh(renderingMesh, material)) {\n return;\n }\n\n // Culling\n let sideOrientation = material._getEffectiveOrientation(renderingMesh);\n const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();\n if (mainDeterminant < 0) {\n sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n }\n\n const reverse = sideOrientation === Material.ClockWiseSideOrientation;\n engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, undefined, material.zOffsetUnits);\n\n // Managing instances\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!replacementMesh);\n if (batch.mustReturn) {\n return;\n }\n\n // Early Exit per mesh\n if (!this._shouldRenderMesh(renderingMesh)) {\n return;\n }\n\n const hardwareInstancedRendering =\n batch.hardwareInstancedRendering[subMesh._id] ||\n renderingMesh.hasThinInstances ||\n (!!renderingMesh._userInstancedBuffersStorage &&\n ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName in renderingMesh._userInstancedBuffersStorage.vertexBuffers);\n\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\n\n this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);\n\n // selection outline layer is not compatible with custom materials\n // if (this._useMeshMaterial(renderingMesh)) {\n // subMesh.getMaterial()!._glowModeEnabled = true;\n // renderingMesh.render(subMesh, enableAlphaMode, replacementMesh || undefined);\n // subMesh.getMaterial()!._glowModeEnabled = false;\n // } else\n if (this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\n const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\n\n let drawWrapper = subMesh._getDrawWrapper();\n if (!drawWrapper && renderingMaterial) {\n drawWrapper = renderingMaterial._getDrawWrapper();\n }\n\n if (!drawWrapper) {\n return;\n }\n\n const effect = drawWrapper.effect!;\n\n engine.enableEffect(drawWrapper);\n if (!hardwareInstancedRendering) {\n renderingMesh._bind(subMesh, effect, material.fillMode);\n }\n\n if (!renderingMaterial) {\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\n if (this._options.storeCameraSpaceZ) {\n effect.setMatrix(\"view\", scene.getViewMatrix());\n } else {\n const camera = this.camera || scene.activeCamera;\n if (camera) {\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\n\n let minZ: number, maxZ: number;\n\n if (cameraIsOrtho) {\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\n } else {\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\n }\n\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\n }\n }\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\n } else {\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\n }\n\n if (!renderingMaterial) {\n // Alpha test\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\n const alphaTexture = material.getAlphaTestTexture();\n if (alphaTexture) {\n effect.setTexture(\"diffuseSampler\", alphaTexture);\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\n }\n }\n\n // Bones\n BindBonesParameters(renderingMesh, effect);\n\n // Morph targets\n BindMorphTargetParameters(renderingMesh, effect);\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\n renderingMesh.morphTargetManager._bind(effect);\n }\n\n // Baked vertex animations\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\n if (bvaManager && bvaManager.isEnabled) {\n bvaManager.bind(effect, hardwareInstancedRendering);\n }\n\n // Alpha mode\n if (enableAlphaMode) {\n engine.setAlphaMode(material.alphaMode);\n }\n\n // Clip planes\n BindClipPlane(effect, material, scene);\n\n // Selection ID\n let selectionId = this._meshUniqueIdToSelectionId[renderingMesh.uniqueId];\n // When using LOD, the rendering mesh is the LOD mesh, not the source mesh.\n // Look up the selection ID from the master (source) mesh.\n if (selectionId === undefined && renderingMesh._masterMesh) {\n selectionId = this._meshUniqueIdToSelectionId[renderingMesh._masterMesh.uniqueId];\n if (selectionId === undefined) {\n selectionId = renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];\n }\n }\n if (!renderingMesh.hasInstances && !renderingMesh.hasThinInstances && !renderingMesh.isAnInstance && selectionId !== undefined) {\n effect.setFloat(\"selectionId\", selectionId);\n }\n }\n\n // Draw\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) =>\n effect.setMatrix(\"world\", world)\n );\n } else {\n // Need to reset refresh rate of the main map\n this._objectRenderer.resetRefreshCounter();\n }\n\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\n }\n\n /** @internal */\n public override _internalCompose(effect: Effect, _renderIndex: number): void {\n // Texture\n this.bindTexturesForCompose(effect);\n effect.setFloat2(\"screenSize\", this.textureWidth, this.textureHeight);\n effect.setColor3(\"outlineColor\", this.outlineColor);\n effect.setFloat(\"outlineThickness\", this.outlineThickness);\n effect.setFloat(\"occlusionStrength\", this.occlusionStrength);\n effect.setFloat(\"occlusionThreshold\", this.occlusionThreshold);\n\n // Cache\n const engine = this._engine;\n const previousStencilBuffer = engine.getStencilBuffer();\n\n // Draw order\n engine.setStencilBuffer(false);\n\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\n\n // Draw order\n engine.setStencilBuffer(previousStencilBuffer);\n }\n\n /** @internal */\n public override _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void {\n // we don't use emissive texture or color for this layer\n }\n\n /**\n * Returns true if the layer contains information to display, otherwise false.\n * @returns true if the glow layer should be rendered\n */\n public override shouldRender(): boolean {\n return this._selection && super.shouldRender() ? true : false;\n }\n\n /** @internal */\n public override _shouldRenderMesh(mesh: Mesh): boolean {\n // Use the base class check (renderingGroupId) rather than this.hasMesh,\n // because LOD meshes won't be in _selection but still need to render.\n return super.hasMesh(mesh);\n }\n\n /** @internal */\n public override _addCustomEffectDefines(defines: string[]): void {\n if (this._options.storeCameraSpaceZ) {\n defines.push(\"#define STORE_CAMERASPACE_Z\");\n }\n }\n\n /**\n * Determine if a given mesh will be used in the current effect.\n * @param mesh mesh to test\n * @returns true if the mesh will be used\n */\n public override hasMesh(mesh: AbstractMesh): boolean {\n if (!super.hasMesh(mesh) || !this._selection) {\n return false;\n }\n return this._selection.indexOf(mesh) !== -1;\n }\n\n /** @internal */\n public override _useMeshMaterial(_mesh: AbstractMesh): boolean {\n return false;\n }\n\n /**\n * Remove all the meshes currently referenced in the selection outline layer\n */\n public clearSelection(): void {\n if (!this._selection) {\n return;\n }\n\n for (let index = 0; index < this._selection.length; ++index) {\n this._cleanUpInstanceSelectionId(this._selection[index] as Mesh);\n }\n\n // addSelection registers instanceSelectionId on the source mesh\n // (via sourceMesh.registerInstancedBuffer), but _selection contains\n // the instance, not the source. Clean up source meshes separately.\n this._instancedBufferSources.forEach((sourceMesh) => this._cleanUpInstanceSelectionId(sourceMesh));\n this._instancedBufferSources.clear();\n\n this._selection.length = 0;\n this._meshUniqueIdToSelectionId.length = 0;\n\n this._nextSelectionId = 1;\n\n this._shouldRender = false;\n }\n\n /**\n * Remove instanceSelectionId instanced buffer registration from a mesh,\n * including GPU resources (per-pass VBOs, vertex buffers, VAOs).\n * @param mesh - The mesh to clean up\n */\n private _cleanUpInstanceSelectionId(mesh: Mesh): void {\n if (mesh._userInstancedBuffersStorage) {\n const kind = ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName;\n\n // Dispose per-pass VBOs for ALL render passes (WebGPU).\n // _processInstancedBuffers creates per-pass VBOs for every render pass\n // that renders this mesh (main scene, depth renderer, etc.), not just\n // this layer's own passes. We must clean them all up to avoid using\n // a destroyed GPU buffer on the next submit.\n if (mesh._userInstancedBuffersStorage.renderPasses) {\n for (const passId in mesh._userInstancedBuffersStorage.renderPasses) {\n const renderPassId = Number(passId);\n const passVBOs = mesh._userInstancedBuffersStorage.renderPasses[renderPassId];\n if (passVBOs?.[kind]) {\n passVBOs[kind]!.dispose();\n delete passVBOs[kind];\n }\n }\n }\n\n mesh._userInstancedBuffersStorage.vertexBuffers[kind]?.dispose();\n\n const vao = mesh._userInstancedBuffersStorage.vertexArrayObjects?.[kind];\n if (vao) {\n // invalidate VAO is very important to keep sync between VAO and vertex buffers\n (this._engine as ThinEngine).releaseVertexArrayObject(vao);\n delete mesh._userInstancedBuffersStorage.vertexArrayObjects![kind];\n }\n\n delete mesh._userInstancedBuffersStorage.data[kind];\n delete mesh._userInstancedBuffersStorage.vertexBuffers[kind];\n delete mesh._userInstancedBuffersStorage.strides[kind];\n delete mesh._userInstancedBuffersStorage.sizes[kind];\n\n if (Object.keys(mesh._userInstancedBuffersStorage.vertexBuffers).length === 0) {\n mesh._userInstancedBuffersStorage = undefined!;\n }\n }\n if (mesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] !== undefined) {\n delete mesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];\n }\n\n // In WebGPU non-compat mode, cached render bundles (fastBundle) bake\n // vertex-buffer GPU handles at record time. Because the new VBO has\n // the same format (and thus the same hashCode), the pipeline cache\n // won't detect the change and would replay the stale bundle.\n // Resetting the draw cache forces new bundles to be recorded.\n if (this._engine.isWebGPU && !this._engine.compatibilityMode) {\n mesh.resetDrawCache();\n }\n }\n\n /**\n * Adds mesh or group of mesh to the current selection\n *\n * If a group of meshes is provided, they will outline as a single unit\n * @param meshOrGroup Meshes to add to the selection\n */\n public addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\n if (!this._selection) {\n return;\n }\n\n const nextId = this._nextSelectionId;\n\n const group = Array.isArray(meshOrGroup) ? meshOrGroup : [meshOrGroup];\n if (group.length === 0) {\n return;\n }\n\n for (let meshIndex = 0; meshIndex < group.length; ++meshIndex) {\n const mesh = group[meshIndex];\n\n this._selection.push(mesh); // add to render list\n\n if (mesh.hasInstances || mesh.isAnInstance) {\n const sourceMesh = (mesh as InstancedMesh).sourceMesh ?? (mesh as Mesh);\n\n if (sourceMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] === undefined) {\n sourceMesh.registerInstancedBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, 1);\n }\n this._instancedBufferSources.add(sourceMesh);\n\n mesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] = nextId;\n } else if (mesh.hasThinInstances) {\n const thinInstanceCount = (mesh as Mesh).thinInstanceCount;\n const selectionIdData = new Float32Array(thinInstanceCount);\n for (let i = 0; i < thinInstanceCount; i++) {\n selectionIdData[i] = nextId;\n }\n (mesh as Mesh).thinInstanceSetBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, selectionIdData, 1);\n } else {\n this._meshUniqueIdToSelectionId[mesh.uniqueId] = nextId;\n }\n }\n this._nextSelectionId += 1;\n\n this._shouldRender = true;\n }\n\n /**\n * Free any resources and references associated to a mesh.\n * Internal use\n * @param mesh The mesh to free.\n * @internal\n */\n public _disposeMesh(mesh: Mesh): void {\n const selection = this._selection;\n if (!selection) {\n return;\n }\n\n const index = selection.indexOf(mesh);\n if (index !== -1) {\n selection.splice(index, 1);\n\n if (mesh.hasInstances) {\n mesh.removeVerticesData(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName);\n } else if (mesh.hasThinInstances) {\n (mesh as Mesh).thinInstanceSetBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, null);\n }\n\n if (mesh.isAnInstance) {\n const sourceMesh = (mesh as unknown as InstancedMesh).sourceMesh;\n // Only remove the source from tracking if no other selected\n // instance shares it, to avoid leaking its GPU resources.\n if (sourceMesh && !selection.some((m) => m !== mesh && m.isAnInstance && (m as unknown as InstancedMesh).sourceMesh === sourceMesh)) {\n this._instancedBufferSources.delete(sourceMesh);\n }\n }\n\n if (selection.length === 0) {\n this._shouldRender = false;\n }\n }\n }\n\n /**\n * Dispose the effect layer and free resources.\n */\n public override dispose(): void {\n this.clearSelection();\n this._selection = null;\n\n super.dispose();\n }\n}\n"]}
1
+ {"version":3,"file":"thinSelectionOutlineLayer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/thinSelectionOutlineLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"../Buffers/buffer\";\nimport { Camera } from \"../Cameras/camera\";\nimport { Constants } from \"../Engines/constants\";\nimport { type ThinEngine } from \"../Engines/thinEngine\";\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"../Materials/clipPlaneMaterialHelper\";\nimport { type Effect, type IEffectCreationOptions } from \"../Materials/effect\";\nimport { EffectFallbacks } from \"../Materials/effectFallbacks\";\nimport { Material } from \"../Materials/material\";\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\nimport { ShaderLanguage } from \"../Materials/shaderLanguage\";\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\nimport { Color3, Color4 } from \"../Maths/math.color\";\nimport { type AbstractMesh } from \"../Meshes/abstractMesh\";\nimport { type InstancedMesh } from \"../Meshes/instancedMesh\";\nimport { type Mesh } from \"../Meshes/mesh\";\nimport { type SubMesh } from \"../Meshes/subMesh\";\nimport { type Scene } from \"../scene\";\nimport { type Nullable } from \"../types\";\nimport { type IThinEffectLayerOptions, ThinEffectLayer } from \"./thinEffectLayer\";\n\n/**\n * Selection outline layer options. This helps customizing the behaviour\n * of the selection outline layer.\n */\nexport interface IThinSelectionOutlineLayerOptions extends IThinEffectLayerOptions {\n /**\n * Use the GLSL code generation for the shader (even on WebGPU). Default is false\n */\n forceGLSL?: boolean;\n\n /**\n * Specifies whether the depth stored is the Z coordinate in camera space.\n */\n storeCameraSpaceZ?: boolean;\n\n /**\n * Outline method to use (default: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL)\n *\n * @see {@link Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL}\n */\n outlineMethod?: number;\n}\n\n/**\n * @internal\n */\nexport class ThinSelectionOutlineLayer extends ThinEffectLayer {\n /**\n * Effect Name of the layer.\n */\n public static readonly EffectName = \"SelectionOutlineLayer\";\n\n /**\n * Name of the instance selection ID attribute\n * @internal\n */\n public static readonly InstanceSelectionIdAttributeName = \"instanceSelectionId\";\n\n /**\n * The outline color\n */\n public outlineColor: Color3 = new Color3(1, 0.5, 0);\n\n /**\n * The thickness of the edges\n */\n public outlineThickness: number = 2.0;\n\n /**\n * The strength of the occlusion effect (default: 0.8)\n */\n public occlusionStrength: number = 0.8;\n\n /**\n * The occlusion threshold (default: 0.0001)\n */\n public occlusionThreshold: number = 0.0001;\n\n /**\n * The width of the source texture\n */\n public textureWidth: number = 0;\n\n /**\n * The height of the source texture\n */\n public textureHeight: number = 0;\n\n /** @internal */\n public override _options: Required<IThinSelectionOutlineLayerOptions>;\n\n /** @internal */\n public readonly _meshUniqueIdToSelectionId: number[] = [];\n /** @internal */\n public _selection: Nullable<AbstractMesh[]> = [];\n private _instancedBufferSources: Set<Mesh> = new Set();\n private _nextSelectionId = 1;\n\n /**\n * Instantiates a new selection outline Layer and references it to the scene..\n * @param name The name of the layer\n * @param scene The scene to use the layer in\n * @param options Sets of none mandatory options to use with the layer (see IThinSelectionOutlineLayerOptions for more information)\n * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.\n */\n public constructor(name: string, scene?: Scene, options?: Partial<IThinSelectionOutlineLayerOptions>, dontCheckIfReady = false) {\n super(name, scene, options !== undefined ? !!options.forceGLSL : false);\n\n // Adapt options\n this._options = {\n mainTextureRatio: 1.0,\n mainTextureFixedSize: 0,\n alphaBlendingMode: Constants.ALPHA_COMBINE,\n camera: null,\n renderingGroupId: -1,\n forceGLSL: false,\n mainTextureType: Constants.TEXTURETYPE_FLOAT,\n mainTextureFormat: Constants.TEXTUREFORMAT_RG,\n storeCameraSpaceZ: false,\n outlineMethod: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL,\n ...options,\n };\n\n // Fall back to a supported mask texture type if the device doesn't support rendering to float framebuffers\n // or linear filtering of float textures (e.g. OES_texture_float_linear missing on some iOS versions)\n if (this._options.mainTextureType === Constants.TEXTURETYPE_FLOAT && !(this._engine.getCaps().textureFloatRender && this._engine.getCaps().textureFloatLinearFiltering)) {\n this._options.mainTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\n }\n if (\n this._options.mainTextureType === Constants.TEXTURETYPE_HALF_FLOAT &&\n !(this._engine.getCaps().textureHalfFloatRender && this._engine.getCaps().textureHalfFloatLinearFiltering)\n ) {\n this._options.mainTextureType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\n }\n\n // When using an 8-bit render target, we cannot reliably store camera-space Z in the mask texture:\n // depth would be clamped/quantized, breaking occlusion comparisons. In that case, force-disable\n // storeCameraSpaceZ so the layer falls back to the supported behavior.\n if (this._options.storeCameraSpaceZ && this._options.mainTextureType === Constants.TEXTURETYPE_UNSIGNED_BYTE) {\n this._options.storeCameraSpaceZ = false;\n }\n // set clear color\n this.neutralColor = new Color4(0.0, this._options.storeCameraSpaceZ ? 0.0 : 1.0, 0.0, 1.0);\n\n // Initialize the layer\n this._init(this._options);\n\n // Do not render as long as no meshes have been added\n this._shouldRender = false;\n\n if (dontCheckIfReady) {\n // When dontCheckIfReady is true, we are in the new ThinXXX layer mode, so we must call _createTextureAndPostProcesses ourselves (it is called by EffectLayer otherwise)\n this._createTextureAndPostProcesses();\n }\n }\n\n /**\n * Gets the class name of the effect layer\n * @returns the string with the class name of the effect layer\n */\n public getClassName(): string {\n return \"SelectionOutlineLayer\";\n }\n\n /** @internal */\n public override _internalIsSubMeshReady(subMesh: SubMesh, useInstances: boolean, _emissiveTexture: Nullable<BaseTexture>): boolean {\n const engine = this._scene.getEngine();\n const mesh = subMesh.getMesh();\n\n const renderingMaterial = mesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\n\n if (renderingMaterial) {\n return renderingMaterial.isReadyForSubMesh(mesh, subMesh, useInstances);\n }\n\n const material = subMesh.getMaterial();\n\n if (!material) {\n return false;\n }\n\n // selection outline layer is not compatible with custom materials\n // if (this._useMeshMaterial(subMesh.getRenderingMesh())) {\n // return material.isReadyForSubMesh(subMesh.getMesh(), subMesh, useInstances);\n // }\n\n const defines: string[] = [];\n\n const attribs = [VertexBuffer.PositionKind];\n\n let uv1 = false;\n let uv2 = false;\n const color = false;\n\n // Alpha test\n if (material.needAlphaTestingForMesh(mesh)) {\n defines.push(\"#define ALPHATEST\");\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\n attribs.push(VertexBuffer.UVKind);\n defines.push(\"#define UV1\");\n uv1 = true;\n }\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\n attribs.push(VertexBuffer.UV2Kind);\n defines.push(\"#define UV2\");\n uv2 = true;\n }\n }\n\n // Bones\n const fallbacks = new EffectFallbacks();\n if (mesh.useBones && mesh.computeBonesUsingShaders) {\n attribs.push(VertexBuffer.MatricesIndicesKind);\n attribs.push(VertexBuffer.MatricesWeightsKind);\n if (mesh.numBoneInfluencers > 4) {\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\n }\n\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\n\n const skeleton = mesh.skeleton;\n if (skeleton && skeleton.isUsingTextureForMatrices) {\n defines.push(\"#define BONETEXTURE\");\n } else {\n defines.push(\"#define BonesPerMesh \" + (skeleton ? skeleton.bones.length + 1 : 0));\n }\n\n if (mesh.numBoneInfluencers > 0) {\n fallbacks.addCPUSkinningFallback(0, mesh);\n }\n } else {\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\n }\n\n // Morph targets\n const numMorphInfluencers = mesh.morphTargetManager\n ? PrepareDefinesAndAttributesForMorphTargets(\n mesh.morphTargetManager,\n defines,\n attribs,\n mesh,\n true, // usePositionMorph\n false, // useNormalMorph\n false, // useTangentMorph\n uv1, // useUVMorph\n uv2, // useUV2Morph\n color // useColorMorph\n )\n : 0;\n\n // Instances\n if (useInstances) {\n defines.push(\"#define INSTANCES\");\n PushAttributesForInstances(attribs);\n if (subMesh.getRenderingMesh().hasThinInstances) {\n defines.push(\"#define THIN_INSTANCES\");\n }\n }\n\n // Baked vertex animations\n const bvaManager = mesh.bakedVertexAnimationManager;\n if (bvaManager && bvaManager.isEnabled) {\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\n if (useInstances) {\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\n }\n }\n\n // ClipPlanes\n PrepareStringDefinesForClipPlanes(material, this._scene, defines);\n\n // Selection ID\n if (useInstances) {\n attribs.push(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName);\n }\n\n this._addCustomEffectDefines(defines);\n\n // Get correct effect\n const drawWrapper = subMesh._getDrawWrapper(undefined, true)!;\n const cachedDefines = drawWrapper.defines as string;\n const join = defines.join(\"\\n\");\n if (cachedDefines !== join) {\n const uniforms = [\n \"world\",\n \"mBones\",\n \"viewProjection\",\n \"view\",\n \"morphTargetInfluences\",\n \"morphTargetCount\",\n \"boneTextureInfo\",\n \"diffuseMatrix\",\n \"morphTargetTextureInfo\",\n \"morphTargetTextureIndices\",\n \"bakedVertexAnimationSettings\",\n \"bakedVertexAnimationTextureSizeInverted\",\n \"bakedVertexAnimationTime\",\n \"bakedVertexAnimationTexture\",\n \"depthValues\",\n \"selectionId\",\n ];\n\n AddClipPlaneUniforms(uniforms);\n\n drawWrapper.setEffect(\n this._engine.createEffect(\n \"selection\",\n <IEffectCreationOptions>{\n attributes: attribs,\n uniformsNames: uniforms,\n uniformBuffersNames: [],\n samplers: [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"],\n defines: join,\n fallbacks: fallbacks,\n onCompiled: null,\n onError: null,\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: this._shadersLoaded\n ? undefined\n : async () => {\n await this._importShadersAsync();\n this._shadersLoaded = true;\n },\n },\n this._engine\n ),\n join\n );\n }\n\n const effectIsReady = drawWrapper.effect!.isReady();\n\n return effectIsReady && (this._dontCheckIfReady || (!this._dontCheckIfReady && this.isLayerReady()));\n }\n\n protected override async _importShadersAsync(): Promise<void> {\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\n await Promise.all([\n import(\"../ShadersWGSL/selection.vertex\"),\n import(\"../ShadersWGSL/selection.fragment\"),\n import(\"../ShadersWGSL/glowMapMerge.vertex\"),\n import(\"../ShadersWGSL/selectionOutline.fragment\"),\n ]);\n } else {\n await Promise.all([\n import(\"../Shaders/selection.vertex\"),\n import(\"../Shaders/selection.fragment\"),\n import(\"../Shaders/glowMapMerge.vertex\"),\n import(\"../Shaders/selectionOutline.fragment\"),\n ]);\n }\n\n await super._importShadersAsync();\n }\n\n /**\n * Get the effect name of the layer.\n * @returns The effect name\n */\n public override getEffectName(): string {\n return ThinSelectionOutlineLayer.EffectName;\n }\n\n /** @internal */\n public override _createMergeEffect(): Effect {\n const defines: string[] = [];\n switch (this._options.outlineMethod) {\n case Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL:\n defines.push(\"#define OUTLINELAYER_SAMPLING_TRIDIRECTIONAL\");\n break;\n case Constants.OUTLINELAYER_SAMPLING_OCTADIRECTIONAL:\n defines.push(\"#define OUTLINELAYER_SAMPLING_OCTADIRECTIONAL\");\n break;\n }\n const join = defines.join(\"\\n\");\n\n return this._engine.createEffect(\n {\n // glowMapMerge vertex is just a basic vertex shader for drawing a quad. so we reuse it here\n vertex: \"glowMapMerge\",\n // selection outline fragment does computation of outline with alpha channel for blending\n fragment: \"selectionOutline\",\n },\n <IEffectCreationOptions>{\n attributes: [VertexBuffer.PositionKind],\n uniformsNames: [\"screenSize\", \"outlineColor\", \"outlineThickness\", \"occlusionStrength\", \"occlusionThreshold\"],\n samplers: [\"maskSampler\", \"depthSampler\"],\n defines: join,\n fallbacks: null,\n onCompiled: null,\n onError: null,\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: this._shadersLoaded\n ? undefined\n : async () => {\n await this._importShadersAsync();\n this._shadersLoaded = true;\n },\n },\n this._engine\n );\n }\n\n /** @internal */\n public override _createTextureAndPostProcesses(): void {\n // we don't need to create a texture for this layer. since all computation is done in the merge effect\n }\n\n /**\n * Checks for the readiness of the element composing the layer.\n * @param subMesh the mesh to check for\n * @param useInstances specify whether or not to use instances to render the mesh\n * @returns true if ready otherwise, false\n */\n public override isReady(subMesh: SubMesh, useInstances: boolean): boolean {\n const material = subMesh.getMaterial();\n const mesh = subMesh.getRenderingMesh();\n\n if (!material || !mesh || !this._selection) {\n return false;\n }\n\n return super._isSubMeshReady(subMesh, useInstances, null);\n }\n\n /** @internal */\n public override _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean {\n return true;\n }\n\n protected override _renderSubMesh(subMesh: SubMesh, enableAlphaMode: boolean = false): void {\n if (!this._internalShouldRender()) {\n return;\n }\n\n const material = subMesh.getMaterial();\n const ownerMesh = subMesh.getMesh();\n const replacementMesh = subMesh.getReplacementMesh();\n const renderingMesh = subMesh.getRenderingMesh();\n const effectiveMesh = subMesh.getEffectiveMesh();\n const scene = this._scene;\n const engine = scene.getEngine();\n\n effectiveMesh._internalAbstractMeshDataInfo._isActiveIntermediate = false;\n\n if (!material) {\n return;\n }\n\n // Do not block in blend mode.\n if (!this._canRenderMesh(renderingMesh, material)) {\n return;\n }\n\n // Culling\n let sideOrientation = material._getEffectiveOrientation(renderingMesh);\n const mainDeterminant = effectiveMesh._getWorldMatrixDeterminant();\n if (mainDeterminant < 0) {\n sideOrientation = sideOrientation === Material.ClockWiseSideOrientation ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\n }\n\n const reverse = sideOrientation === Material.ClockWiseSideOrientation;\n engine.setState(material.backFaceCulling, material.zOffset, undefined, reverse, material.cullBackFaces, undefined, material.zOffsetUnits);\n\n // Managing instances\n const batch = renderingMesh._getInstancesRenderList(subMesh._id, !!replacementMesh);\n if (batch.mustReturn) {\n return;\n }\n\n // Early Exit per mesh\n if (!this._shouldRenderMesh(renderingMesh)) {\n return;\n }\n\n const hardwareInstancedRendering =\n batch.hardwareInstancedRendering[subMesh._id] ||\n renderingMesh.hasThinInstances ||\n (!!renderingMesh._userInstancedBuffersStorage &&\n ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName in renderingMesh._userInstancedBuffersStorage.vertexBuffers);\n\n // When LOD transitions cause a different mesh to render with hardware instancing,\n // the LOD mesh's own instanceSelectionId must reflect the source mesh's value so\n // the \"self\" draw (representing the source mesh) gets the correct selection ID.\n if (hardwareInstancedRendering && renderingMesh._masterMesh && renderingMesh.instancedBuffers) {\n renderingMesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] =\n renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] ?? null;\n }\n\n this._setEmissiveTextureAndColor(renderingMesh, subMesh, material);\n\n this.onBeforeRenderMeshToEffect.notifyObservers(ownerMesh);\n\n // selection outline layer is not compatible with custom materials\n // if (this._useMeshMaterial(renderingMesh)) {\n // subMesh.getMaterial()!._glowModeEnabled = true;\n // renderingMesh.render(subMesh, enableAlphaMode, replacementMesh || undefined);\n // subMesh.getMaterial()!._glowModeEnabled = false;\n // } else\n if (this._isSubMeshReady(subMesh, hardwareInstancedRendering, this._emissiveTextureAndColor.texture)) {\n const renderingMaterial = effectiveMesh._internalAbstractMeshDataInfo._materialForRenderPass?.[engine.currentRenderPassId];\n\n let drawWrapper = subMesh._getDrawWrapper();\n if (!drawWrapper && renderingMaterial) {\n drawWrapper = renderingMaterial._getDrawWrapper();\n }\n\n if (!drawWrapper) {\n return;\n }\n\n const effect = drawWrapper.effect!;\n\n engine.enableEffect(drawWrapper);\n if (!hardwareInstancedRendering) {\n renderingMesh._bind(subMesh, effect, material.fillMode);\n }\n\n if (!renderingMaterial) {\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\n if (this._options.storeCameraSpaceZ) {\n effect.setMatrix(\"view\", scene.getViewMatrix());\n } else {\n const camera = this.camera || scene.activeCamera;\n if (camera) {\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\n\n let minZ: number, maxZ: number;\n\n if (cameraIsOrtho) {\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\n } else {\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\n }\n\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\n }\n }\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\n } else {\n renderingMaterial.bindForSubMesh(effectiveMesh.getWorldMatrix(), effectiveMesh as Mesh, subMesh);\n }\n\n if (!renderingMaterial) {\n // Alpha test\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\n const alphaTexture = material.getAlphaTestTexture();\n if (alphaTexture) {\n effect.setTexture(\"diffuseSampler\", alphaTexture);\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\n }\n }\n\n // Bones\n BindBonesParameters(renderingMesh, effect);\n\n // Morph targets\n BindMorphTargetParameters(renderingMesh, effect);\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\n renderingMesh.morphTargetManager._bind(effect);\n }\n\n // Baked vertex animations\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\n if (bvaManager && bvaManager.isEnabled) {\n bvaManager.bind(effect, hardwareInstancedRendering);\n }\n\n // Alpha mode\n if (enableAlphaMode) {\n engine.setAlphaMode(material.alphaMode);\n }\n\n // Clip planes\n BindClipPlane(effect, material, scene);\n\n // Selection ID\n let selectionId = this._meshUniqueIdToSelectionId[renderingMesh.uniqueId];\n // When using LOD, the rendering mesh is the LOD mesh, not the source mesh.\n // Look up the selection ID from the master (source) mesh.\n if (selectionId === undefined && renderingMesh._masterMesh) {\n selectionId = this._meshUniqueIdToSelectionId[renderingMesh._masterMesh.uniqueId];\n if (selectionId === undefined) {\n // Prefer the ownerMesh (submesh owner) which is the actual instance\n // being rendered during LOD, then fall back to the master (source) mesh.\n selectionId =\n ownerMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] ??\n renderingMesh._masterMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];\n }\n }\n if (!renderingMesh.hasInstances && !renderingMesh.hasThinInstances && !renderingMesh.isAnInstance && selectionId !== undefined) {\n effect.setFloat(\"selectionId\", selectionId);\n }\n }\n\n // Draw\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) =>\n effect.setMatrix(\"world\", world)\n );\n } else {\n // Need to reset refresh rate of the main map\n this._objectRenderer.resetRefreshCounter();\n }\n\n this.onAfterRenderMeshToEffect.notifyObservers(ownerMesh);\n }\n\n /** @internal */\n public override _internalCompose(effect: Effect, _renderIndex: number): void {\n // Texture\n this.bindTexturesForCompose(effect);\n effect.setFloat2(\"screenSize\", this.textureWidth, this.textureHeight);\n effect.setColor3(\"outlineColor\", this.outlineColor);\n effect.setFloat(\"outlineThickness\", this.outlineThickness);\n effect.setFloat(\"occlusionStrength\", this.occlusionStrength);\n effect.setFloat(\"occlusionThreshold\", this.occlusionThreshold);\n\n // Cache\n const engine = this._engine;\n const previousStencilBuffer = engine.getStencilBuffer();\n\n // Draw order\n engine.setStencilBuffer(false);\n\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\n\n // Draw order\n engine.setStencilBuffer(previousStencilBuffer);\n }\n\n /** @internal */\n public override _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void {\n // we don't use emissive texture or color for this layer\n }\n\n /**\n * Returns true if the layer contains information to display, otherwise false.\n * @returns true if the glow layer should be rendered\n */\n public override shouldRender(): boolean {\n return this._selection && super.shouldRender() ? true : false;\n }\n\n /** @internal */\n public override _shouldRenderMesh(mesh: Mesh): boolean {\n // Use the base class check (renderingGroupId) rather than this.hasMesh,\n // because LOD meshes won't be in _selection but still need to render.\n return super.hasMesh(mesh);\n }\n\n /** @internal */\n public override _addCustomEffectDefines(defines: string[]): void {\n if (this._options.storeCameraSpaceZ) {\n defines.push(\"#define STORE_CAMERASPACE_Z\");\n }\n }\n\n /**\n * Determine if a given mesh will be used in the current effect.\n * @param mesh mesh to test\n * @returns true if the mesh will be used\n */\n public override hasMesh(mesh: AbstractMesh): boolean {\n if (!super.hasMesh(mesh) || !this._selection) {\n return false;\n }\n return this._selection.indexOf(mesh) !== -1;\n }\n\n /** @internal */\n public override _useMeshMaterial(_mesh: AbstractMesh): boolean {\n return false;\n }\n\n /**\n * Remove all the meshes currently referenced in the selection outline layer\n */\n public clearSelection(): void {\n if (!this._selection) {\n return;\n }\n\n for (let index = 0; index < this._selection.length; ++index) {\n this._cleanUpInstanceSelectionId(this._selection[index] as Mesh);\n }\n\n // addSelection registers instanceSelectionId on the source mesh\n // (via sourceMesh.registerInstancedBuffer), but _selection contains\n // the instance, not the source. Clean up source meshes separately.\n this._instancedBufferSources.forEach((sourceMesh) => this._cleanUpInstanceSelectionId(sourceMesh));\n this._instancedBufferSources.clear();\n\n this._selection.length = 0;\n this._meshUniqueIdToSelectionId.length = 0;\n\n this._nextSelectionId = 1;\n\n this._shouldRender = false;\n }\n\n /**\n * Remove instanceSelectionId instanced buffer registration from a mesh,\n * including GPU resources (per-pass VBOs, vertex buffers, VAOs).\n * @param mesh - The mesh to clean up\n */\n private _cleanUpInstanceSelectionId(mesh: Mesh): void {\n if (mesh._userInstancedBuffersStorage) {\n const kind = ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName;\n\n // Dispose per-pass VBOs for ALL render passes (WebGPU).\n // _processInstancedBuffers creates per-pass VBOs for every render pass\n // that renders this mesh (main scene, depth renderer, etc.), not just\n // this layer's own passes. We must clean them all up to avoid using\n // a destroyed GPU buffer on the next submit.\n if (mesh._userInstancedBuffersStorage.renderPasses) {\n for (const passId in mesh._userInstancedBuffersStorage.renderPasses) {\n const renderPassId = Number(passId);\n const passVBOs = mesh._userInstancedBuffersStorage.renderPasses[renderPassId];\n if (passVBOs?.[kind]) {\n passVBOs[kind]!.dispose();\n delete passVBOs[kind];\n }\n }\n }\n\n mesh._userInstancedBuffersStorage.vertexBuffers[kind]?.dispose();\n\n const vao = mesh._userInstancedBuffersStorage.vertexArrayObjects?.[kind];\n if (vao) {\n // invalidate VAO is very important to keep sync between VAO and vertex buffers\n (this._engine as ThinEngine).releaseVertexArrayObject(vao);\n delete mesh._userInstancedBuffersStorage.vertexArrayObjects![kind];\n }\n\n delete mesh._userInstancedBuffersStorage.data[kind];\n delete mesh._userInstancedBuffersStorage.vertexBuffers[kind];\n delete mesh._userInstancedBuffersStorage.strides[kind];\n delete mesh._userInstancedBuffersStorage.sizes[kind];\n\n if (Object.keys(mesh._userInstancedBuffersStorage.vertexBuffers).length === 0) {\n mesh._userInstancedBuffersStorage = undefined!;\n }\n }\n if (mesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] !== undefined) {\n delete mesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName];\n }\n\n // In WebGPU non-compat mode, cached render bundles (fastBundle) bake\n // vertex-buffer GPU handles at record time. Because the new VBO has\n // the same format (and thus the same hashCode), the pipeline cache\n // won't detect the change and would replay the stale bundle.\n // Resetting the draw cache forces new bundles to be recorded.\n if (this._engine.isWebGPU && !this._engine.compatibilityMode) {\n mesh.resetDrawCache();\n }\n }\n\n /**\n * Adds mesh or group of mesh to the current selection\n *\n * If a group of meshes is provided, they will outline as a single unit\n * @param meshOrGroup Meshes to add to the selection\n */\n public addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void {\n if (!this._selection) {\n return;\n }\n\n const nextId = this._nextSelectionId;\n\n const group = Array.isArray(meshOrGroup) ? meshOrGroup : [meshOrGroup];\n if (group.length === 0) {\n return;\n }\n\n for (let meshIndex = 0; meshIndex < group.length; ++meshIndex) {\n const mesh = group[meshIndex];\n\n this._selection.push(mesh); // add to render list\n\n if (mesh.hasInstances || mesh.isAnInstance) {\n const sourceMesh = (mesh as InstancedMesh).sourceMesh ?? (mesh as Mesh);\n\n if (sourceMesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] === undefined) {\n sourceMesh.registerInstancedBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, 1);\n }\n this._instancedBufferSources.add(sourceMesh);\n\n mesh.instancedBuffers[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] = nextId;\n\n // Also register instanceSelectionId on LOD meshes so hardware instancing\n // works during LOD transitions (LOD meshes replace the source mesh as the\n // renderingMesh, and _processInstancedBuffers only processes kinds that\n // are registered on the rendering mesh).\n const lodLevels = sourceMesh.getLODLevels();\n for (const level of lodLevels) {\n if (level.mesh) {\n if (level.mesh.instancedBuffers?.[ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName] === undefined) {\n level.mesh.registerInstancedBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, 1);\n }\n this._instancedBufferSources.add(level.mesh);\n }\n }\n } else if (mesh.hasThinInstances) {\n const thinInstanceCount = (mesh as Mesh).thinInstanceCount;\n const selectionIdData = new Float32Array(thinInstanceCount);\n for (let i = 0; i < thinInstanceCount; i++) {\n selectionIdData[i] = nextId;\n }\n (mesh as Mesh).thinInstanceSetBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, selectionIdData, 1);\n } else {\n this._meshUniqueIdToSelectionId[mesh.uniqueId] = nextId;\n }\n }\n this._nextSelectionId += 1;\n\n this._shouldRender = true;\n }\n\n /**\n * Free any resources and references associated to a mesh.\n * Internal use\n * @param mesh The mesh to free.\n * @internal\n */\n public _disposeMesh(mesh: Mesh): void {\n const selection = this._selection;\n if (!selection) {\n return;\n }\n\n const index = selection.indexOf(mesh);\n if (index !== -1) {\n selection.splice(index, 1);\n\n if (mesh.hasInstances) {\n mesh.removeVerticesData(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName);\n } else if (mesh.hasThinInstances) {\n (mesh as Mesh).thinInstanceSetBuffer(ThinSelectionOutlineLayer.InstanceSelectionIdAttributeName, null);\n }\n\n if (mesh.isAnInstance) {\n const sourceMesh = (mesh as unknown as InstancedMesh).sourceMesh;\n // Only remove the source from tracking if no other selected\n // instance shares it, to avoid leaking its GPU resources.\n if (sourceMesh && !selection.some((m) => m !== mesh && m.isAnInstance && (m as unknown as InstancedMesh).sourceMesh === sourceMesh)) {\n this._instancedBufferSources.delete(sourceMesh);\n }\n }\n\n if (selection.length === 0) {\n this._shouldRender = false;\n }\n }\n }\n\n /**\n * Dispose the effect layer and free resources.\n */\n public override dispose(): void {\n this.clearSelection();\n this._selection = null;\n\n super.dispose();\n }\n}\n"]}
@@ -17,6 +17,8 @@ import "../../Shaders/gaussianSplattingDepth.fragment.js";
17
17
  import "../../Shaders/gaussianSplattingDepth.vertex.js";
18
18
  import "../../ShadersWGSL/gaussianSplattingDepth.fragment.js";
19
19
  import "../../ShadersWGSL/gaussianSplattingDepth.vertex.js";
20
+ import "../../Shaders/gaussianSplattingVoxel.fragment.js";
21
+ import "../../Shaders/gaussianSplattingVoxel.vertex.js";
20
22
  import { ShaderLanguage } from "../shaderLanguage.js";
21
23
  /**
22
24
  * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.
@@ -79,6 +81,8 @@ export declare class GaussianSplattingMaterial extends PushMaterial {
79
81
  protected static _Attribs: string[];
80
82
  protected static _Samplers: string[];
81
83
  protected static _UniformBuffers: string[];
84
+ protected static _VoxelUniforms: string[];
85
+ protected static _VoxelSamplers: string[];
82
86
  protected static _Uniforms: string[];
83
87
  private _sourceMesh;
84
88
  /**
@@ -113,6 +117,20 @@ export declare class GaussianSplattingMaterial extends PushMaterial {
113
117
  */
114
118
  bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
115
119
  protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void;
120
+ private _voxelMissingTextureWarned;
121
+ protected _bindVoxelEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial): boolean;
122
+ /**
123
+ * Create a voxel rendering material for a Gaussian Splatting mesh, for use with IBL shadow voxelization.
124
+ * The returned ShaderMaterial's onBindObservable binds the GS mesh-side uniforms (textures, alpha, dataTextureSize, part data).
125
+ * The caller (e.g. iblShadowsVoxelRenderer) is responsible for setting the per-slab uniforms on the returned material:
126
+ * viewMatrix, invWorldScale, nearPlane, farPlane, stepSize.
127
+ * @param scene scene it belongs to
128
+ * @param shaderLanguage GLSL or WGSL
129
+ * @param maxDrawBuffers number of draw buffers (MRT outputs) per voxelization slab
130
+ * @param compoundMesh whether the mesh is a compound mesh
131
+ * @returns voxel rendering shader material
132
+ */
133
+ makeVoxelRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, maxDrawBuffers: number, compoundMesh?: boolean): ShaderMaterial;
116
134
  /**
117
135
  * Create a depth rendering material for a Gaussian Splatting mesh
118
136
  * @param scene scene it belongs to