@haiyue/extensions 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/animation/Animation2DComponent.d.ts +18 -0
- package/dist/animation/Animation2DExtensionRegistry.d.ts +7 -0
- package/dist/animation/Animation2DRenderSystem.d.ts +6 -0
- package/dist/animation/Animation2DRuntime.d.ts +6 -2
- package/dist/animation/AnimationTextRasterizer.d.ts +4 -0
- package/dist/animation/AnimationVisual2D.d.ts +58 -2
- package/dist/animation/interaction/InteractionRuntime.d.ts +83 -0
- package/dist/animation/interaction/runtime-types.d.ts +257 -0
- package/dist/animation.d.ts +3 -1
- package/dist/animation.js +551 -59
- package/dist/animation3d.js +1 -1
- package/dist/canvas-text.js +1 -1
- package/dist/chunks/2d-ui-animation-2d.generated-FpziAeGJ.js +4 -0
- package/dist/chunks/2d-ui-indexed-sprite.generated-DmKR0CC3.js +4 -0
- package/dist/chunks/Animation2DStateMachine-BHcA6Cu3.js +18212 -0
- package/dist/chunks/{AnimationStateMachineController-BIcAh-sT.js → AnimationStateMachineController-4sKaqh9E.js} +2 -2
- package/dist/chunks/AnimationVisual2D-8y3qp0_U.js +230 -0
- package/dist/chunks/{RenderSystem2DBase-DDT61dAu.js → RenderSystem2DBase-CF2s00vg.js} +2 -2
- package/dist/controls/VirtualJoystickControls.d.ts +46 -0
- package/dist/controls/contracts.d.ts +91 -0
- package/dist/controls.d.ts +2 -0
- package/dist/controls.js +358 -0
- package/dist/deformable-animation/runtime/DeformableMesh2DRuntimeExtension.d.ts +11 -0
- package/dist/deformable-animation/runtime/DeformableMesh2DSampler.d.ts +11 -0
- package/dist/deformable-animation.d.ts +5 -0
- package/dist/deformable-animation.js +316 -0
- package/dist/experimental-indexed-sprite.d.ts +5 -0
- package/dist/experimental-indexed-sprite.js +482 -0
- package/dist/gltf-worker-runtime.js +9 -9
- package/dist/hya-state-machine.js +3 -2
- package/dist/index.js +1 -1
- package/dist/indexed-sprite/AtlasLayout.d.ts +2 -0
- package/dist/indexed-sprite/IndexedSpriteRenderer.d.ts +23 -0
- package/dist/indexed-sprite/contracts.d.ts +89 -0
- package/dist/internal/2d-ui-shader-artifact.js +232 -23
- package/dist/ray-tracing/acceleration/bvh.d.ts +37 -0
- package/dist/ray-tracing/acceleration/index.d.ts +6 -0
- package/dist/ray-tracing/acceleration/pack.d.ts +152 -0
- package/dist/ray-tracing/acceleration/query.d.ts +4 -0
- package/dist/ray-tracing/acceleration/runtime.d.ts +30 -0
- package/dist/ray-tracing/acceleration/tlas.d.ts +4 -0
- package/dist/ray-tracing/acceleration/types.d.ts +165 -0
- package/dist/ray-tracing/denoise/index.d.ts +3 -0
- package/dist/ray-tracing/denoise/layout.d.ts +9 -0
- package/dist/ray-tracing/denoise/runtime.d.ts +23 -0
- package/dist/ray-tracing/denoise/types.d.ts +28 -0
- package/dist/ray-tracing/hybrid/contract.d.ts +2 -0
- package/dist/ray-tracing/hybrid/index.d.ts +5 -0
- package/dist/ray-tracing/hybrid/layout.d.ts +17 -0
- package/dist/ray-tracing/hybrid/plan.d.ts +2 -0
- package/dist/ray-tracing/hybrid/runtime.d.ts +31 -0
- package/dist/ray-tracing/hybrid/shaders/hybrid-artifact.generated.d.ts +625 -0
- package/dist/ray-tracing/hybrid/types.d.ts +144 -0
- package/dist/ray-tracing/lifecycle/device-recovery.d.ts +31 -0
- package/dist/ray-tracing/lifecycle/index.d.ts +2 -0
- package/dist/ray-tracing/lifecycle/types.d.ts +37 -0
- package/dist/ray-tracing/material/index.d.ts +2 -0
- package/dist/ray-tracing/material/pack.d.ts +5 -0
- package/dist/ray-tracing/material/types.d.ts +63 -0
- package/dist/ray-tracing/reference/index.d.ts +122 -0
- package/dist/ray-tracing/renderer/index.d.ts +7 -0
- package/dist/ray-tracing/renderer/layout.d.ts +20 -0
- package/dist/ray-tracing/renderer/plan.d.ts +2 -0
- package/dist/ray-tracing/renderer/reference.d.ts +17 -0
- package/dist/ray-tracing/renderer/runtime.d.ts +39 -0
- package/dist/ray-tracing/renderer/scene.d.ts +4 -0
- package/dist/ray-tracing/renderer/types.d.ts +115 -0
- package/dist/ray-tracing/sampling/index.d.ts +8 -0
- package/dist/ray-tracing/sampling/layout.d.ts +12 -0
- package/dist/ray-tracing/sampling/plan.d.ts +5 -0
- package/dist/ray-tracing/sampling/revision.d.ts +15 -0
- package/dist/ray-tracing/sampling/runtime.d.ts +44 -0
- package/dist/ray-tracing/sampling/sequence.d.ts +2 -0
- package/dist/ray-tracing/sampling/types.d.ts +96 -0
- package/dist/ray-tracing/scene/index.d.ts +41 -0
- package/dist/ray-tracing/traversal/index.d.ts +4 -0
- package/dist/ray-tracing/traversal/layout.d.ts +16 -0
- package/dist/ray-tracing/traversal/plan.d.ts +2 -0
- package/dist/ray-tracing/traversal/runtime.d.ts +25 -0
- package/dist/ray-tracing/traversal/types.d.ts +79 -0
- package/dist/ray-tracing/worker/client.d.ts +25 -0
- package/dist/ray-tracing/worker/index.d.ts +5 -0
- package/dist/ray-tracing/worker/runtime.d.ts +11 -0
- package/dist/ray-tracing/worker/serialization.d.ts +16 -0
- package/dist/ray-tracing/worker/source.d.ts +1 -0
- package/dist/ray-tracing/worker/types.d.ts +91 -0
- package/dist/ray-tracing.d.ts +17 -0
- package/dist/ray-tracing.js +7666 -0
- package/dist/spine.js +1 -1
- package/dist/tilemap.js +1 -1
- package/package.json +26 -23
- package/dist/animation/Animation2DStateMachineVisualRuntime.d.ts +0 -27
- package/dist/animation/Particle2DDescriptorAdapter.d.ts +0 -5
- package/dist/animation3d/Animation3DResource.d.ts +0 -28
- package/dist/animation3d/hya/HyaAnimation3DStateMachineRuntime.d.ts +0 -65
- package/dist/animation3d/hya/index.d.ts +0 -4
- package/dist/animation3d/runtime/integration/Animation3DStateMachineMixerAdapter.d.ts +0 -81
- package/dist/animation3d/runtime/integration/Animation3DStateMachineMixerIntegration.d.ts +0 -39
- package/dist/animation3d/runtime/integration/index.d.ts +0 -2
- package/dist/animation3d/runtime/mixer/Action.d.ts +0 -150
- package/dist/animation3d/runtime/mixer/Animation3DMixerRuntimeStore.d.ts +0 -6
- package/dist/animation3d/runtime/mixer/Mixer.d.ts +0 -59
- package/dist/animation3d/runtime/mixer/PoseBuffer.d.ts +0 -1
- package/dist/animation3d/runtime/mixer/TrackSampler.d.ts +0 -24
- package/dist/animation3d/runtime/mixer/index.d.ts +0 -4
- package/dist/animation3d/runtime/state-machine/Animation3DBlendTreeWeights.d.ts +0 -1
- package/dist/animation3d/runtime/state-machine/Animation3DStateMachineCompiler.d.ts +0 -1
- package/dist/animation3d/runtime/state-machine/Animation3DStateMachineController.d.ts +0 -1
- package/dist/animation3d/runtime/state-machine/Animation3DStateMachineMixerPort.d.ts +0 -1
- package/dist/animation3d/runtime/state-machine/index.d.ts +0 -6
- package/dist/benchmark.d.ts +0 -30
- package/dist/chunks/2d-ui-animation-2d.generated-D4aHzFU2.js +0 -4
- package/dist/chunks/Animation2DStateMachine-9IonguNa.js +0 -3245
- package/dist/gltf/GltfAccessorReader.d.ts +0 -7
- package/dist/gltf/GltfDracoDecoder.d.ts +0 -4
- package/dist/gltf/GltfLoaderErrors.d.ts +0 -4
- package/dist/gltf/GltfMaterialDescriptor.d.ts +0 -23
- package/dist/gltf/GltfMaterialLoader.d.ts +0 -6
- package/dist/gltf-worker-runtime.d.ts +0 -7
- package/dist/plugins/pluginUtils.d.ts +0 -20
- package/dist/plugins.d.ts +0 -6
- package/dist/shaders/generated/2d-ui-artifact.generated.d.ts +0 -658
- package/dist/spine/Spine2DGpuRenderer.d.ts +0 -65
- package/dist/spine/Spine2DRuntime.d.ts +0 -103
- package/dist/spine/SpineAnimationBoneTimelines.d.ts +0 -8
- package/dist/spine/SpineFloatBuilder.d.ts +0 -15
- package/dist/spine/SpinePathConstraintSolver.d.ts +0 -32
- package/dist/spine/SpineSkeletonRuntime.d.ts +0 -185
- package/dist/spine/SpineSlotAnimation.d.ts +0 -17
- package/dist/spine/SpineTimelineRuntime.d.ts +0 -25
- package/dist/spine/SpineVertexBuilder.d.ts +0 -61
- package/dist/tilemap/Tilemap2DRenderer.d.ts +0 -24
- package/dist/utils/arrayAccess.d.ts +0 -4
- package/dist/utils/camera2d.d.ts +0 -12
- package/src/animation/Animation2DComponent.ts +0 -135
- package/src/animation/Animation2DExtensionRegistry.ts +0 -52
- package/src/animation/Animation2DRenderSystem.ts +0 -1026
- package/src/animation/Animation2DRuntime.ts +0 -1326
- package/src/animation/Animation2DStateMachine.ts +0 -39
- package/src/animation/Animation2DStateMachineComponent.ts +0 -228
- package/src/animation/Animation2DStateMachineRuntime.ts +0 -141
- package/src/animation/Animation2DStateMachineSystem.ts +0 -60
- package/src/animation/Animation2DStateMachineVisualRuntime.ts +0 -282
- package/src/animation/Animation2DSystem.ts +0 -72
- package/src/animation/AnimationAssetLoader.ts +0 -84
- package/src/animation/AnimationAudioClip.ts +0 -140
- package/src/animation/AnimationPathTessellator.ts +0 -691
- package/src/animation/AnimationTextRasterizer.ts +0 -340
- package/src/animation/AnimationVisual2D.ts +0 -153
- package/src/animation/HyaAnimation2DClipAdapter.ts +0 -845
- package/src/animation/Particle2DDescriptorAdapter.ts +0 -35
- package/src/animation/runtime/mixer/Action.ts +0 -876
- package/src/animation/runtime/mixer/Mixer.ts +0 -505
- package/src/animation/runtime/mixer/PoseBuffer.ts +0 -105
- package/src/animation/runtime/mixer/Sampler.ts +0 -252
- package/src/animation/runtime/mixer/Types.ts +0 -138
- package/src/animation/runtime/mixer/index.ts +0 -31
- package/src/animation-state-machine/AnimationStateMachine.ts +0 -146
- package/src/animation-state-machine/AnimationStateMachineChannels.ts +0 -116
- package/src/animation-state-machine/runtime/Animation2DStateMachineMixerAdapter.ts +0 -197
- package/src/animation-state-machine/runtime/AnimationStateMachineBlendTreeWeights.ts +0 -503
- package/src/animation-state-machine/runtime/AnimationStateMachineCompiler.ts +0 -763
- package/src/animation-state-machine/runtime/AnimationStateMachineController.ts +0 -987
- package/src/animation-state-machine/runtime/AnimationStateMachineMixerPort.ts +0 -54
- package/src/animation-state-machine/runtime/index.ts +0 -47
- package/src/animation.ts +0 -33
- package/src/animation3d/Animation3DAction.ts +0 -73
- package/src/animation3d/Animation3DBinding.ts +0 -116
- package/src/animation3d/Animation3DClip.ts +0 -22
- package/src/animation3d/Animation3DError.ts +0 -34
- package/src/animation3d/Animation3DMixer.ts +0 -82
- package/src/animation3d/Animation3DPose.ts +0 -100
- package/src/animation3d/Animation3DPoseBuffer.ts +0 -85
- package/src/animation3d/Animation3DResource.ts +0 -49
- package/src/animation3d/Animation3DStateMachine.ts +0 -126
- package/src/animation3d/Animation3DStateMachineRuntime.ts +0 -191
- package/src/animation3d/Animation3DTrack.ts +0 -29
- package/src/animation3d/hya/HyaAnimation3DRuntime.ts +0 -756
- package/src/animation3d/hya/HyaAnimation3DStateMachineRuntime.ts +0 -618
- package/src/animation3d/hya/HyaAnimation3DTypes.ts +0 -168
- package/src/animation3d/hya/index.ts +0 -10
- package/src/animation3d/index.ts +0 -76
- package/src/animation3d/runtime/integration/Animation3DStateMachineMixerAdapter.ts +0 -325
- package/src/animation3d/runtime/integration/Animation3DStateMachineMixerIntegration.ts +0 -158
- package/src/animation3d/runtime/integration/index.ts +0 -9
- package/src/animation3d/runtime/mixer/Action.ts +0 -833
- package/src/animation3d/runtime/mixer/Animation3DMixerRuntimeStore.ts +0 -26
- package/src/animation3d/runtime/mixer/Mixer.ts +0 -562
- package/src/animation3d/runtime/mixer/PoseBuffer.ts +0 -1
- package/src/animation3d/runtime/mixer/TrackSampler.ts +0 -399
- package/src/animation3d/runtime/mixer/index.ts +0 -8
- package/src/animation3d/runtime/state-machine/Animation3DBlendTreeWeights.ts +0 -4
- package/src/animation3d/runtime/state-machine/Animation3DStateMachineCompiler.ts +0 -1
- package/src/animation3d/runtime/state-machine/Animation3DStateMachineController.ts +0 -1
- package/src/animation3d/runtime/state-machine/Animation3DStateMachineMixerPort.ts +0 -1
- package/src/animation3d/runtime/state-machine/index.ts +0 -45
- package/src/animation3d.ts +0 -5
- package/src/benchmark.ts +0 -168
- package/src/canvas-text/CanvasText2DRenderSystem.ts +0 -292
- package/src/canvas-text/CanvasTextComponent.ts +0 -47
- package/src/canvas-text.ts +0 -4
- package/src/experimental-gltf-worker.ts +0 -18
- package/src/experimental-spine-worker.ts +0 -9
- package/src/gltf/GltfAccessorReader.ts +0 -271
- package/src/gltf/GltfAnimation3DAdapter.ts +0 -680
- package/src/gltf/GltfAnimationRuntime.ts +0 -392
- package/src/gltf/GltfAssetWorkerClient.ts +0 -136
- package/src/gltf/GltfCompatibilityReport.ts +0 -214
- package/src/gltf/GltfConservativeBounds.ts +0 -219
- package/src/gltf/GltfDracoDecoder.ts +0 -251
- package/src/gltf/GltfExtensionAdapter.ts +0 -340
- package/src/gltf/GltfLoaderContract.ts +0 -333
- package/src/gltf/GltfLoaderErrors.ts +0 -59
- package/src/gltf/GltfMaterialDescriptor.ts +0 -134
- package/src/gltf/GltfMaterialEncoder.ts +0 -173
- package/src/gltf/GltfMaterialLoader.ts +0 -293
- package/src/gltf/GltfModelComponent.ts +0 -115
- package/src/gltf/GltfModelSystem.ts +0 -208
- package/src/gltf/GltfPlugin.ts +0 -84
- package/src/gltf/GltfSchema.ts +0 -229
- package/src/gltf/GltfUvSemanticPlanner.ts +0 -166
- package/src/gltf/gltfLoader.ts +0 -910
- package/src/gltf-animation3d.ts +0 -10
- package/src/gltf-worker-runtime.ts +0 -10
- package/src/gltf.ts +0 -56
- package/src/grid/Grid2DComponent.ts +0 -69
- package/src/grid.ts +0 -2
- package/src/hya-state-machine.ts +0 -19
- package/src/index.ts +0 -2
- package/src/plugins/pluginUtils.ts +0 -50
- package/src/plugins.ts +0 -6
- package/src/shaders/generated/2d-ui-animation-2d.generated.wgsl +0 -242
- package/src/shaders/generated/2d-ui-artifact.generated.ts +0 -867
- package/src/shaders/generated/2d-ui-canvas-text-2d.generated.wgsl +0 -38
- package/src/shaders/generated/2d-ui-spine2d.generated.wgsl +0 -41
- package/src/shaders/generated/2d-ui-tilemap2d.generated.wgsl +0 -36
- package/src/spine/Spine2DComponent.ts +0 -168
- package/src/spine/Spine2DGpuRenderer.ts +0 -449
- package/src/spine/Spine2DRenderSystem.ts +0 -199
- package/src/spine/Spine2DRuntime.ts +0 -1529
- package/src/spine/SpineAnimationBoneTimelines.ts +0 -30
- package/src/spine/SpineAssetParser.ts +0 -20
- package/src/spine/SpineAssetWorkerClient.ts +0 -112
- package/src/spine/SpineAssetWorkerContract.ts +0 -4
- package/src/spine/SpineAtlasParser.ts +0 -127
- package/src/spine/SpineFloatBuilder.ts +0 -66
- package/src/spine/SpinePathConstraintSolver.ts +0 -582
- package/src/spine/SpinePlugin.ts +0 -76
- package/src/spine/SpineSkeletonRuntime.ts +0 -521
- package/src/spine/SpineSlotAnimation.ts +0 -195
- package/src/spine/SpineTimelineRuntime.ts +0 -453
- package/src/spine/SpineVertexBuilder.ts +0 -686
- package/src/spine.ts +0 -7
- package/src/tilemap/Tilemap2DComponent.ts +0 -232
- package/src/tilemap/Tilemap2DRenderSystem.ts +0 -58
- package/src/tilemap/Tilemap2DRenderer.ts +0 -289
- package/src/tilemap/TilemapPlugin.ts +0 -75
- package/src/tilemap.ts +0 -6
- package/src/tween/Tween2DComponent.ts +0 -83
- package/src/tween/Tween2DSystem.ts +0 -78
- package/src/tween.ts +0 -4
- package/src/types/earcut.d.ts +0 -7
- package/src/types/wgsl.d.ts +0 -4
- package/src/utils/RenderSystem2DBase.ts +0 -164
- package/src/utils/arrayAccess.ts +0 -17
- package/src/utils/camera2d.ts +0 -68
- package/src/utils/render2dGpu.ts +0 -132
- package/test/fixtures/gltf/animation-characterization.gltf +0 -344
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
export declare const RAY_HYBRID_SHADER_ARTIFACT: {
|
|
2
|
+
readonly format: "haiyue-precompiled-shader-artifact";
|
|
3
|
+
readonly version: 2;
|
|
4
|
+
readonly compilerVersion: "shader-language-ray-hybrid-v1";
|
|
5
|
+
readonly source: {
|
|
6
|
+
readonly kind: "module-family";
|
|
7
|
+
readonly path: "extensions/src/ray-tracing/hybrid/shaders/hybrid-family.json";
|
|
8
|
+
readonly sha256: "e74d54db6a8df1edf37232df621c57ef51667ade62ec692dd9ff3d0919f327e3";
|
|
9
|
+
};
|
|
10
|
+
readonly canonicalHash: "dd9ea421965238ddba2ee09d2362deb1231353674c9017c71a982fd68e46417f";
|
|
11
|
+
readonly typedModuleHash: "11dbda82d2183e87bf8d0bfb0078fc2a8f88bc49bf2a9c5fbc538dd8909542a0";
|
|
12
|
+
readonly passes: {
|
|
13
|
+
readonly "ray-hybrid-shadow": {
|
|
14
|
+
readonly id: "ray-hybrid-shadow";
|
|
15
|
+
readonly code: "// G07 hybrid ray effects. Artifact V2 owns the complete bind-group layout.\nconst LEAF_BIT: u32 = 0x80000000u;\nconst INDEX_MASK: u32 = 0x7fffffffu;\nconst MISSING: u32 = 0xffffffffu;\nconst MAX_DISTANCE: f32 = 3.402823466e+38;\n\nstruct Params {\n image: vec4u, scene: vec4u, fullImage: vec4u,\n cameraOrigin: vec4f, lightDirection: vec4f, environment: vec4f,\n effect: vec4f, inverseViewProjection: mat4x4f, viewProjection: mat4x4f,\n}\nstruct Diagnostics {\n rays: atomic<u32>, tlasNodes: atomic<u32>, blasNodes: atomic<u32>, primitives: atomic<u32>,\n hits: atomic<u32>, misses: atomic<u32>, transparentSkips: atomic<u32>, stackOverflows: atomic<u32>, invalidAccesses: atomic<u32>, reserved0: atomic<u32>, reserved1: atomic<u32>, reserved2: atomic<u32>,\n}\nstruct Candidate { hit: u32, t: f32, position: vec3f, normal: vec3f }\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> blasNodes: array<u32>;\n@group(0) @binding(2) var<storage, read> blasTable: array<u32>;\n@group(0) @binding(3) var<storage, read> tlasNodes: array<u32>;\n@group(0) @binding(4) var<storage, read> primitives: array<u32>;\n@group(0) @binding(5) var<storage, read> instances: array<u32>;\n@group(0) @binding(6) var rasterDepth: texture_depth_2d;\n@group(0) @binding(7) var rasterNormal: texture_2d<f32>;\n@group(0) @binding(8) var rasterMaterial: texture_2d<f32>;\n@group(0) @binding(9) var rasterSceneColor: texture_2d<f32>;\n@group(0) @binding(10) var previousEffect: texture_2d<f32>;\n@group(0) @binding(11) var<storage, read_write> diagnostics: Diagnostics;\n@group(0) @binding(12) var effectOutput: texture_storage_2d<rgba16float, write>;\n\nfn instance_f32(index: u32, word: u32) -> f32 { return bitcast<f32>(instances[index * 36u + word]); }\nfn transform_point(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u, 16u, inverse);\n let r = vec4f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z+instance_f32(index,b+12u), instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z+instance_f32(index,b+13u), instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z+instance_f32(index,b+14u), instance_f32(index,b+3u)*value.x+instance_f32(index,b+7u)*value.y+instance_f32(index,b+11u)*value.z+instance_f32(index,b+15u));\n return r.xyz / select(r.w, 1.0, r.w == 0.0);\n}\nfn transform_vector(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u,16u,inverse); return vec3f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z, instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z, instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z);\n}\nfn transform_normal(index: u32, value: vec3f) -> vec3f { return normalize(vec3f(instance_f32(index,16u)*value.x+instance_f32(index,17u)*value.y+instance_f32(index,18u)*value.z, instance_f32(index,20u)*value.x+instance_f32(index,21u)*value.y+instance_f32(index,22u)*value.z, instance_f32(index,24u)*value.x+instance_f32(index,25u)*value.y+instance_f32(index,26u)*value.z)); }\nfn bounds_hit(nodes: ptr<storage,array<u32>,read>, index: u32, o: vec3f, d: vec3f, tmin: f32, tmax: f32) -> bool {\n let b=index*8u; var lo=tmin; var hi=tmax;\n for(var a=0u;a<3u;a++){ let c=d[a]; let mn=bitcast<f32>((*nodes)[b+a]); let mx=bitcast<f32>((*nodes)[b+4u+a]); if(abs(c)<=1e-20){if(o[a]<mn||o[a]>mx){return false;}}else{let inv=1.0/c; let x=(mn-o[a])*inv; let y=(mx-o[a])*inv; lo=max(lo,min(x,y)); hi=min(hi,max(x,y)); if(lo>hi){return false;}} }\n return true;\n}\nfn empty() -> Candidate { return Candidate(0u,MAX_DISTANCE,vec3f(0.0),vec3f(0.0)); }\nfn primitive_hit(pi:u32,ii:u32,o:vec3f,d:vec3f,tmin:f32,tmax:f32)->Candidate{\n let b=pi*16u; let kind=primitives[b+12u];\n if(kind==0u){ let p0=transform_point(ii,vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])),false); let p1=transform_point(ii,vec3f(bitcast<f32>(primitives[b+3u]),bitcast<f32>(primitives[b+4u]),bitcast<f32>(primitives[b+5u])),false); let p2=transform_point(ii,vec3f(bitcast<f32>(primitives[b+6u]),bitcast<f32>(primitives[b+7u]),bitcast<f32>(primitives[b+8u])),false); let e1=p1-p0; let e2=p2-p0; let pv=cross(d,e2); let det=dot(e1,pv); if(abs(det)<=1e-12){return empty();} let inv=1.0/det; let tv=o-p0; let u=dot(tv,pv)*inv; let q=cross(tv,e1); let v=dot(d,q)*inv; let t=dot(e2,q)*inv; if(u<0.0||v<0.0||u+v>1.0||t<tmin||t>tmax){return empty();} return Candidate(1u,t,o+d*t,normalize(cross(e1,e2))); }\n if(kind==1u){ let lo=transform_point(ii,o,true); let ld=transform_vector(ii,d,true); let c=vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])); let r=bitcast<f32>(primitives[b+3u]); let oc=lo-c; let a=dot(ld,ld); let hb=dot(oc,ld); let disc=hb*hb-a*(dot(oc,oc)-r*r); if(disc<0.0||a<=1e-12){return empty();} var t=(-hb-sqrt(disc))/a; if(t<tmin||t>tmax){t=(-hb+sqrt(disc))/a;if(t<tmin||t>tmax){return empty();}} return Candidate(1u,t,o+d*t,transform_normal(ii,normalize(lo+ld*t-c))); }\n return empty();\n}\nfn trace(o:vec3f,d:vec3f,tmin:f32,tmax:f32,anyHit:bool)->Candidate{\n atomicAdd(&diagnostics.rays,1u); if(params.scene.x==MISSING){atomicAdd(&diagnostics.misses,1u);return empty();}\n var ts:array<u32,64>; var tn=1u; ts[0]=params.scene.x; var best=empty();\n loop{if(tn==0u){break;}tn--;let ni=ts[tn];if(ni*8u+7u>=arrayLength(&tlasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.tlasNodes,1u);if(!bounds_hit(&tlasNodes,ni,o,d,tmin,min(tmax,best.t))){continue;}let b=ni*8u;let first=tlasNodes[b+3u];let nodeMeta=tlasNodes[b+7u];if((nodeMeta&LEAF_BIT)==0u){if(tn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}ts[tn]=first;ts[tn+1u]=nodeMeta&INDEX_MASK;tn+=2u;continue;}for(var ii=first;ii<first+(nodeMeta&INDEX_MASK);ii++){if(ii>=params.scene.y||ii*36u+35u>=arrayLength(&instances)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let table=instances[ii*36u+32u];if(table*4u+3u>=arrayLength(&blasTable)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let root=blasTable[table*4u];if(root==MISSING){continue;}let lo=transform_point(ii,o,true);let ld=transform_vector(ii,d,true);var bs:array<u32,64>;var bn=1u;bs[0]=root;loop{if(bn==0u){break;}bn--;let bi=bs[bn];if(bi*8u+7u>=arrayLength(&blasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.blasNodes,1u);if(!bounds_hit(&blasNodes,bi,lo,ld,tmin,min(tmax,best.t))){continue;}let bb=bi*8u;let pf=blasNodes[bb+3u];let bm=blasNodes[bb+7u];if((bm&LEAF_BIT)==0u){if(bn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}bs[bn]=pf;bs[bn+1u]=bm&INDEX_MASK;bn+=2u;continue;}for(var pi=pf;pi<pf+(bm&INDEX_MASK);pi++){if(pi*16u+15u>=arrayLength(&primitives)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.primitives,1u);let h=primitive_hit(pi,ii,o,d,tmin,min(tmax,best.t));if(h.hit!=0u){best=h;if(anyHit){atomicAdd(&diagnostics.hits,1u);return best;}}}}}}\n if(best.hit!=0u){atomicAdd(&diagnostics.hits,1u);}else{atomicAdd(&diagnostics.misses,1u);}return best;\n}\nfn hash(v:u32)->f32{var x=v;x^=x>>16u;x*=0x7feb352du;x^=x>>15u;x*=0x846ca68bu;x^=x>>16u;return f32(x)/4294967296.0;}\nfn raster_coord(p:vec2u)->vec2i{return vec2i(min(params.fullImage.xy-vec2u(1u),vec2u((vec2f(p)+0.5)*vec2f(params.fullImage.xy)/vec2f(params.image.xy))));}\nfn world_position(c:vec2i,depth:f32)->vec3f{let uv=(vec2f(c)+0.5)/vec2f(params.fullImage.xy);let h=params.inverseViewProjection*vec4f(uv*2.0-1.0,depth,1.0);return h.xyz/h.w;}\nfn scene_to_linear(value:vec3f)->vec3f{return select(value,pow(max(value,vec3f(0.0)),vec3f(2.2)),params.fullImage.z==1u);}\nfn run_effect(gid:vec3u,effectId:u32){\n if(any(gid.xy>=params.image.xy)){return;}let p=gid.xy;let c=raster_coord(p);let depth=textureLoad(rasterDepth,c,0);let material=textureLoad(rasterMaterial,c,0);if(depth>=0.999999||material.b<0.999){if(material.b<0.999){atomicAdd(&diagnostics.transparentSkips,1u);}textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let pos=world_position(c,depth);let nraw=textureLoad(rasterNormal,c,0).xyz*2.0-1.0;if(dot(nraw,nraw)<1e-8){textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let n=normalize(nraw);var value=vec4f(1.0);var sum=vec4f(0.0);\n for(var s=0u;s<params.image.z;s++){let seed=(p.y*params.image.x+p.x)*4u+s+params.scene.w*1664525u;if(effectId==0u){let d=normalize(-params.lightDirection.xyz+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*params.effect.w);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}else if(effectId==1u){let incident=normalize(pos-params.cameraOrigin.xyz);let rough=material.g; if(rough>params.effect.w){sum+=vec4f(0.0);continue;}let d=normalize(reflect(incident,n)+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*rough);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,false);var color=params.environment.xyz;if(h.hit!=0u){let clip=params.viewProjection*vec4f(h.position,1.0);let uv=clip.xy/clip.w*0.5+0.5;if(all(uv>=vec2f(0.0))&&all(uv<=vec2f(1.0))){let hc=vec2i(min(params.fullImage.xy-vec2u(1u),vec2u(uv*vec2f(params.fullImage.xy))));color=scene_to_linear(textureLoad(rasterSceneColor,hc,0).rgb);}}let reflectivity=material.a*(1.0-rough/max(params.effect.w,1e-4))*params.effect.z;sum+=vec4f(color*reflectivity,reflectivity);}else{let u=hash(seed);let v=hash(seed+1u);let z=u;let r=sqrt(max(0.0,1.0-z*z));let a=v*6.283185307;let local=vec3f(r*cos(a),r*sin(a),z);let tangent=normalize(select(cross(n,vec3f(0.0,0.0,1.0)),cross(n,vec3f(0.0,1.0,0.0)),abs(n.z)>0.99));let bitangent=cross(n,tangent);let d=normalize(tangent*local.x+bitangent*local.y+n*local.z);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}}\n value=sum/f32(params.image.z);if(params.scene.z==0u){let old=textureLoad(previousEffect,vec2i(p),0);value=mix(value,old,params.environment.w);}textureStore(effectOutput,vec2i(p),value);\n}\n@compute @workgroup_size(8,8,1) fn shadow_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,0u);}\n@compute @workgroup_size(8,8,1) fn reflection_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,1u);}\n@compute @workgroup_size(8,8,1) fn ao_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,2u);}\n";
|
|
16
|
+
readonly entryPoints: {
|
|
17
|
+
readonly compute: "shadow_main";
|
|
18
|
+
};
|
|
19
|
+
readonly bindGroups: readonly [{
|
|
20
|
+
readonly logicalSpace: "pass";
|
|
21
|
+
readonly logicalGroup: 3;
|
|
22
|
+
readonly physicalGroup: 0;
|
|
23
|
+
readonly owner: "artifact";
|
|
24
|
+
readonly bindings: readonly [{
|
|
25
|
+
readonly id: "hybrid.params";
|
|
26
|
+
readonly binding: 0;
|
|
27
|
+
readonly visibility: readonly ["compute"];
|
|
28
|
+
readonly layout: {
|
|
29
|
+
readonly kind: "buffer";
|
|
30
|
+
readonly bufferType: "uniform";
|
|
31
|
+
readonly hasDynamicOffset: false;
|
|
32
|
+
readonly minBindingSize: 256;
|
|
33
|
+
};
|
|
34
|
+
}, {
|
|
35
|
+
readonly id: "hybrid.blasNodes";
|
|
36
|
+
readonly binding: 1;
|
|
37
|
+
readonly visibility: readonly ["compute"];
|
|
38
|
+
readonly layout: {
|
|
39
|
+
readonly kind: "buffer";
|
|
40
|
+
readonly bufferType: "read-only-storage";
|
|
41
|
+
readonly hasDynamicOffset: false;
|
|
42
|
+
readonly minBindingSize: 16;
|
|
43
|
+
};
|
|
44
|
+
}, {
|
|
45
|
+
readonly id: "hybrid.blasTable";
|
|
46
|
+
readonly binding: 2;
|
|
47
|
+
readonly visibility: readonly ["compute"];
|
|
48
|
+
readonly layout: {
|
|
49
|
+
readonly kind: "buffer";
|
|
50
|
+
readonly bufferType: "read-only-storage";
|
|
51
|
+
readonly hasDynamicOffset: false;
|
|
52
|
+
readonly minBindingSize: 16;
|
|
53
|
+
};
|
|
54
|
+
}, {
|
|
55
|
+
readonly id: "hybrid.tlasNodes";
|
|
56
|
+
readonly binding: 3;
|
|
57
|
+
readonly visibility: readonly ["compute"];
|
|
58
|
+
readonly layout: {
|
|
59
|
+
readonly kind: "buffer";
|
|
60
|
+
readonly bufferType: "read-only-storage";
|
|
61
|
+
readonly hasDynamicOffset: false;
|
|
62
|
+
readonly minBindingSize: 16;
|
|
63
|
+
};
|
|
64
|
+
}, {
|
|
65
|
+
readonly id: "hybrid.primitives";
|
|
66
|
+
readonly binding: 4;
|
|
67
|
+
readonly visibility: readonly ["compute"];
|
|
68
|
+
readonly layout: {
|
|
69
|
+
readonly kind: "buffer";
|
|
70
|
+
readonly bufferType: "read-only-storage";
|
|
71
|
+
readonly hasDynamicOffset: false;
|
|
72
|
+
readonly minBindingSize: 16;
|
|
73
|
+
};
|
|
74
|
+
}, {
|
|
75
|
+
readonly id: "hybrid.instances";
|
|
76
|
+
readonly binding: 5;
|
|
77
|
+
readonly visibility: readonly ["compute"];
|
|
78
|
+
readonly layout: {
|
|
79
|
+
readonly kind: "buffer";
|
|
80
|
+
readonly bufferType: "read-only-storage";
|
|
81
|
+
readonly hasDynamicOffset: false;
|
|
82
|
+
readonly minBindingSize: 16;
|
|
83
|
+
};
|
|
84
|
+
}, {
|
|
85
|
+
readonly id: "hybrid.depth";
|
|
86
|
+
readonly binding: 6;
|
|
87
|
+
readonly visibility: readonly ["compute"];
|
|
88
|
+
readonly layout: {
|
|
89
|
+
readonly kind: "texture";
|
|
90
|
+
readonly sampleType: "depth";
|
|
91
|
+
readonly viewDimension: "2d";
|
|
92
|
+
readonly multisampled: false;
|
|
93
|
+
};
|
|
94
|
+
}, {
|
|
95
|
+
readonly id: "hybrid.normal";
|
|
96
|
+
readonly binding: 7;
|
|
97
|
+
readonly visibility: readonly ["compute"];
|
|
98
|
+
readonly layout: {
|
|
99
|
+
readonly kind: "texture";
|
|
100
|
+
readonly sampleType: "unfilterable-float";
|
|
101
|
+
readonly viewDimension: "2d";
|
|
102
|
+
readonly multisampled: false;
|
|
103
|
+
};
|
|
104
|
+
}, {
|
|
105
|
+
readonly id: "hybrid.material";
|
|
106
|
+
readonly binding: 8;
|
|
107
|
+
readonly visibility: readonly ["compute"];
|
|
108
|
+
readonly layout: {
|
|
109
|
+
readonly kind: "texture";
|
|
110
|
+
readonly sampleType: "unfilterable-float";
|
|
111
|
+
readonly viewDimension: "2d";
|
|
112
|
+
readonly multisampled: false;
|
|
113
|
+
};
|
|
114
|
+
}, {
|
|
115
|
+
readonly id: "hybrid.sceneColor";
|
|
116
|
+
readonly binding: 9;
|
|
117
|
+
readonly visibility: readonly ["compute"];
|
|
118
|
+
readonly layout: {
|
|
119
|
+
readonly kind: "texture";
|
|
120
|
+
readonly sampleType: "unfilterable-float";
|
|
121
|
+
readonly viewDimension: "2d";
|
|
122
|
+
readonly multisampled: false;
|
|
123
|
+
};
|
|
124
|
+
}, {
|
|
125
|
+
readonly id: "hybrid.previous";
|
|
126
|
+
readonly binding: 10;
|
|
127
|
+
readonly visibility: readonly ["compute"];
|
|
128
|
+
readonly layout: {
|
|
129
|
+
readonly kind: "texture";
|
|
130
|
+
readonly sampleType: "unfilterable-float";
|
|
131
|
+
readonly viewDimension: "2d";
|
|
132
|
+
readonly multisampled: false;
|
|
133
|
+
};
|
|
134
|
+
}, {
|
|
135
|
+
readonly id: "hybrid.diagnostics";
|
|
136
|
+
readonly binding: 11;
|
|
137
|
+
readonly visibility: readonly ["compute"];
|
|
138
|
+
readonly layout: {
|
|
139
|
+
readonly kind: "buffer";
|
|
140
|
+
readonly bufferType: "storage";
|
|
141
|
+
readonly hasDynamicOffset: false;
|
|
142
|
+
readonly minBindingSize: 48;
|
|
143
|
+
};
|
|
144
|
+
}, {
|
|
145
|
+
readonly id: "hybrid.output";
|
|
146
|
+
readonly binding: 12;
|
|
147
|
+
readonly visibility: readonly ["compute"];
|
|
148
|
+
readonly layout: {
|
|
149
|
+
readonly kind: "storage-texture";
|
|
150
|
+
readonly access: "write-only";
|
|
151
|
+
readonly format: "rgba16float";
|
|
152
|
+
readonly viewDimension: "2d";
|
|
153
|
+
};
|
|
154
|
+
}];
|
|
155
|
+
}];
|
|
156
|
+
readonly uniformBlocks: readonly [{
|
|
157
|
+
readonly id: "hybrid.params";
|
|
158
|
+
readonly alignment: 16;
|
|
159
|
+
readonly byteSize: 256;
|
|
160
|
+
readonly fields: readonly [{
|
|
161
|
+
readonly name: "raw";
|
|
162
|
+
readonly type: "array<u32,64>";
|
|
163
|
+
readonly offset: 0;
|
|
164
|
+
readonly size: 256;
|
|
165
|
+
readonly arrayStride: 4;
|
|
166
|
+
}];
|
|
167
|
+
}];
|
|
168
|
+
readonly vertexBuffers: readonly [];
|
|
169
|
+
readonly varyings: readonly [];
|
|
170
|
+
readonly renderTargets: readonly [];
|
|
171
|
+
readonly capabilities: readonly ["compute", "sampled-texture", "storage-texture"];
|
|
172
|
+
readonly passRequirements: readonly ["webgpu", "maxBindingsPerBindGroup>=13", "maxStorageBuffersPerShaderStage>=6"];
|
|
173
|
+
readonly sourceMap: readonly [{
|
|
174
|
+
readonly sourceId: "ray-hybrid-shadow";
|
|
175
|
+
readonly sourceName: "extensions/src/ray-tracing/hybrid/shaders/hybrid-effects.wgsl";
|
|
176
|
+
readonly generatedStartLine: 1;
|
|
177
|
+
readonly generatedEndLine: 72;
|
|
178
|
+
readonly sourceStartLine: 1;
|
|
179
|
+
readonly sourceStartColumn: 1;
|
|
180
|
+
}];
|
|
181
|
+
readonly canonicalHash: "9bb833dd1f91164bbd53898fb14134015a20e98a2a1119e28c67ef3c68b2700d";
|
|
182
|
+
};
|
|
183
|
+
readonly "ray-hybrid-reflection": {
|
|
184
|
+
readonly id: "ray-hybrid-reflection";
|
|
185
|
+
readonly code: "// G07 hybrid ray effects. Artifact V2 owns the complete bind-group layout.\nconst LEAF_BIT: u32 = 0x80000000u;\nconst INDEX_MASK: u32 = 0x7fffffffu;\nconst MISSING: u32 = 0xffffffffu;\nconst MAX_DISTANCE: f32 = 3.402823466e+38;\n\nstruct Params {\n image: vec4u, scene: vec4u, fullImage: vec4u,\n cameraOrigin: vec4f, lightDirection: vec4f, environment: vec4f,\n effect: vec4f, inverseViewProjection: mat4x4f, viewProjection: mat4x4f,\n}\nstruct Diagnostics {\n rays: atomic<u32>, tlasNodes: atomic<u32>, blasNodes: atomic<u32>, primitives: atomic<u32>,\n hits: atomic<u32>, misses: atomic<u32>, transparentSkips: atomic<u32>, stackOverflows: atomic<u32>, invalidAccesses: atomic<u32>, reserved0: atomic<u32>, reserved1: atomic<u32>, reserved2: atomic<u32>,\n}\nstruct Candidate { hit: u32, t: f32, position: vec3f, normal: vec3f }\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> blasNodes: array<u32>;\n@group(0) @binding(2) var<storage, read> blasTable: array<u32>;\n@group(0) @binding(3) var<storage, read> tlasNodes: array<u32>;\n@group(0) @binding(4) var<storage, read> primitives: array<u32>;\n@group(0) @binding(5) var<storage, read> instances: array<u32>;\n@group(0) @binding(6) var rasterDepth: texture_depth_2d;\n@group(0) @binding(7) var rasterNormal: texture_2d<f32>;\n@group(0) @binding(8) var rasterMaterial: texture_2d<f32>;\n@group(0) @binding(9) var rasterSceneColor: texture_2d<f32>;\n@group(0) @binding(10) var previousEffect: texture_2d<f32>;\n@group(0) @binding(11) var<storage, read_write> diagnostics: Diagnostics;\n@group(0) @binding(12) var effectOutput: texture_storage_2d<rgba16float, write>;\n\nfn instance_f32(index: u32, word: u32) -> f32 { return bitcast<f32>(instances[index * 36u + word]); }\nfn transform_point(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u, 16u, inverse);\n let r = vec4f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z+instance_f32(index,b+12u), instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z+instance_f32(index,b+13u), instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z+instance_f32(index,b+14u), instance_f32(index,b+3u)*value.x+instance_f32(index,b+7u)*value.y+instance_f32(index,b+11u)*value.z+instance_f32(index,b+15u));\n return r.xyz / select(r.w, 1.0, r.w == 0.0);\n}\nfn transform_vector(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u,16u,inverse); return vec3f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z, instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z, instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z);\n}\nfn transform_normal(index: u32, value: vec3f) -> vec3f { return normalize(vec3f(instance_f32(index,16u)*value.x+instance_f32(index,17u)*value.y+instance_f32(index,18u)*value.z, instance_f32(index,20u)*value.x+instance_f32(index,21u)*value.y+instance_f32(index,22u)*value.z, instance_f32(index,24u)*value.x+instance_f32(index,25u)*value.y+instance_f32(index,26u)*value.z)); }\nfn bounds_hit(nodes: ptr<storage,array<u32>,read>, index: u32, o: vec3f, d: vec3f, tmin: f32, tmax: f32) -> bool {\n let b=index*8u; var lo=tmin; var hi=tmax;\n for(var a=0u;a<3u;a++){ let c=d[a]; let mn=bitcast<f32>((*nodes)[b+a]); let mx=bitcast<f32>((*nodes)[b+4u+a]); if(abs(c)<=1e-20){if(o[a]<mn||o[a]>mx){return false;}}else{let inv=1.0/c; let x=(mn-o[a])*inv; let y=(mx-o[a])*inv; lo=max(lo,min(x,y)); hi=min(hi,max(x,y)); if(lo>hi){return false;}} }\n return true;\n}\nfn empty() -> Candidate { return Candidate(0u,MAX_DISTANCE,vec3f(0.0),vec3f(0.0)); }\nfn primitive_hit(pi:u32,ii:u32,o:vec3f,d:vec3f,tmin:f32,tmax:f32)->Candidate{\n let b=pi*16u; let kind=primitives[b+12u];\n if(kind==0u){ let p0=transform_point(ii,vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])),false); let p1=transform_point(ii,vec3f(bitcast<f32>(primitives[b+3u]),bitcast<f32>(primitives[b+4u]),bitcast<f32>(primitives[b+5u])),false); let p2=transform_point(ii,vec3f(bitcast<f32>(primitives[b+6u]),bitcast<f32>(primitives[b+7u]),bitcast<f32>(primitives[b+8u])),false); let e1=p1-p0; let e2=p2-p0; let pv=cross(d,e2); let det=dot(e1,pv); if(abs(det)<=1e-12){return empty();} let inv=1.0/det; let tv=o-p0; let u=dot(tv,pv)*inv; let q=cross(tv,e1); let v=dot(d,q)*inv; let t=dot(e2,q)*inv; if(u<0.0||v<0.0||u+v>1.0||t<tmin||t>tmax){return empty();} return Candidate(1u,t,o+d*t,normalize(cross(e1,e2))); }\n if(kind==1u){ let lo=transform_point(ii,o,true); let ld=transform_vector(ii,d,true); let c=vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])); let r=bitcast<f32>(primitives[b+3u]); let oc=lo-c; let a=dot(ld,ld); let hb=dot(oc,ld); let disc=hb*hb-a*(dot(oc,oc)-r*r); if(disc<0.0||a<=1e-12){return empty();} var t=(-hb-sqrt(disc))/a; if(t<tmin||t>tmax){t=(-hb+sqrt(disc))/a;if(t<tmin||t>tmax){return empty();}} return Candidate(1u,t,o+d*t,transform_normal(ii,normalize(lo+ld*t-c))); }\n return empty();\n}\nfn trace(o:vec3f,d:vec3f,tmin:f32,tmax:f32,anyHit:bool)->Candidate{\n atomicAdd(&diagnostics.rays,1u); if(params.scene.x==MISSING){atomicAdd(&diagnostics.misses,1u);return empty();}\n var ts:array<u32,64>; var tn=1u; ts[0]=params.scene.x; var best=empty();\n loop{if(tn==0u){break;}tn--;let ni=ts[tn];if(ni*8u+7u>=arrayLength(&tlasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.tlasNodes,1u);if(!bounds_hit(&tlasNodes,ni,o,d,tmin,min(tmax,best.t))){continue;}let b=ni*8u;let first=tlasNodes[b+3u];let nodeMeta=tlasNodes[b+7u];if((nodeMeta&LEAF_BIT)==0u){if(tn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}ts[tn]=first;ts[tn+1u]=nodeMeta&INDEX_MASK;tn+=2u;continue;}for(var ii=first;ii<first+(nodeMeta&INDEX_MASK);ii++){if(ii>=params.scene.y||ii*36u+35u>=arrayLength(&instances)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let table=instances[ii*36u+32u];if(table*4u+3u>=arrayLength(&blasTable)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let root=blasTable[table*4u];if(root==MISSING){continue;}let lo=transform_point(ii,o,true);let ld=transform_vector(ii,d,true);var bs:array<u32,64>;var bn=1u;bs[0]=root;loop{if(bn==0u){break;}bn--;let bi=bs[bn];if(bi*8u+7u>=arrayLength(&blasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.blasNodes,1u);if(!bounds_hit(&blasNodes,bi,lo,ld,tmin,min(tmax,best.t))){continue;}let bb=bi*8u;let pf=blasNodes[bb+3u];let bm=blasNodes[bb+7u];if((bm&LEAF_BIT)==0u){if(bn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}bs[bn]=pf;bs[bn+1u]=bm&INDEX_MASK;bn+=2u;continue;}for(var pi=pf;pi<pf+(bm&INDEX_MASK);pi++){if(pi*16u+15u>=arrayLength(&primitives)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.primitives,1u);let h=primitive_hit(pi,ii,o,d,tmin,min(tmax,best.t));if(h.hit!=0u){best=h;if(anyHit){atomicAdd(&diagnostics.hits,1u);return best;}}}}}}\n if(best.hit!=0u){atomicAdd(&diagnostics.hits,1u);}else{atomicAdd(&diagnostics.misses,1u);}return best;\n}\nfn hash(v:u32)->f32{var x=v;x^=x>>16u;x*=0x7feb352du;x^=x>>15u;x*=0x846ca68bu;x^=x>>16u;return f32(x)/4294967296.0;}\nfn raster_coord(p:vec2u)->vec2i{return vec2i(min(params.fullImage.xy-vec2u(1u),vec2u((vec2f(p)+0.5)*vec2f(params.fullImage.xy)/vec2f(params.image.xy))));}\nfn world_position(c:vec2i,depth:f32)->vec3f{let uv=(vec2f(c)+0.5)/vec2f(params.fullImage.xy);let h=params.inverseViewProjection*vec4f(uv*2.0-1.0,depth,1.0);return h.xyz/h.w;}\nfn scene_to_linear(value:vec3f)->vec3f{return select(value,pow(max(value,vec3f(0.0)),vec3f(2.2)),params.fullImage.z==1u);}\nfn run_effect(gid:vec3u,effectId:u32){\n if(any(gid.xy>=params.image.xy)){return;}let p=gid.xy;let c=raster_coord(p);let depth=textureLoad(rasterDepth,c,0);let material=textureLoad(rasterMaterial,c,0);if(depth>=0.999999||material.b<0.999){if(material.b<0.999){atomicAdd(&diagnostics.transparentSkips,1u);}textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let pos=world_position(c,depth);let nraw=textureLoad(rasterNormal,c,0).xyz*2.0-1.0;if(dot(nraw,nraw)<1e-8){textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let n=normalize(nraw);var value=vec4f(1.0);var sum=vec4f(0.0);\n for(var s=0u;s<params.image.z;s++){let seed=(p.y*params.image.x+p.x)*4u+s+params.scene.w*1664525u;if(effectId==0u){let d=normalize(-params.lightDirection.xyz+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*params.effect.w);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}else if(effectId==1u){let incident=normalize(pos-params.cameraOrigin.xyz);let rough=material.g; if(rough>params.effect.w){sum+=vec4f(0.0);continue;}let d=normalize(reflect(incident,n)+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*rough);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,false);var color=params.environment.xyz;if(h.hit!=0u){let clip=params.viewProjection*vec4f(h.position,1.0);let uv=clip.xy/clip.w*0.5+0.5;if(all(uv>=vec2f(0.0))&&all(uv<=vec2f(1.0))){let hc=vec2i(min(params.fullImage.xy-vec2u(1u),vec2u(uv*vec2f(params.fullImage.xy))));color=scene_to_linear(textureLoad(rasterSceneColor,hc,0).rgb);}}let reflectivity=material.a*(1.0-rough/max(params.effect.w,1e-4))*params.effect.z;sum+=vec4f(color*reflectivity,reflectivity);}else{let u=hash(seed);let v=hash(seed+1u);let z=u;let r=sqrt(max(0.0,1.0-z*z));let a=v*6.283185307;let local=vec3f(r*cos(a),r*sin(a),z);let tangent=normalize(select(cross(n,vec3f(0.0,0.0,1.0)),cross(n,vec3f(0.0,1.0,0.0)),abs(n.z)>0.99));let bitangent=cross(n,tangent);let d=normalize(tangent*local.x+bitangent*local.y+n*local.z);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}}\n value=sum/f32(params.image.z);if(params.scene.z==0u){let old=textureLoad(previousEffect,vec2i(p),0);value=mix(value,old,params.environment.w);}textureStore(effectOutput,vec2i(p),value);\n}\n@compute @workgroup_size(8,8,1) fn shadow_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,0u);}\n@compute @workgroup_size(8,8,1) fn reflection_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,1u);}\n@compute @workgroup_size(8,8,1) fn ao_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,2u);}\n";
|
|
186
|
+
readonly entryPoints: {
|
|
187
|
+
readonly compute: "reflection_main";
|
|
188
|
+
};
|
|
189
|
+
readonly bindGroups: readonly [{
|
|
190
|
+
readonly logicalSpace: "pass";
|
|
191
|
+
readonly logicalGroup: 3;
|
|
192
|
+
readonly physicalGroup: 0;
|
|
193
|
+
readonly owner: "artifact";
|
|
194
|
+
readonly bindings: readonly [{
|
|
195
|
+
readonly id: "hybrid.params";
|
|
196
|
+
readonly binding: 0;
|
|
197
|
+
readonly visibility: readonly ["compute"];
|
|
198
|
+
readonly layout: {
|
|
199
|
+
readonly kind: "buffer";
|
|
200
|
+
readonly bufferType: "uniform";
|
|
201
|
+
readonly hasDynamicOffset: false;
|
|
202
|
+
readonly minBindingSize: 256;
|
|
203
|
+
};
|
|
204
|
+
}, {
|
|
205
|
+
readonly id: "hybrid.blasNodes";
|
|
206
|
+
readonly binding: 1;
|
|
207
|
+
readonly visibility: readonly ["compute"];
|
|
208
|
+
readonly layout: {
|
|
209
|
+
readonly kind: "buffer";
|
|
210
|
+
readonly bufferType: "read-only-storage";
|
|
211
|
+
readonly hasDynamicOffset: false;
|
|
212
|
+
readonly minBindingSize: 16;
|
|
213
|
+
};
|
|
214
|
+
}, {
|
|
215
|
+
readonly id: "hybrid.blasTable";
|
|
216
|
+
readonly binding: 2;
|
|
217
|
+
readonly visibility: readonly ["compute"];
|
|
218
|
+
readonly layout: {
|
|
219
|
+
readonly kind: "buffer";
|
|
220
|
+
readonly bufferType: "read-only-storage";
|
|
221
|
+
readonly hasDynamicOffset: false;
|
|
222
|
+
readonly minBindingSize: 16;
|
|
223
|
+
};
|
|
224
|
+
}, {
|
|
225
|
+
readonly id: "hybrid.tlasNodes";
|
|
226
|
+
readonly binding: 3;
|
|
227
|
+
readonly visibility: readonly ["compute"];
|
|
228
|
+
readonly layout: {
|
|
229
|
+
readonly kind: "buffer";
|
|
230
|
+
readonly bufferType: "read-only-storage";
|
|
231
|
+
readonly hasDynamicOffset: false;
|
|
232
|
+
readonly minBindingSize: 16;
|
|
233
|
+
};
|
|
234
|
+
}, {
|
|
235
|
+
readonly id: "hybrid.primitives";
|
|
236
|
+
readonly binding: 4;
|
|
237
|
+
readonly visibility: readonly ["compute"];
|
|
238
|
+
readonly layout: {
|
|
239
|
+
readonly kind: "buffer";
|
|
240
|
+
readonly bufferType: "read-only-storage";
|
|
241
|
+
readonly hasDynamicOffset: false;
|
|
242
|
+
readonly minBindingSize: 16;
|
|
243
|
+
};
|
|
244
|
+
}, {
|
|
245
|
+
readonly id: "hybrid.instances";
|
|
246
|
+
readonly binding: 5;
|
|
247
|
+
readonly visibility: readonly ["compute"];
|
|
248
|
+
readonly layout: {
|
|
249
|
+
readonly kind: "buffer";
|
|
250
|
+
readonly bufferType: "read-only-storage";
|
|
251
|
+
readonly hasDynamicOffset: false;
|
|
252
|
+
readonly minBindingSize: 16;
|
|
253
|
+
};
|
|
254
|
+
}, {
|
|
255
|
+
readonly id: "hybrid.depth";
|
|
256
|
+
readonly binding: 6;
|
|
257
|
+
readonly visibility: readonly ["compute"];
|
|
258
|
+
readonly layout: {
|
|
259
|
+
readonly kind: "texture";
|
|
260
|
+
readonly sampleType: "depth";
|
|
261
|
+
readonly viewDimension: "2d";
|
|
262
|
+
readonly multisampled: false;
|
|
263
|
+
};
|
|
264
|
+
}, {
|
|
265
|
+
readonly id: "hybrid.normal";
|
|
266
|
+
readonly binding: 7;
|
|
267
|
+
readonly visibility: readonly ["compute"];
|
|
268
|
+
readonly layout: {
|
|
269
|
+
readonly kind: "texture";
|
|
270
|
+
readonly sampleType: "unfilterable-float";
|
|
271
|
+
readonly viewDimension: "2d";
|
|
272
|
+
readonly multisampled: false;
|
|
273
|
+
};
|
|
274
|
+
}, {
|
|
275
|
+
readonly id: "hybrid.material";
|
|
276
|
+
readonly binding: 8;
|
|
277
|
+
readonly visibility: readonly ["compute"];
|
|
278
|
+
readonly layout: {
|
|
279
|
+
readonly kind: "texture";
|
|
280
|
+
readonly sampleType: "unfilterable-float";
|
|
281
|
+
readonly viewDimension: "2d";
|
|
282
|
+
readonly multisampled: false;
|
|
283
|
+
};
|
|
284
|
+
}, {
|
|
285
|
+
readonly id: "hybrid.sceneColor";
|
|
286
|
+
readonly binding: 9;
|
|
287
|
+
readonly visibility: readonly ["compute"];
|
|
288
|
+
readonly layout: {
|
|
289
|
+
readonly kind: "texture";
|
|
290
|
+
readonly sampleType: "unfilterable-float";
|
|
291
|
+
readonly viewDimension: "2d";
|
|
292
|
+
readonly multisampled: false;
|
|
293
|
+
};
|
|
294
|
+
}, {
|
|
295
|
+
readonly id: "hybrid.previous";
|
|
296
|
+
readonly binding: 10;
|
|
297
|
+
readonly visibility: readonly ["compute"];
|
|
298
|
+
readonly layout: {
|
|
299
|
+
readonly kind: "texture";
|
|
300
|
+
readonly sampleType: "unfilterable-float";
|
|
301
|
+
readonly viewDimension: "2d";
|
|
302
|
+
readonly multisampled: false;
|
|
303
|
+
};
|
|
304
|
+
}, {
|
|
305
|
+
readonly id: "hybrid.diagnostics";
|
|
306
|
+
readonly binding: 11;
|
|
307
|
+
readonly visibility: readonly ["compute"];
|
|
308
|
+
readonly layout: {
|
|
309
|
+
readonly kind: "buffer";
|
|
310
|
+
readonly bufferType: "storage";
|
|
311
|
+
readonly hasDynamicOffset: false;
|
|
312
|
+
readonly minBindingSize: 48;
|
|
313
|
+
};
|
|
314
|
+
}, {
|
|
315
|
+
readonly id: "hybrid.output";
|
|
316
|
+
readonly binding: 12;
|
|
317
|
+
readonly visibility: readonly ["compute"];
|
|
318
|
+
readonly layout: {
|
|
319
|
+
readonly kind: "storage-texture";
|
|
320
|
+
readonly access: "write-only";
|
|
321
|
+
readonly format: "rgba16float";
|
|
322
|
+
readonly viewDimension: "2d";
|
|
323
|
+
};
|
|
324
|
+
}];
|
|
325
|
+
}];
|
|
326
|
+
readonly uniformBlocks: readonly [{
|
|
327
|
+
readonly id: "hybrid.params";
|
|
328
|
+
readonly alignment: 16;
|
|
329
|
+
readonly byteSize: 256;
|
|
330
|
+
readonly fields: readonly [{
|
|
331
|
+
readonly name: "raw";
|
|
332
|
+
readonly type: "array<u32,64>";
|
|
333
|
+
readonly offset: 0;
|
|
334
|
+
readonly size: 256;
|
|
335
|
+
readonly arrayStride: 4;
|
|
336
|
+
}];
|
|
337
|
+
}];
|
|
338
|
+
readonly vertexBuffers: readonly [];
|
|
339
|
+
readonly varyings: readonly [];
|
|
340
|
+
readonly renderTargets: readonly [];
|
|
341
|
+
readonly capabilities: readonly ["compute", "sampled-texture", "storage-texture"];
|
|
342
|
+
readonly passRequirements: readonly ["webgpu", "maxBindingsPerBindGroup>=13", "maxStorageBuffersPerShaderStage>=6"];
|
|
343
|
+
readonly sourceMap: readonly [{
|
|
344
|
+
readonly sourceId: "ray-hybrid-reflection";
|
|
345
|
+
readonly sourceName: "extensions/src/ray-tracing/hybrid/shaders/hybrid-effects.wgsl";
|
|
346
|
+
readonly generatedStartLine: 1;
|
|
347
|
+
readonly generatedEndLine: 72;
|
|
348
|
+
readonly sourceStartLine: 1;
|
|
349
|
+
readonly sourceStartColumn: 1;
|
|
350
|
+
}];
|
|
351
|
+
readonly canonicalHash: "3e06653cbdc80f10df39a39995e14437173ffff4698b0731a6dcb6cb682cd76d";
|
|
352
|
+
};
|
|
353
|
+
readonly "ray-hybrid-ao": {
|
|
354
|
+
readonly id: "ray-hybrid-ao";
|
|
355
|
+
readonly code: "// G07 hybrid ray effects. Artifact V2 owns the complete bind-group layout.\nconst LEAF_BIT: u32 = 0x80000000u;\nconst INDEX_MASK: u32 = 0x7fffffffu;\nconst MISSING: u32 = 0xffffffffu;\nconst MAX_DISTANCE: f32 = 3.402823466e+38;\n\nstruct Params {\n image: vec4u, scene: vec4u, fullImage: vec4u,\n cameraOrigin: vec4f, lightDirection: vec4f, environment: vec4f,\n effect: vec4f, inverseViewProjection: mat4x4f, viewProjection: mat4x4f,\n}\nstruct Diagnostics {\n rays: atomic<u32>, tlasNodes: atomic<u32>, blasNodes: atomic<u32>, primitives: atomic<u32>,\n hits: atomic<u32>, misses: atomic<u32>, transparentSkips: atomic<u32>, stackOverflows: atomic<u32>, invalidAccesses: atomic<u32>, reserved0: atomic<u32>, reserved1: atomic<u32>, reserved2: atomic<u32>,\n}\nstruct Candidate { hit: u32, t: f32, position: vec3f, normal: vec3f }\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> blasNodes: array<u32>;\n@group(0) @binding(2) var<storage, read> blasTable: array<u32>;\n@group(0) @binding(3) var<storage, read> tlasNodes: array<u32>;\n@group(0) @binding(4) var<storage, read> primitives: array<u32>;\n@group(0) @binding(5) var<storage, read> instances: array<u32>;\n@group(0) @binding(6) var rasterDepth: texture_depth_2d;\n@group(0) @binding(7) var rasterNormal: texture_2d<f32>;\n@group(0) @binding(8) var rasterMaterial: texture_2d<f32>;\n@group(0) @binding(9) var rasterSceneColor: texture_2d<f32>;\n@group(0) @binding(10) var previousEffect: texture_2d<f32>;\n@group(0) @binding(11) var<storage, read_write> diagnostics: Diagnostics;\n@group(0) @binding(12) var effectOutput: texture_storage_2d<rgba16float, write>;\n\nfn instance_f32(index: u32, word: u32) -> f32 { return bitcast<f32>(instances[index * 36u + word]); }\nfn transform_point(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u, 16u, inverse);\n let r = vec4f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z+instance_f32(index,b+12u), instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z+instance_f32(index,b+13u), instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z+instance_f32(index,b+14u), instance_f32(index,b+3u)*value.x+instance_f32(index,b+7u)*value.y+instance_f32(index,b+11u)*value.z+instance_f32(index,b+15u));\n return r.xyz / select(r.w, 1.0, r.w == 0.0);\n}\nfn transform_vector(index: u32, value: vec3f, inverse: bool) -> vec3f {\n let b = select(0u,16u,inverse); return vec3f(instance_f32(index,b)*value.x+instance_f32(index,b+4u)*value.y+instance_f32(index,b+8u)*value.z, instance_f32(index,b+1u)*value.x+instance_f32(index,b+5u)*value.y+instance_f32(index,b+9u)*value.z, instance_f32(index,b+2u)*value.x+instance_f32(index,b+6u)*value.y+instance_f32(index,b+10u)*value.z);\n}\nfn transform_normal(index: u32, value: vec3f) -> vec3f { return normalize(vec3f(instance_f32(index,16u)*value.x+instance_f32(index,17u)*value.y+instance_f32(index,18u)*value.z, instance_f32(index,20u)*value.x+instance_f32(index,21u)*value.y+instance_f32(index,22u)*value.z, instance_f32(index,24u)*value.x+instance_f32(index,25u)*value.y+instance_f32(index,26u)*value.z)); }\nfn bounds_hit(nodes: ptr<storage,array<u32>,read>, index: u32, o: vec3f, d: vec3f, tmin: f32, tmax: f32) -> bool {\n let b=index*8u; var lo=tmin; var hi=tmax;\n for(var a=0u;a<3u;a++){ let c=d[a]; let mn=bitcast<f32>((*nodes)[b+a]); let mx=bitcast<f32>((*nodes)[b+4u+a]); if(abs(c)<=1e-20){if(o[a]<mn||o[a]>mx){return false;}}else{let inv=1.0/c; let x=(mn-o[a])*inv; let y=(mx-o[a])*inv; lo=max(lo,min(x,y)); hi=min(hi,max(x,y)); if(lo>hi){return false;}} }\n return true;\n}\nfn empty() -> Candidate { return Candidate(0u,MAX_DISTANCE,vec3f(0.0),vec3f(0.0)); }\nfn primitive_hit(pi:u32,ii:u32,o:vec3f,d:vec3f,tmin:f32,tmax:f32)->Candidate{\n let b=pi*16u; let kind=primitives[b+12u];\n if(kind==0u){ let p0=transform_point(ii,vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])),false); let p1=transform_point(ii,vec3f(bitcast<f32>(primitives[b+3u]),bitcast<f32>(primitives[b+4u]),bitcast<f32>(primitives[b+5u])),false); let p2=transform_point(ii,vec3f(bitcast<f32>(primitives[b+6u]),bitcast<f32>(primitives[b+7u]),bitcast<f32>(primitives[b+8u])),false); let e1=p1-p0; let e2=p2-p0; let pv=cross(d,e2); let det=dot(e1,pv); if(abs(det)<=1e-12){return empty();} let inv=1.0/det; let tv=o-p0; let u=dot(tv,pv)*inv; let q=cross(tv,e1); let v=dot(d,q)*inv; let t=dot(e2,q)*inv; if(u<0.0||v<0.0||u+v>1.0||t<tmin||t>tmax){return empty();} return Candidate(1u,t,o+d*t,normalize(cross(e1,e2))); }\n if(kind==1u){ let lo=transform_point(ii,o,true); let ld=transform_vector(ii,d,true); let c=vec3f(bitcast<f32>(primitives[b]),bitcast<f32>(primitives[b+1u]),bitcast<f32>(primitives[b+2u])); let r=bitcast<f32>(primitives[b+3u]); let oc=lo-c; let a=dot(ld,ld); let hb=dot(oc,ld); let disc=hb*hb-a*(dot(oc,oc)-r*r); if(disc<0.0||a<=1e-12){return empty();} var t=(-hb-sqrt(disc))/a; if(t<tmin||t>tmax){t=(-hb+sqrt(disc))/a;if(t<tmin||t>tmax){return empty();}} return Candidate(1u,t,o+d*t,transform_normal(ii,normalize(lo+ld*t-c))); }\n return empty();\n}\nfn trace(o:vec3f,d:vec3f,tmin:f32,tmax:f32,anyHit:bool)->Candidate{\n atomicAdd(&diagnostics.rays,1u); if(params.scene.x==MISSING){atomicAdd(&diagnostics.misses,1u);return empty();}\n var ts:array<u32,64>; var tn=1u; ts[0]=params.scene.x; var best=empty();\n loop{if(tn==0u){break;}tn--;let ni=ts[tn];if(ni*8u+7u>=arrayLength(&tlasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.tlasNodes,1u);if(!bounds_hit(&tlasNodes,ni,o,d,tmin,min(tmax,best.t))){continue;}let b=ni*8u;let first=tlasNodes[b+3u];let nodeMeta=tlasNodes[b+7u];if((nodeMeta&LEAF_BIT)==0u){if(tn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}ts[tn]=first;ts[tn+1u]=nodeMeta&INDEX_MASK;tn+=2u;continue;}for(var ii=first;ii<first+(nodeMeta&INDEX_MASK);ii++){if(ii>=params.scene.y||ii*36u+35u>=arrayLength(&instances)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let table=instances[ii*36u+32u];if(table*4u+3u>=arrayLength(&blasTable)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}let root=blasTable[table*4u];if(root==MISSING){continue;}let lo=transform_point(ii,o,true);let ld=transform_vector(ii,d,true);var bs:array<u32,64>;var bn=1u;bs[0]=root;loop{if(bn==0u){break;}bn--;let bi=bs[bn];if(bi*8u+7u>=arrayLength(&blasNodes)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.blasNodes,1u);if(!bounds_hit(&blasNodes,bi,lo,ld,tmin,min(tmax,best.t))){continue;}let bb=bi*8u;let pf=blasNodes[bb+3u];let bm=blasNodes[bb+7u];if((bm&LEAF_BIT)==0u){if(bn+2u>64u){atomicAdd(&diagnostics.stackOverflows,1u);return empty();}bs[bn]=pf;bs[bn+1u]=bm&INDEX_MASK;bn+=2u;continue;}for(var pi=pf;pi<pf+(bm&INDEX_MASK);pi++){if(pi*16u+15u>=arrayLength(&primitives)){atomicAdd(&diagnostics.invalidAccesses,1u);return empty();}atomicAdd(&diagnostics.primitives,1u);let h=primitive_hit(pi,ii,o,d,tmin,min(tmax,best.t));if(h.hit!=0u){best=h;if(anyHit){atomicAdd(&diagnostics.hits,1u);return best;}}}}}}\n if(best.hit!=0u){atomicAdd(&diagnostics.hits,1u);}else{atomicAdd(&diagnostics.misses,1u);}return best;\n}\nfn hash(v:u32)->f32{var x=v;x^=x>>16u;x*=0x7feb352du;x^=x>>15u;x*=0x846ca68bu;x^=x>>16u;return f32(x)/4294967296.0;}\nfn raster_coord(p:vec2u)->vec2i{return vec2i(min(params.fullImage.xy-vec2u(1u),vec2u((vec2f(p)+0.5)*vec2f(params.fullImage.xy)/vec2f(params.image.xy))));}\nfn world_position(c:vec2i,depth:f32)->vec3f{let uv=(vec2f(c)+0.5)/vec2f(params.fullImage.xy);let h=params.inverseViewProjection*vec4f(uv*2.0-1.0,depth,1.0);return h.xyz/h.w;}\nfn scene_to_linear(value:vec3f)->vec3f{return select(value,pow(max(value,vec3f(0.0)),vec3f(2.2)),params.fullImage.z==1u);}\nfn run_effect(gid:vec3u,effectId:u32){\n if(any(gid.xy>=params.image.xy)){return;}let p=gid.xy;let c=raster_coord(p);let depth=textureLoad(rasterDepth,c,0);let material=textureLoad(rasterMaterial,c,0);if(depth>=0.999999||material.b<0.999){if(material.b<0.999){atomicAdd(&diagnostics.transparentSkips,1u);}textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let pos=world_position(c,depth);let nraw=textureLoad(rasterNormal,c,0).xyz*2.0-1.0;if(dot(nraw,nraw)<1e-8){textureStore(effectOutput,vec2i(p),select(vec4f(0.0),vec4f(1.0),effectId!=1u));return;}let n=normalize(nraw);var value=vec4f(1.0);var sum=vec4f(0.0);\n for(var s=0u;s<params.image.z;s++){let seed=(p.y*params.image.x+p.x)*4u+s+params.scene.w*1664525u;if(effectId==0u){let d=normalize(-params.lightDirection.xyz+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*params.effect.w);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}else if(effectId==1u){let incident=normalize(pos-params.cameraOrigin.xyz);let rough=material.g; if(rough>params.effect.w){sum+=vec4f(0.0);continue;}let d=normalize(reflect(incident,n)+vec3f(hash(seed)-0.5,hash(seed+1u)-0.5,hash(seed+2u)-0.5)*rough);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,false);var color=params.environment.xyz;if(h.hit!=0u){let clip=params.viewProjection*vec4f(h.position,1.0);let uv=clip.xy/clip.w*0.5+0.5;if(all(uv>=vec2f(0.0))&&all(uv<=vec2f(1.0))){let hc=vec2i(min(params.fullImage.xy-vec2u(1u),vec2u(uv*vec2f(params.fullImage.xy))));color=scene_to_linear(textureLoad(rasterSceneColor,hc,0).rgb);}}let reflectivity=material.a*(1.0-rough/max(params.effect.w,1e-4))*params.effect.z;sum+=vec4f(color*reflectivity,reflectivity);}else{let u=hash(seed);let v=hash(seed+1u);let z=u;let r=sqrt(max(0.0,1.0-z*z));let a=v*6.283185307;let local=vec3f(r*cos(a),r*sin(a),z);let tangent=normalize(select(cross(n,vec3f(0.0,0.0,1.0)),cross(n,vec3f(0.0,1.0,0.0)),abs(n.z)>0.99));let bitangent=cross(n,tangent);let d=normalize(tangent*local.x+bitangent*local.y+n*local.z);let h=trace(pos+n*params.effect.x,d,params.effect.x,params.effect.y,true);sum+=vec4f(1.0-f32(h.hit)*params.effect.z);}}\n value=sum/f32(params.image.z);if(params.scene.z==0u){let old=textureLoad(previousEffect,vec2i(p),0);value=mix(value,old,params.environment.w);}textureStore(effectOutput,vec2i(p),value);\n}\n@compute @workgroup_size(8,8,1) fn shadow_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,0u);}\n@compute @workgroup_size(8,8,1) fn reflection_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,1u);}\n@compute @workgroup_size(8,8,1) fn ao_main(@builtin(global_invocation_id) gid:vec3u){run_effect(gid,2u);}\n";
|
|
356
|
+
readonly entryPoints: {
|
|
357
|
+
readonly compute: "ao_main";
|
|
358
|
+
};
|
|
359
|
+
readonly bindGroups: readonly [{
|
|
360
|
+
readonly logicalSpace: "pass";
|
|
361
|
+
readonly logicalGroup: 3;
|
|
362
|
+
readonly physicalGroup: 0;
|
|
363
|
+
readonly owner: "artifact";
|
|
364
|
+
readonly bindings: readonly [{
|
|
365
|
+
readonly id: "hybrid.params";
|
|
366
|
+
readonly binding: 0;
|
|
367
|
+
readonly visibility: readonly ["compute"];
|
|
368
|
+
readonly layout: {
|
|
369
|
+
readonly kind: "buffer";
|
|
370
|
+
readonly bufferType: "uniform";
|
|
371
|
+
readonly hasDynamicOffset: false;
|
|
372
|
+
readonly minBindingSize: 256;
|
|
373
|
+
};
|
|
374
|
+
}, {
|
|
375
|
+
readonly id: "hybrid.blasNodes";
|
|
376
|
+
readonly binding: 1;
|
|
377
|
+
readonly visibility: readonly ["compute"];
|
|
378
|
+
readonly layout: {
|
|
379
|
+
readonly kind: "buffer";
|
|
380
|
+
readonly bufferType: "read-only-storage";
|
|
381
|
+
readonly hasDynamicOffset: false;
|
|
382
|
+
readonly minBindingSize: 16;
|
|
383
|
+
};
|
|
384
|
+
}, {
|
|
385
|
+
readonly id: "hybrid.blasTable";
|
|
386
|
+
readonly binding: 2;
|
|
387
|
+
readonly visibility: readonly ["compute"];
|
|
388
|
+
readonly layout: {
|
|
389
|
+
readonly kind: "buffer";
|
|
390
|
+
readonly bufferType: "read-only-storage";
|
|
391
|
+
readonly hasDynamicOffset: false;
|
|
392
|
+
readonly minBindingSize: 16;
|
|
393
|
+
};
|
|
394
|
+
}, {
|
|
395
|
+
readonly id: "hybrid.tlasNodes";
|
|
396
|
+
readonly binding: 3;
|
|
397
|
+
readonly visibility: readonly ["compute"];
|
|
398
|
+
readonly layout: {
|
|
399
|
+
readonly kind: "buffer";
|
|
400
|
+
readonly bufferType: "read-only-storage";
|
|
401
|
+
readonly hasDynamicOffset: false;
|
|
402
|
+
readonly minBindingSize: 16;
|
|
403
|
+
};
|
|
404
|
+
}, {
|
|
405
|
+
readonly id: "hybrid.primitives";
|
|
406
|
+
readonly binding: 4;
|
|
407
|
+
readonly visibility: readonly ["compute"];
|
|
408
|
+
readonly layout: {
|
|
409
|
+
readonly kind: "buffer";
|
|
410
|
+
readonly bufferType: "read-only-storage";
|
|
411
|
+
readonly hasDynamicOffset: false;
|
|
412
|
+
readonly minBindingSize: 16;
|
|
413
|
+
};
|
|
414
|
+
}, {
|
|
415
|
+
readonly id: "hybrid.instances";
|
|
416
|
+
readonly binding: 5;
|
|
417
|
+
readonly visibility: readonly ["compute"];
|
|
418
|
+
readonly layout: {
|
|
419
|
+
readonly kind: "buffer";
|
|
420
|
+
readonly bufferType: "read-only-storage";
|
|
421
|
+
readonly hasDynamicOffset: false;
|
|
422
|
+
readonly minBindingSize: 16;
|
|
423
|
+
};
|
|
424
|
+
}, {
|
|
425
|
+
readonly id: "hybrid.depth";
|
|
426
|
+
readonly binding: 6;
|
|
427
|
+
readonly visibility: readonly ["compute"];
|
|
428
|
+
readonly layout: {
|
|
429
|
+
readonly kind: "texture";
|
|
430
|
+
readonly sampleType: "depth";
|
|
431
|
+
readonly viewDimension: "2d";
|
|
432
|
+
readonly multisampled: false;
|
|
433
|
+
};
|
|
434
|
+
}, {
|
|
435
|
+
readonly id: "hybrid.normal";
|
|
436
|
+
readonly binding: 7;
|
|
437
|
+
readonly visibility: readonly ["compute"];
|
|
438
|
+
readonly layout: {
|
|
439
|
+
readonly kind: "texture";
|
|
440
|
+
readonly sampleType: "unfilterable-float";
|
|
441
|
+
readonly viewDimension: "2d";
|
|
442
|
+
readonly multisampled: false;
|
|
443
|
+
};
|
|
444
|
+
}, {
|
|
445
|
+
readonly id: "hybrid.material";
|
|
446
|
+
readonly binding: 8;
|
|
447
|
+
readonly visibility: readonly ["compute"];
|
|
448
|
+
readonly layout: {
|
|
449
|
+
readonly kind: "texture";
|
|
450
|
+
readonly sampleType: "unfilterable-float";
|
|
451
|
+
readonly viewDimension: "2d";
|
|
452
|
+
readonly multisampled: false;
|
|
453
|
+
};
|
|
454
|
+
}, {
|
|
455
|
+
readonly id: "hybrid.sceneColor";
|
|
456
|
+
readonly binding: 9;
|
|
457
|
+
readonly visibility: readonly ["compute"];
|
|
458
|
+
readonly layout: {
|
|
459
|
+
readonly kind: "texture";
|
|
460
|
+
readonly sampleType: "unfilterable-float";
|
|
461
|
+
readonly viewDimension: "2d";
|
|
462
|
+
readonly multisampled: false;
|
|
463
|
+
};
|
|
464
|
+
}, {
|
|
465
|
+
readonly id: "hybrid.previous";
|
|
466
|
+
readonly binding: 10;
|
|
467
|
+
readonly visibility: readonly ["compute"];
|
|
468
|
+
readonly layout: {
|
|
469
|
+
readonly kind: "texture";
|
|
470
|
+
readonly sampleType: "unfilterable-float";
|
|
471
|
+
readonly viewDimension: "2d";
|
|
472
|
+
readonly multisampled: false;
|
|
473
|
+
};
|
|
474
|
+
}, {
|
|
475
|
+
readonly id: "hybrid.diagnostics";
|
|
476
|
+
readonly binding: 11;
|
|
477
|
+
readonly visibility: readonly ["compute"];
|
|
478
|
+
readonly layout: {
|
|
479
|
+
readonly kind: "buffer";
|
|
480
|
+
readonly bufferType: "storage";
|
|
481
|
+
readonly hasDynamicOffset: false;
|
|
482
|
+
readonly minBindingSize: 48;
|
|
483
|
+
};
|
|
484
|
+
}, {
|
|
485
|
+
readonly id: "hybrid.output";
|
|
486
|
+
readonly binding: 12;
|
|
487
|
+
readonly visibility: readonly ["compute"];
|
|
488
|
+
readonly layout: {
|
|
489
|
+
readonly kind: "storage-texture";
|
|
490
|
+
readonly access: "write-only";
|
|
491
|
+
readonly format: "rgba16float";
|
|
492
|
+
readonly viewDimension: "2d";
|
|
493
|
+
};
|
|
494
|
+
}];
|
|
495
|
+
}];
|
|
496
|
+
readonly uniformBlocks: readonly [{
|
|
497
|
+
readonly id: "hybrid.params";
|
|
498
|
+
readonly alignment: 16;
|
|
499
|
+
readonly byteSize: 256;
|
|
500
|
+
readonly fields: readonly [{
|
|
501
|
+
readonly name: "raw";
|
|
502
|
+
readonly type: "array<u32,64>";
|
|
503
|
+
readonly offset: 0;
|
|
504
|
+
readonly size: 256;
|
|
505
|
+
readonly arrayStride: 4;
|
|
506
|
+
}];
|
|
507
|
+
}];
|
|
508
|
+
readonly vertexBuffers: readonly [];
|
|
509
|
+
readonly varyings: readonly [];
|
|
510
|
+
readonly renderTargets: readonly [];
|
|
511
|
+
readonly capabilities: readonly ["compute", "sampled-texture", "storage-texture"];
|
|
512
|
+
readonly passRequirements: readonly ["webgpu", "maxBindingsPerBindGroup>=13", "maxStorageBuffersPerShaderStage>=6"];
|
|
513
|
+
readonly sourceMap: readonly [{
|
|
514
|
+
readonly sourceId: "ray-hybrid-ao";
|
|
515
|
+
readonly sourceName: "extensions/src/ray-tracing/hybrid/shaders/hybrid-effects.wgsl";
|
|
516
|
+
readonly generatedStartLine: 1;
|
|
517
|
+
readonly generatedEndLine: 72;
|
|
518
|
+
readonly sourceStartLine: 1;
|
|
519
|
+
readonly sourceStartColumn: 1;
|
|
520
|
+
}];
|
|
521
|
+
readonly canonicalHash: "ac2c433e3122c0957b02370a843241c075e87a667e070f5dd235fc286d700216";
|
|
522
|
+
};
|
|
523
|
+
readonly "ray-hybrid-composite": {
|
|
524
|
+
readonly id: "ray-hybrid-composite";
|
|
525
|
+
readonly code: "struct CompositeParams { image: vec4u, flags: vec4u }\n@group(0) @binding(0) var<uniform> params: CompositeParams;\n@group(0) @binding(1) var sceneColor: texture_2d<f32>;\n@group(0) @binding(2) var shadowEffect: texture_2d<f32>;\n@group(0) @binding(3) var reflectionEffect: texture_2d<f32>;\n@group(0) @binding(4) var aoEffect: texture_2d<f32>;\n@group(0) @binding(5) var output: texture_storage_2d<rgba8unorm,write>;\nfn sample_scaled(t:texture_2d<f32>,p:vec2u)->vec4f{let d=vec2u(textureDimensions(t));let c=vec2i(min(d-vec2u(1u),vec2u((vec2f(p)+0.5)*vec2f(d)/vec2f(params.image.xy))));return textureLoad(t,c,0);}\nfn to_linear(v:vec3f)->vec3f{return select(v,pow(max(v,vec3f(0.0)),vec3f(2.2)),params.flags.y==1u);}fn from_linear(v:vec3f)->vec3f{return select(v,pow(max(v,vec3f(0.0)),vec3f(1.0/2.2)),params.flags.y==1u);}\n@compute @workgroup_size(8,8,1) fn composite_main(@builtin(global_invocation_id) gid:vec3u){if(any(gid.xy>=params.image.xy)){return;}let p=gid.xy;var base=textureLoad(sceneColor,vec2i(p),0);let shadow=sample_scaled(shadowEffect,p);let reflection=sample_scaled(reflectionEffect,p);let ao=sample_scaled(aoEffect,p);var value=vec4f(from_linear(to_linear(base.rgb)*shadow.rgb*ao.rgb),base.a);value=vec4f(from_linear(clamp(mix(to_linear(value.rgb),reflection.rgb,reflection.a),vec3f(0.0),vec3f(1.0))),value.a);if(params.flags.x==1u){value=shadow;}else if(params.flags.x==2u){value=vec4f(from_linear(reflection.rgb),reflection.a);}else if(params.flags.x==3u){value=ao;}textureStore(output,vec2i(p),value);}\n";
|
|
526
|
+
readonly entryPoints: {
|
|
527
|
+
readonly compute: "composite_main";
|
|
528
|
+
};
|
|
529
|
+
readonly bindGroups: readonly [{
|
|
530
|
+
readonly logicalSpace: "pass";
|
|
531
|
+
readonly logicalGroup: 3;
|
|
532
|
+
readonly physicalGroup: 0;
|
|
533
|
+
readonly owner: "artifact";
|
|
534
|
+
readonly bindings: readonly [{
|
|
535
|
+
readonly id: "hybrid.composite.params";
|
|
536
|
+
readonly binding: 0;
|
|
537
|
+
readonly visibility: readonly ["compute"];
|
|
538
|
+
readonly layout: {
|
|
539
|
+
readonly kind: "buffer";
|
|
540
|
+
readonly bufferType: "uniform";
|
|
541
|
+
readonly hasDynamicOffset: false;
|
|
542
|
+
readonly minBindingSize: 32;
|
|
543
|
+
};
|
|
544
|
+
}, {
|
|
545
|
+
readonly id: "hybrid.sceneColor";
|
|
546
|
+
readonly binding: 1;
|
|
547
|
+
readonly visibility: readonly ["compute"];
|
|
548
|
+
readonly layout: {
|
|
549
|
+
readonly kind: "texture";
|
|
550
|
+
readonly sampleType: "unfilterable-float";
|
|
551
|
+
readonly viewDimension: "2d";
|
|
552
|
+
readonly multisampled: false;
|
|
553
|
+
};
|
|
554
|
+
}, {
|
|
555
|
+
readonly id: "hybrid.shadow";
|
|
556
|
+
readonly binding: 2;
|
|
557
|
+
readonly visibility: readonly ["compute"];
|
|
558
|
+
readonly layout: {
|
|
559
|
+
readonly kind: "texture";
|
|
560
|
+
readonly sampleType: "unfilterable-float";
|
|
561
|
+
readonly viewDimension: "2d";
|
|
562
|
+
readonly multisampled: false;
|
|
563
|
+
};
|
|
564
|
+
}, {
|
|
565
|
+
readonly id: "hybrid.reflection";
|
|
566
|
+
readonly binding: 3;
|
|
567
|
+
readonly visibility: readonly ["compute"];
|
|
568
|
+
readonly layout: {
|
|
569
|
+
readonly kind: "texture";
|
|
570
|
+
readonly sampleType: "unfilterable-float";
|
|
571
|
+
readonly viewDimension: "2d";
|
|
572
|
+
readonly multisampled: false;
|
|
573
|
+
};
|
|
574
|
+
}, {
|
|
575
|
+
readonly id: "hybrid.ao";
|
|
576
|
+
readonly binding: 4;
|
|
577
|
+
readonly visibility: readonly ["compute"];
|
|
578
|
+
readonly layout: {
|
|
579
|
+
readonly kind: "texture";
|
|
580
|
+
readonly sampleType: "unfilterable-float";
|
|
581
|
+
readonly viewDimension: "2d";
|
|
582
|
+
readonly multisampled: false;
|
|
583
|
+
};
|
|
584
|
+
}, {
|
|
585
|
+
readonly id: "hybrid.composite.output";
|
|
586
|
+
readonly binding: 5;
|
|
587
|
+
readonly visibility: readonly ["compute"];
|
|
588
|
+
readonly layout: {
|
|
589
|
+
readonly kind: "storage-texture";
|
|
590
|
+
readonly access: "write-only";
|
|
591
|
+
readonly format: "rgba8unorm";
|
|
592
|
+
readonly viewDimension: "2d";
|
|
593
|
+
};
|
|
594
|
+
}];
|
|
595
|
+
}];
|
|
596
|
+
readonly uniformBlocks: readonly [{
|
|
597
|
+
readonly id: "hybrid.composite.params";
|
|
598
|
+
readonly alignment: 16;
|
|
599
|
+
readonly byteSize: 32;
|
|
600
|
+
readonly fields: readonly [{
|
|
601
|
+
readonly name: "raw";
|
|
602
|
+
readonly type: "array<u32,8>";
|
|
603
|
+
readonly offset: 0;
|
|
604
|
+
readonly size: 32;
|
|
605
|
+
readonly arrayStride: 4;
|
|
606
|
+
}];
|
|
607
|
+
}];
|
|
608
|
+
readonly vertexBuffers: readonly [];
|
|
609
|
+
readonly varyings: readonly [];
|
|
610
|
+
readonly renderTargets: readonly [];
|
|
611
|
+
readonly capabilities: readonly ["compute", "sampled-texture", "storage-texture"];
|
|
612
|
+
readonly passRequirements: readonly ["webgpu", "maxBindingsPerBindGroup>=13", "maxStorageBuffersPerShaderStage>=6"];
|
|
613
|
+
readonly sourceMap: readonly [{
|
|
614
|
+
readonly sourceId: "ray-hybrid-composite";
|
|
615
|
+
readonly sourceName: "extensions/src/ray-tracing/hybrid/shaders/hybrid-composite.wgsl";
|
|
616
|
+
readonly generatedStartLine: 1;
|
|
617
|
+
readonly generatedEndLine: 11;
|
|
618
|
+
readonly sourceStartLine: 1;
|
|
619
|
+
readonly sourceStartColumn: 1;
|
|
620
|
+
}];
|
|
621
|
+
readonly canonicalHash: "1d1cfe070aacc3a2cfa0f853f1068dc03d4f038971fd9bc5b5f8564b13dbbe55";
|
|
622
|
+
};
|
|
623
|
+
};
|
|
624
|
+
readonly artifactHash: "4a09990032ae1bfa55cc1f1de81b11e08e2611cb0bf05643f37aa8d179798077";
|
|
625
|
+
};
|