Variable: volumeRaymarch
constvolumeRaymarch:object
Defined in: modules/volume/volume-raymarch.ts:84
WGSL helpers shared by structured-volume ray marchers.
Type Declaration
name
readonlyname:"volumeRaymarch"='volumeRaymarch'
source
source: "fn volumeRaymarch_intersectBox(origin: vec3f, direction: vec3f, minimum: vec3f, maximum: vec3f) -> vec2f {\n let safeDirection = select(vec3f(0.000001), direction, abs(direction) > vec3f(0.000001));\n let first = (minimum - origin) / safeDirection;\n let second = (maximum - origin) / safeDirection;\n let nearPlane = min(first, second);\n let farPlane = max(first, second);\n return vec2f(\n max(max(nearPlane.x, nearPlane.y), nearPlane.z),\n min(min(farPlane.x, farPlane.y), farPlane.z)\n );\n}\n\nfn volumeRaymarch_mixScalar(corners: array<f32, 8>, blend: vec3f) -> f32 {\n let lower = mix(mix(corners[0], corners[1], blend.x), mix(corners[2], corners[3], blend.x), blend.y);\n let upper = mix(mix(corners[4], corners[5], blend.x), mix(corners[6], corners[7], blend.x), blend.y);\n return mix(lower, upper, blend.z);\n}\n\nfn volumeRaymarch_mixVector(corners: array<vec3f, 8>, blend: vec3f) -> vec3f {\n let lower = mix(mix(corners[0], corners[1], blend.x), mix(corners[2], corners[3], blend.x), blend.y);\n let upper = mix(mix(corners[4], corners[5], blend.x), mix(corners[6], corners[7], blend.x), blend.y);\n return mix(lower, upper, blend.z);\n}\n\nfn volumeRaymarch_sequentialColor(value: f32, lowColor: vec3f, highColor: vec3f) -> vec3f {\n return mix(lowColor, highColor, clamp(value, 0.0, 1.0));\n}\n\nfn volumeRaymarch_signedColor(value: f32, negativeColor: vec3f, neutralColor: vec3f, positiveColor: vec3f) -> vec3f {\n let amount = clamp(abs(value), 0.0, 1.0);\n let signedTarget = select(negativeColor, positiveColor, value >= 0.0);\n return mix(neutralColor, signedTarget, amount);\n}\n\nfn volumeRaymarch_directionColor(vector: vec3f) -> vec3f {\n let direction = normalize(vector + vec3f(0.00001));\n return 0.18 + 0.82 * (direction * 0.5 + 0.5);\n}\n\nfn volumeRaymarch_segmentDistance(point: vec3f, start: vec3f, end: vec3f) -> f32 {\n let segment = end - start;\n let fraction = clamp(dot(point - start, segment) / max(dot(segment, segment), 0.000001), 0.0, 1.0);\n return length(point - (start + segment * fraction));\n}\n\nfn volumeRaymarch_arrowDistance(\n point: vec3f,\n center: vec3f,\n direction: vec3f,\n arrowLength: f32,\n shaftRadius: f32,\n headRadius: f32\n) -> vec2f {\n let tail = center - direction * arrowLength * 0.48;\n let shoulder = center + direction * arrowLength * 0.18;\n let tip = center + direction * arrowLength * 0.52;\n let shaftDistance = volumeRaymarch_segmentDistance(point, tail, shoulder) - shaftRadius;\n let headVector = point - shoulder;\n let headLength = max(length(tip - shoulder), 0.000001);\n let headPosition = dot(headVector, direction);\n let taperedRadius = headRadius * (1.0 - clamp(headPosition / headLength, 0.0, 1.0));\n let radialDistance = length(headVector - direction * headPosition);\n let headDistance = max(\n radialDistance - taperedRadius,\n max(-headPosition, headPosition - headLength)\n );\n return vec2f(min(shaftDistance, headDistance), headDistance);\n}\n\nfn volumeRaymarch_composite(accumulated: vec4f, color: vec3f, alpha: f32) -> vec4f {\n let contribution = (1.0 - accumulated.a) * clamp(alpha, 0.0, 1.0);\n return vec4f(accumulated.rgb + color * contribution, accumulated.a + contribution);\n}\n"