diff --git a/examples/glsl/index.html b/examples/glsl/index.html
index 11dc5ef4..39e655ed 100644
--- a/examples/glsl/index.html
+++ b/examples/glsl/index.html
@@ -68,7 +68,7 @@
butterfly.worldModifier = new dyno.Dyno({
inTypes: { gsplat: dyno.Gsplat },
outTypes: { gsplat: dyno.Gsplat },
- globals: () => [dyno.unindent(`
+ globals: () => [dyno.unindent(/* glsl */ `
vec3 waveRgb(vec3 pos) {
return vec3(
0.6 + 0.4 * sin(pos.x * 56.0),
@@ -77,7 +77,7 @@
);
}
`)],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
${outputs.gsplat}.rgba.rgb *= waveRgb(${inputs.gsplat}.center);
`),
@@ -98,7 +98,7 @@
inTypes: { gsplat: dyno.Gsplat, t: "float" },
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
float warpRadial(float r, float t) {
return r * (1.0 + 0.1 * sin(r * 15.0 + t * 3.0));
}
@@ -109,7 +109,7 @@
}
`)
],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
${outputs.gsplat}.center = warp(${inputs.gsplat}.center, ${inputs.t});
`),
diff --git a/examples/interactive-deform/main.js b/examples/interactive-deform/main.js
index 778b4679..eb923bf7 100644
--- a/examples/interactive-deform/main.js
+++ b/examples/interactive-deform/main.js
@@ -124,7 +124,7 @@ function createDragBounceDynoshader() {
},
outTypes: { gsplat: dyno.Gsplat },
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 originalPos = ${inputs.gsplat}.center;
diff --git a/examples/interactive-holes/index.html b/examples/interactive-holes/index.html
index 117579a8..a1c105a9 100644
--- a/examples/interactive-holes/index.html
+++ b/examples/interactive-holes/index.html
@@ -127,7 +127,7 @@
inTypes: inputTypes,
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
float hash(vec3 p) { return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453); }
vec3 simulatePhysics(vec3 originalPos, float dropTime, float gravity, float damping, float floorLevel, float friction, float explosionStrength) {
float timeVariation = hash(originalPos + vec3(42.0)) * 0.2 - 0.1;
@@ -160,7 +160,7 @@
}
`),
],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 originalPos = ${inputs.gsplat}.center;
const int K = ${MAX_IMPULSES};
diff --git a/examples/interactive-ripples/main.js b/examples/interactive-ripples/main.js
index 0dc848f2..486da71d 100644
--- a/examples/interactive-ripples/main.js
+++ b/examples/interactive-ripples/main.js
@@ -55,7 +55,7 @@ function passthroughDyno(timeUniform, hitpointUniform) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
vec3 shockwave(vec3 center, float t, vec3 hitpoint) {
vec3 direction = center - hitpoint;
float distance = length(direction);
@@ -73,7 +73,7 @@ function passthroughDyno(timeUniform, hitpointUniform) {
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
// Apply shockwave function to position
${outputs.gsplat}.center = shockwave(${inputs.gsplat}.center, ${inputs.time}, ${inputs.hitpoint});
diff --git a/examples/lofi/index.html b/examples/lofi/index.html
index b941af1d..0b32b994 100644
--- a/examples/lofi/index.html
+++ b/examples/lofi/index.html
@@ -519,7 +519,7 @@
inTypes: { gsplat1: dyno.Gsplat, gsplat2: dyno.Gsplat, t: "float", translate: "float" },
outTypes: { gsplat: dyno.Gsplat },
inputs,
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat1};
vec3 center2 = ${inputs.gsplat2}.center + vec3(0.0, 0.0, ${inputs.translate});
${outputs.gsplat}.center = mix(${inputs.gsplat1}.center, center2, ${inputs.t});
@@ -535,7 +535,7 @@
inTypes: { gsplat: dyno.Gsplat, rustleBlend: "float", t: "float" },
outTypes: { gsplat: dyno.Gsplat },
inputs: { gsplat, rustleBlend, t },
- globals: () => [dyno.unindent(`
+ globals: () => [dyno.unindent(/* glsl */ `
vec4 colorWave(vec4 rgba, vec3 p, float t) {
float len = length(p);
float magnitude = sin(len + t + 1.7 * p.x + 2.3 * p.z + 0.9 * p.y);
@@ -547,7 +547,7 @@
return mix(rgba, target, 1.0 - sqr(1.0 - magnitude));
}
`)],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec4 displace = colorWave(${outputs.gsplat}.rgba, ${outputs.gsplat}.center, ${inputs.t});
displace.w = 1.0 - displace.w;
@@ -562,7 +562,7 @@
outTypes: { gsplat: dyno.Gsplat },
inputs: { gsplat, tips },
statements: ({ inputs, outputs }) => {
- return dyno.unindentLines(`
+ return dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 center = ${outputs.gsplat}.center;
@@ -598,7 +598,7 @@
inTypes: { gsplat: dyno.Gsplat, spotlightOrigins: "vec3", spotlightDirs: "vec3", spotlightFovs: "float" },
outTypes: { gsplat: dyno.Gsplat },
inputs: { gsplat, spotlightOrigins, spotlightDirs, spotlightFovs },
- globals: () => [dyno.unindent(`
+ globals: () => [dyno.unindent(/* glsl */ `
float computeSpotlight(
vec3 worldVertex,
vec3 worldOrigin,
@@ -635,7 +635,7 @@
}
`)],
statements: ({ inputs, outputs }) => {
- return dyno.unindentLines(`
+ return dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
if (${inputs.spotlightFovs}[0] > 0.0 || ${inputs.spotlightFovs}[1] > 0.0) {
float lighting = 0.0;
diff --git a/examples/render-cube-depth/index.html b/examples/render-cube-depth/index.html
index 9b792491..d7cdbf1e 100644
--- a/examples/render-cube-depth/index.html
+++ b/examples/render-cube-depth/index.html
@@ -94,7 +94,7 @@
inTypes: { gsplat: dyno.Gsplat, worldToProj: "mat4" },
outTypes: { gsplat: dyno.Gsplat },
inputs: { gsplat, worldToProj },
- globals: () => [dyno.unindent(`
+ globals: () => [dyno.unindent(/* glsl */ `
const float PackUpscale = 256. / 255.; // fraction -> 0..1 (including 1)
const float ShiftRight8 = 1. / 256.;
const float Inv255 = 1. / 255.;
@@ -113,7 +113,7 @@
return vec3( vuf * Inv255, gf * PackUpscale, bf );
}
`)],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat}.flags = 0u;
if (isGsplatActive(${inputs.gsplat}.flags) && (${inputs.gsplat}.rgba.a > ${minAlpha})) {
${outputs.gsplat} = ${inputs.gsplat};
diff --git a/examples/splat-dissolve-effects/index.html b/examples/splat-dissolve-effects/index.html
index 4dba918c..b42a8cd5 100644
--- a/examples/splat-dissolve-effects/index.html
+++ b/examples/splat-dissolve-effects/index.html
@@ -68,14 +68,14 @@
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
vec3 hash(vec3 p) {
return fract(sin(p*123.456)*123.456);
}
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 localPos = ${inputs.gsplat}.center;
vec3 hashVal = hash(localPos);
diff --git a/examples/splat-flow/index.html b/examples/splat-flow/index.html
index ddda8afa..f9b4f758 100644
--- a/examples/splat-flow/index.html
+++ b/examples/splat-flow/index.html
@@ -57,7 +57,7 @@
return new dyno.Dyno({
inTypes: { gsplat: dyno.Gsplat, inTransition: "bool", fadeIn: "bool", t: "float", gt: "float", objectIndex: "int", fixedMinScale: "bool", waves: "float" },
outTypes: { gsplat: dyno.Gsplat },
- globals: () => [ dyno.unindent(`
+ globals: () => [ dyno.unindent(/* glsl */ `
float hash13(vec3 p3) { p3 = fract(p3 * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }
float hash11(float p) { p = fract(p * .1031); p += dot(p, p + 33.33); return fract(p * p); }
float fadeInOut(float t) { return abs(mix(-1., 1., t)); }
@@ -82,7 +82,7 @@
return cur == idx ? .1+fadeInOut(t) : 0.0;
}
`) ],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
${outputs.gsplat}.center = applyCenter(${inputs.gsplat}.center, ${inputs.t}, float(${inputs.gsplat}.index), ${inputs.objectIndex}, ${inputs.waves});
${outputs.gsplat}.scales = applyScale(${inputs.gsplat}.scales, ${inputs.t}, ${inputs.fixedMinScale});
@@ -177,7 +177,7 @@
return localCenter.add(m.position);
});
- const centerGLSL = `
+ const centerGLSL = /* glsl */ `
vec3 getCenterOfMass(int idx) {
if (idx == 0) return vec3(${centers[0].x}, ${centers[0].y}, ${centers[0].z});
if (idx == 1) return vec3(${centers[1].x}, ${centers[1].y}, ${centers[1].z});
diff --git a/examples/splat-portal/main.js b/examples/splat-portal/main.js
index d9717f22..11402026 100644
--- a/examples/splat-portal/main.js
+++ b/examples/splat-portal/main.js
@@ -93,7 +93,7 @@ function makePortalMaterial() {
waveFrequency: { value: 50.0 },
edgeSoftness: { value: 0.2 },
},
- vertexShader: `
+ vertexShader: /* glsl */ `
varying vec3 vWorldPosition;
varying vec2 vLocalXY;
void main() {
@@ -103,7 +103,7 @@ function makePortalMaterial() {
gl_Position = projectionMatrix * viewMatrix * worldPos;
}
`,
- fragmentShader: `
+ fragmentShader: /* glsl */ `
uniform sampler2D tMap;
uniform mat4 portalPV;
uniform mat4 portalBridge;
diff --git a/examples/splat-reveal-effects/index.html b/examples/splat-reveal-effects/index.html
index 1d8dcd28..4702832f 100644
--- a/examples/splat-reveal-effects/index.html
+++ b/examples/splat-reveal-effects/index.html
@@ -158,7 +158,7 @@
outTypes: { gsplat: dyno.Gsplat },
// GLSL utility functions for effects
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
// Pseudo-random hash function
vec3 hash(vec3 p) {
p = fract(p * 0.3183099 + 0.1);
@@ -221,7 +221,7 @@
`)
],
// Main effect shader logic
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
float t = ${inputs.t};
float s = smoothstep(0.,10.,t-4.5)*10.;
diff --git a/examples/splat-shader-effects/index.html b/examples/splat-shader-effects/index.html
index 4e5bee06..48e4afea 100644
--- a/examples/splat-shader-effects/index.html
+++ b/examples/splat-shader-effects/index.html
@@ -83,7 +83,7 @@
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
vec3 hash(vec3 p) {
return fract(sin(p*123.456)*123.456);
}
@@ -168,7 +168,7 @@
}
`)
],
- statements: ({ inputs, outputs }) => dyno.unindentLines(`
+ statements: ({ inputs, outputs }) => dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 localPos = ${inputs.gsplat}.center;
diff --git a/examples/splat-transitions/effects/explosion.js b/examples/splat-transitions/effects/explosion.js
index e91ae510..186870f8 100644
--- a/examples/splat-transitions/effects/explosion.js
+++ b/examples/splat-transitions/effects/explosion.js
@@ -74,7 +74,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
mat2 rot(float angle) { float c = cos(angle); float s = sin(angle); return mat2(c, -s, s, c); }
float hash(vec3 p) { return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453); }
vec3 simulatePhysics(vec3 originalPos, float dropTime, float progress, float gravity, float damping, float floorLevel, float randomOffset, float friction, float explosionStrength) {
@@ -123,7 +123,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 originalPos = ${inputs.gsplat}.center;
vec3 originalScale = ${inputs.gsplat}.scales;
@@ -183,12 +183,12 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
float hash(vec3 p) { return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453); }
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
vec3 originalPos = ${inputs.gsplat}.center;
vec3 originalScale = ${inputs.gsplat}.scales;
diff --git a/examples/splat-transitions/effects/flow.js b/examples/splat-transitions/effects/flow.js
index ead1ab19..a223eec2 100644
--- a/examples/splat-transitions/effects/flow.js
+++ b/examples/splat-transitions/effects/flow.js
@@ -52,7 +52,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
float hash13(vec3 p3) { p3 = fract(p3 * .1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }
float hash11(float p) { p = fract(p * .1031); p += dot(p, p + 33.33); return fract(p * p); }
float fadeInOut(float t) { return abs(mix(-1., 1., t)); }
@@ -79,7 +79,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
${outputs.gsplat}.center = applyCenter(${inputs.gsplat}.center, ${inputs.t}, float(${inputs.gsplat}.index), ${inputs.objectIndex}, ${inputs.waves});
${outputs.gsplat}.scales = applyScale(${inputs.gsplat}.scales, ${inputs.t}, ${inputs.fixedMinScale});
@@ -179,7 +179,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
return localCenter.add(m.position);
});
- const centerGLSL = `
+ const centerGLSL = /* glsl */ `
vec3 getCenterOfMass(int idx) {
if (idx == 0) return vec3(${centers[0].x}, ${centers[0].y}, ${centers[0].z});
if (idx == 1) return vec3(${centers[1].x}, ${centers[1].y}, ${centers[1].z});
diff --git a/examples/splat-transitions/effects/morph.js b/examples/splat-transitions/effects/morph.js
index 26666779..a5acd2f5 100644
--- a/examples/splat-transitions/effects/morph.js
+++ b/examples/splat-transitions/effects/morph.js
@@ -43,7 +43,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
vec3 hash3(int n) {
float x = float(n);
return fract(sin(vec3(x, x + 1.0, x + 2.0)) * 43758.5453123);
@@ -59,7 +59,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
float stay = ${inputs.stay};
float trans = ${inputs.trans};
diff --git a/examples/splat-transitions/effects/spheric.js b/examples/splat-transitions/effects/spheric.js
index bd8a35f6..7d68a3fb 100644
--- a/examples/splat-transitions/effects/spheric.js
+++ b/examples/splat-transitions/effects/spheric.js
@@ -89,7 +89,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
},
outTypes: { gsplat: dyno.Gsplat },
globals: () => [
- dyno.unindent(`
+ dyno.unindent(/* glsl */ `
vec3 applyCenter(vec3 center, float t, float spereRadius, float sphereHeight) {
float heightModifier = 0.5 + 0.5 * pow(abs(1.0 - 2.0*t), 0.2);
vec3 targetCenter = vec3(0.0, heightModifier * sphereHeight, 0.0);
@@ -132,7 +132,7 @@ export async function init({ THREE: _THREE, scene, camera, renderer, spark }) {
`),
],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
${outputs.gsplat}.center = applyCenter(${inputs.gsplat}.center, ${inputs.t}, ${inputs.spereRadius}, ${inputs.sphereHeight});
${outputs.gsplat}.scales = applyScale(${inputs.gsplat}.scales, ${inputs.t}, ${inputs.splatScale});
diff --git a/src/ExtSplats.ts b/src/ExtSplats.ts
index 198f9439..caf259de 100644
--- a/src/ExtSplats.ts
+++ b/src/ExtSplats.ts
@@ -778,7 +778,7 @@ export class DynoExtSplats extends DynoUniform<
}
}
-export const defineEvaluateExtSH1 = unindent(`
+export const defineEvaluateExtSH1 = unindent(/* glsl */ `
vec3 evaluateExtSH1(uvec4 packedData, vec3 viewDir) {
vec3 sh1_0 = decodeExtRgb(packedData.x);
vec3 sh1_1 = decodeExtRgb(packedData.y);
@@ -790,7 +790,7 @@ export const defineEvaluateExtSH1 = unindent(`
}
`);
-export const defineEvaluateExtSH12 = unindent(`
+export const defineEvaluateExtSH12 = unindent(/* glsl */ `
vec3 evaluateExtSH12(uvec4 packed1, uvec4 packed2, vec3 viewDir) {
vec3 sh1_0 = decodeExtRgb(packed1.x);
vec3 sh1_1 = decodeExtRgb(packed1.y);
@@ -816,7 +816,7 @@ export const defineEvaluateExtSH12 = unindent(`
}
`);
-export const defineEvaluateExtSH3 = unindent(`
+export const defineEvaluateExtSH3 = unindent(/* glsl */ `
vec3 evaluateExtSH3(uvec4 packedA, uvec4 packedB, vec3 viewDir) {
vec3 sh3_0 = decodeExtRgb(packedA.x);
vec3 sh3_1 = decodeExtRgb(packedA.y);
@@ -890,7 +890,7 @@ export function evaluateExtSH({
if (inputs.sh1Texture) {
if (!inputs.sh2Texture) {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} >= 1) {
rgb = evaluateExtSH1(texelFetch(${inputs.sh1Texture}, ${inputs.coord}, 0), ${inputs.viewDir});
}
@@ -898,7 +898,7 @@ export function evaluateExtSH({
);
} else {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} == 1) {
rgb = evaluateExtSH1(texelFetch(${inputs.sh1Texture}, ${inputs.coord}, 0), ${inputs.viewDir});
} else if (${inputs.numSh} >= 2) {
@@ -908,7 +908,7 @@ export function evaluateExtSH({
if (inputs.sh3TextureA && inputs.sh3TextureB) {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} >= 3) {
rgb += evaluateExtSH3(texelFetch(${inputs.sh3TextureA}, ${inputs.coord}, 0), texelFetch(${inputs.sh3TextureB}, ${inputs.coord}, 0), ${inputs.viewDir});
}
diff --git a/src/PackedSplats.ts b/src/PackedSplats.ts
index 9d90dcf6..c90fe8fd 100644
--- a/src/PackedSplats.ts
+++ b/src/PackedSplats.ts
@@ -1068,7 +1068,7 @@ export class DynoPackedSplats extends DynoUniform<
}
}
-export const defineEvalPackedSH1 = unindent(`
+export const defineEvalPackedSH1 = unindent(/* glsl */ `
vec3 evaluatePackedSH1(uvec2 packedData, vec3 viewDir, float sh1Max) {
// Extract sint7 values packed into 2 x uint32
vec3 sh1_0 = vec3(ivec3(
@@ -1094,7 +1094,7 @@ export const defineEvalPackedSH1 = unindent(`
}
`);
-export const defineEvalPackedSH2 = unindent(`
+export const defineEvalPackedSH2 = unindent(/* glsl */ `
vec3 evaluatePackedSH2(uvec4 packedData, vec3 viewDir, float sh2Max) {
// Extract sint8 values packed into 4 x uint32
vec3 sh2_0 = vec3(ivec3(
@@ -1132,7 +1132,7 @@ export const defineEvalPackedSH2 = unindent(`
}
`);
-export const defineEvalPackedSH3 = unindent(`
+export const defineEvalPackedSH3 = unindent(/* glsl */ `
vec3 evaluatePackedSH3(uvec4 packedData, vec3 viewDir, float sh3Max) {
// Extract sint6 values packed into 4 x uint32
vec3 sh3_0 = vec3(ivec3(
@@ -1235,7 +1235,7 @@ export function evaluatePackedSH({
const lines = ["vec3 rgb = vec3(0.0);"];
if (inputs.sh1Texture) {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} >= 1) {
vec3 sh1Rgb = evaluatePackedSH1(texelFetch(${inputs.sh1Texture}, ${inputs.coord}, 0).rg, ${inputs.viewDir}, ${inputs.shMax}.x);
rgb += sh1Rgb;
@@ -1243,7 +1243,7 @@ export function evaluatePackedSH({
);
if (inputs.sh2Texture) {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} >= 2) {
vec3 sh2Rgb = evaluatePackedSH2(texelFetch(${inputs.sh2Texture}, ${inputs.coord}, 0), ${inputs.viewDir}, ${inputs.shMax}.y);
rgb += sh2Rgb;
@@ -1251,7 +1251,7 @@ export function evaluatePackedSH({
);
if (inputs.sh3Texture) {
lines.push(
- ...unindentLines(`
+ ...unindentLines(/* glsl */ `
if (${inputs.numSh} >= 3) {
vec3 sh3Rgb = evaluatePackedSH3(texelFetch(${inputs.sh3Texture}, ${inputs.coord}, 0), ${inputs.viewDir}, ${inputs.shMax}.z);
rgb += sh3Rgb;
diff --git a/src/RgbaArray.ts b/src/RgbaArray.ts
index b30feed3..32e5258f 100644
--- a/src/RgbaArray.ts
+++ b/src/RgbaArray.ts
@@ -263,7 +263,7 @@ export class RgbaArray {
export const TRgbaArray = { type: "RgbaArray" } as { type: "RgbaArray" };
-export const defineRgbaArray = unindent(`
+export const defineRgbaArray = unindent(/* glsl */ `
struct RgbaArray {
sampler2DArray texture;
int count;
@@ -283,7 +283,7 @@ export function readRgbaArray(
inputs: { rgba, index },
globals: () => [defineRgbaArray],
statements: ({ inputs, outputs }) =>
- unindentLines(`
+ unindentLines(/* glsl */ `
if ((${inputs.index} >= 0) && (${inputs.index} < ${inputs.rgba}.count)) {
${outputs.rgba} = texelFetch(${inputs.rgba}.texture, splatTexCoord(${inputs.index}), 0);
} else {
diff --git a/src/SparkPortals.ts b/src/SparkPortals.ts
index e6ea19f7..0d50e516 100644
--- a/src/SparkPortals.ts
+++ b/src/SparkPortals.ts
@@ -6,7 +6,7 @@ import { SparkRenderer, type SparkRendererOptions } from "./SparkRenderer";
* - diskRadius > 0: render "behind portal" only through the disk
* - diskRadius < 0: render "in front of portal" everywhere except behind disk
*/
-export const DISK_PORTAL_FRAGMENT_SHADER = `
+export const DISK_PORTAL_FRAGMENT_SHADER = /* glsl */ `
precision highp float;
precision highp int;
diff --git a/src/SplatAccumulator.ts b/src/SplatAccumulator.ts
index 619e3509..f84a0805 100644
--- a/src/SplatAccumulator.ts
+++ b/src/SplatAccumulator.ts
@@ -623,7 +623,7 @@ export class SplatAccumulator {
},
statements: ({ inputs, outputs }) => {
if (this.extSplats) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
int indexDiv8 = ${inputs.index} >> 3;
ivec3 coord = splatTexCoord(indexDiv8);
uvec4 packedData;
@@ -641,7 +641,7 @@ export class SplatAccumulator {
${outputs.rgba8} = uintToVec4(data);
`);
}
- return unindentLines(`
+ return unindentLines(/* glsl */ `
int indexDiv4 = ${inputs.index} >> 2;
ivec3 coord = splatTexCoord(indexDiv4);
uvec4 packedData = texelFetch(${inputs.extSplats1}, coord, 0);
diff --git a/src/SplatEdit.ts b/src/SplatEdit.ts
index ff0a4784..cc19f511 100644
--- a/src/SplatEdit.ts
+++ b/src/SplatEdit.ts
@@ -566,7 +566,7 @@ export class SplatEdits {
export const SdfArray = { type: "SdfArray" } as { type: "SdfArray" };
-export const defineSdfArray = unindent(`
+export const defineSdfArray = unindent(/* glsl */ `
struct SdfArray {
int numSdfs;
usampler2D sdfTexture;
@@ -733,7 +733,7 @@ export const defineSdfArray = unindent(`
}
`);
-export const defineEdit = unindent(`
+export const defineEdit = unindent(/* glsl */ `
const uint EDIT_FLAG_BLEND = 0xFFu;
const uint EDIT_BLEND_MULTIPLY = 0u;
const uint EDIT_BLEND_SET_RGB = 1u;
@@ -820,7 +820,7 @@ function applyGsplatRgbaDisplaceEdits(
statements: ({ inputs, outputs }) => {
const { sdfArray, numEdits, rgbaDisplaceEdits } = inputs;
const { gsplat } = outputs;
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${gsplat} = ${inputs.gsplat};
if (isGsplatActive(${gsplat}.flags)) {
for (int editIndex = 0; editIndex < ${numEdits}; ++editIndex) {
@@ -863,7 +863,7 @@ function applyCovSplatRgbaDisplaceEdits(
statements: ({ inputs, outputs }) => {
const { sdfArray, numEdits, rgbaDisplaceEdits } = inputs;
const { covsplat } = outputs;
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${covsplat} = ${inputs.covsplat};
if (isCovSplatActive(${covsplat}.flags)) {
for (int editIndex = 0; editIndex < ${numEdits}; ++editIndex) {
diff --git a/src/SplatGenerator.ts b/src/SplatGenerator.ts
index de778c7e..1c7d8b97 100644
--- a/src/SplatGenerator.ts
+++ b/src/SplatGenerator.ts
@@ -183,7 +183,7 @@ export class CovSplatTransformer {
if (!covsplat || !basis || !offset) {
return [`${outputs.covsplat}.flags = 0u;`];
}
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${outputs.covsplat}.flags = 0u;
if (isCovSplatActive(${covsplat}.flags)) {
${outputs.covsplat}.flags = ${covsplat}.flags;
diff --git a/src/SplatMesh.ts b/src/SplatMesh.ts
index bfd42c90..72722611 100644
--- a/src/SplatMesh.ts
+++ b/src/SplatMesh.ts
@@ -200,7 +200,7 @@ export class EmptySplatSource implements SplatSource {
outTypes: { gsplat: Gsplat },
globals: () => [defineGsplat],
statements: ({ outputs }) =>
- unindentLines(`
+ unindentLines(/* glsl */ `
${outputs.gsplat}.flags = 0u;
return;
`),
@@ -1218,7 +1218,7 @@ export function maybeLookupIndex(
showLodPage,
},
statements: ({ inputs, outputs }) =>
- unindentLines(`
+ unindentLines(/* glsl */ `
int index = ${inputs.index};
if (${inputs.showLodPage} < 0) {
if (index >= ${inputs.numSplats}) {
@@ -1258,7 +1258,7 @@ export function maybeInjectSplatRgba(
outTypes: { gsplat: Gsplat },
inputs: { gsplat, rgba, index, enableLod },
statements: ({ inputs, outputs }) =>
- unindentLines(`
+ unindentLines(/* glsl */ `
${outputs.gsplat} = ${inputs.gsplat};
if (!${inputs.enableLod} && (${inputs.index} >= 0) && (${inputs.index} < ${inputs.rgba}.count)) {
${outputs.gsplat}.rgba = texelFetch(${inputs.rgba}.texture, splatTexCoord(${inputs.index}), 0);
diff --git a/src/SplatPager.ts b/src/SplatPager.ts
index a64824fe..8d0ff9f8 100644
--- a/src/SplatPager.ts
+++ b/src/SplatPager.ts
@@ -666,7 +666,7 @@ export class SplatPager {
indices,
},
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
if (${inputs.index} >= ${inputs.numSplats}) {
return;
}
@@ -699,7 +699,7 @@ export class SplatPager {
},
globals: () => [dyno.defineGsplat],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
int index = ${inputs.index};
ivec3 splatCoord = pagedSplatTexCoord(index);
uvec4 packedData = texelFetch(${inputs.packedTexture}, splatCoord, 0);
@@ -788,7 +788,7 @@ export class SplatPager {
},
globals: () => [dyno.defineGsplat],
statements: ({ inputs, outputs }) =>
- dyno.unindentLines(`
+ dyno.unindentLines(/* glsl */ `
int index = ${inputs.index};
ivec3 splatCoord = ivec3(index & 255, (index >> 8) & 255, index >> 16);
uvec4 ext1 = texelFetch(${inputs.extTexture1}, splatCoord, 0);
diff --git a/src/SplatSkinning.ts b/src/SplatSkinning.ts
index 079f3910..05d340f2 100644
--- a/src/SplatSkinning.ts
+++ b/src/SplatSkinning.ts
@@ -326,7 +326,7 @@ export const GsplatSkinning = { type: "GsplatSkinning" } as {
type: "GsplatSkinning";
};
-export const defineGsplatSkinning = unindent(`
+export const defineGsplatSkinning = unindent(/* glsl */ `
struct GsplatSkinning {
int numSplats;
int numBones;
@@ -335,7 +335,7 @@ export const defineGsplatSkinning = unindent(`
};
`);
-export const defineApplyGsplatSkinning = unindent(`
+export const defineApplyGsplatSkinning = unindent(/* glsl */ `
void applyGsplatSkinning(
int numSplats, int numBones,
usampler2DArray skinTexture, sampler2D boneTexture,
@@ -411,7 +411,7 @@ function applyGsplatSkinning(
statements: ({ inputs, outputs }) => {
const { skinning } = inputs;
const { gsplat } = outputs;
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${gsplat} = ${inputs.gsplat};
if (isGsplatActive(${gsplat}.flags)) {
applyGsplatSkinning(
@@ -426,7 +426,7 @@ function applyGsplatSkinning(
return dyno.outputs.gsplat;
}
-export const defineApplyCovSplatDQSkinning = unindent(`
+export const defineApplyCovSplatDQSkinning = unindent(/* glsl */ `
void applyCovSplatDQSkinning(
int numSplats, int numBones,
usampler2DArray skinTexture, sampler2D boneTexture,
@@ -492,7 +492,7 @@ export const defineApplyCovSplatDQSkinning = unindent(`
}
`);
-export const defineApplyCovSplatLBSkinning = unindent(`
+export const defineApplyCovSplatLBSkinning = unindent(/* glsl */ `
void applyCovSplatLBSkinning(
int numSplats, int numBones,
usampler2DArray skinTexture, sampler2D boneTexture,
@@ -556,7 +556,7 @@ function applyCovSplatDQSkinning(
statements: ({ inputs, outputs }) => {
const { skinning } = inputs;
const { covsplat } = outputs;
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${covsplat} = ${inputs.covsplat};
if (isCovSplatActive(${covsplat}.flags)) {
applyCovSplatDQSkinning(
@@ -586,7 +586,7 @@ function applyCovSplatLBSkinning(
statements: ({ inputs, outputs }) => {
const { skinning } = inputs;
const { covsplat } = outputs;
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${covsplat} = ${inputs.covsplat};
if (isCovSplatActive(${covsplat}.flags)) {
applyCovSplatLBSkinning(
diff --git a/src/dyno/output.ts b/src/dyno/output.ts
index 9579e46f..78dccdb9 100644
--- a/src/dyno/output.ts
+++ b/src/dyno/output.ts
@@ -59,7 +59,7 @@ export class OutputPackedSplat extends Dyno<
statements: ({ inputs, outputs }) => {
const { gsplat, rgbMinMaxLnScaleMinMax } = inputs;
if (gsplat && rgbMinMaxLnScaleMinMax) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
if (isGsplatActive(${gsplat}.flags)) {
target = packSplatEncoding(${gsplat}.center, ${gsplat}.scales, ${gsplat}.quaternion, ${gsplat}.rgba, ${rgbMinMaxLnScaleMinMax});
} else {
@@ -91,7 +91,7 @@ export class OutputCovSplat extends Dyno<
statements: ({ inputs }) => {
const { covsplat, rgbMinMaxLnScaleMinMax } = inputs;
if (covsplat && rgbMinMaxLnScaleMinMax) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
if (isCovSplatActive(${covsplat}.flags)) {
target = packSplatCovEncoding(${covsplat}.center, ${covsplat}.rgba, ${covsplat}.xxyyzz, ${covsplat}.xyxzyz, ${rgbMinMaxLnScaleMinMax});
} else {
@@ -121,7 +121,7 @@ export class OutputExtendedSplat extends Dyno<
statements: ({ inputs }) => {
const { gsplat } = inputs;
if (gsplat) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
if (isGsplatActive(${gsplat}.flags)) {
packSplatExt(target, target2, ${gsplat}.center, ${gsplat}.scales, ${gsplat}.quaternion, ${gsplat}.rgba);
} else {
@@ -152,7 +152,7 @@ export class OutputExtCovSplat extends Dyno<
statements: ({ inputs }) => {
const { covsplat } = inputs;
if (covsplat) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
if (isCovSplatActive(${covsplat}.flags)) {
packSplatExtCov(target, target2, ${covsplat}.center, ${covsplat}.rgba, ${covsplat}.xxyyzz, ${covsplat}.xyxzyz);
} else {
@@ -199,7 +199,7 @@ class OutputSplatDepth extends Dyno<
statements: ({ inputs }) => {
const { gsplat, viewCenter, viewDir, sortRadial } = inputs;
if (gsplat && viewCenter && viewDir && sortRadial) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
float metric = 1.0 / 0.0;
if (isGsplatActive(${gsplat}.flags)) {
vec3 center = ${gsplat}.center - ${viewCenter};
@@ -251,7 +251,7 @@ class OutputCovSplatDepth extends Dyno<
statements: ({ inputs }) => {
const { covsplat, viewCenter, viewDir, sortRadial } = inputs;
if (covsplat && viewCenter && viewDir && sortRadial) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
float metric = 1.0 / 0.0;
if (isCovSplatActive(${covsplat}.flags)) {
vec3 center = ${covsplat}.center - ${viewCenter};
diff --git a/src/dyno/splats.ts b/src/dyno/splats.ts
index 31ff33b6..87f60a72 100644
--- a/src/dyno/splats.ts
+++ b/src/dyno/splats.ts
@@ -132,7 +132,7 @@ export const splatTexCoord = (index: DynoVal<"int">): DynoVal<"ivec3"> =>
export const pagedSplatTexCoord = (index: DynoVal<"int">): DynoVal<"ivec3"> =>
new PagedSplatTexCoord({ index });
-export const defineGsplat = unindent(`
+export const defineGsplat = unindent(/* glsl */ `
struct Gsplat {
vec3 center;
uint flags;
@@ -148,7 +148,7 @@ export const defineGsplat = unindent(`
}
`);
-export const defineCovSplat = unindent(`
+export const defineCovSplat = unindent(/* glsl */ `
struct CovSplat {
vec3 center;
uint flags;
@@ -163,7 +163,7 @@ export const defineCovSplat = unindent(`
}
`);
-export const definePackedSplats = unindent(`
+export const definePackedSplats = unindent(/* glsl */ `
struct PackedSplats {
usampler2DArray textureArray;
int numSplats;
@@ -187,7 +187,7 @@ export class NumPackedSplats extends UnaryOp<
}
}
-const defineReadPackedArray = unindent(`
+const defineReadPackedArray = unindent(/* glsl */ `
bool readPackedArray(usampler2DArray texture, int numSplats, vec4 rgbMinMaxLnScaleMinMax, int index, out Gsplat gsplat) {
if ((index >= 0) && (index < numSplats)) {
uvec4 packedData = texelFetch(texture, splatTexCoord(index), 0);
@@ -223,7 +223,7 @@ export class ReadPackedSplat
const { packedSplats, index } = inputs;
let statements: string[];
if (packedSplats && index) {
- statements = unindentLines(`
+ statements = unindentLines(/* glsl */ `
${gsplat}.flags = 0u;
if (readPackedArray(${packedSplats}.textureArray, ${packedSplats}.numSplats, ${packedSplats}.rgbMinMaxLnScaleMinMax, ${index}, ${gsplat})) {
if (${packedSplats}.lodOpacity) {
@@ -288,7 +288,7 @@ export class ReadPackedSplatRange
const { packedSplats, index, base, count } = inputs;
let statements: string[];
if (packedSplats && index && base && count) {
- statements = unindentLines(`
+ statements = unindentLines(/* glsl */ `
${gsplat}.flags = 0u;
if (readPackedArray(${packedSplats}.textureArray, ${packedSplats}.numSplats, ${packedSplats}.rgbMinMaxLnScaleMinMax, ${index}, ${gsplat})) {
if (${packedSplats}.lodOpacity) {
@@ -312,7 +312,7 @@ export class ReadPackedSplatRange
}
}
-export const defineExtSplats = unindent(`
+export const defineExtSplats = unindent(/* glsl */ `
struct ExtSplats {
usampler2DArray textureArray1;
usampler2DArray textureArray2;
@@ -333,7 +333,7 @@ export class NumExtSplats extends UnaryOp<
}
}
-const defineReadExtArrays = unindent(`
+const defineReadExtArrays = unindent(/* glsl */ `
void readExtArrays(usampler2DArray texture1, usampler2DArray texture2, int numSplats, int index, out Gsplat gsplat) {
gsplat.flags = 0u;
if ((index >= 0) && (index < numSplats)) {
@@ -371,7 +371,7 @@ export class ReadExtSplat
const { extSplats, index } = inputs;
let statements: string[];
if (extSplats && index) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
readExtArrays(${extSplats}.textureArray1, ${extSplats}.textureArray2, ${extSplats}.numSplats, ${index}, ${gsplat});
`);
}
@@ -398,7 +398,7 @@ export class NumCovSplats extends UnaryOp<
}
}
-const defineReadCovArrays = unindent(`
+const defineReadCovArrays = unindent(/* glsl */ `
void readCovArrays(usampler2DArray texture1, usampler2DArray texture2, int numSplats, int index, out CovSplat covsplat) {
covsplat.flags = 0u;
if ((index >= 0) && (index < numSplats)) {
@@ -436,7 +436,7 @@ export class ReadCovSplat
const { covSplats, index } = inputs;
let statements: string[];
if (covSplats && index) {
- return unindentLines(`
+ return unindentLines(/* glsl */ `
readCovArrays(${covSplats}.textureArray, ${covSplats}.numSplats, ${index}, ${covsplat});
`);
}
@@ -467,7 +467,7 @@ export class GsplatToCovSplat extends Dyno<
return [`${covsplat}.flags = 0u;`];
}
- return unindentLines(`
+ return unindentLines(/* glsl */ `
${covsplat}.flags = 0u;
if (isGsplatActive(${gsplat}.flags)) {
${covsplat}.flags = ${gsplat}.flags;
@@ -726,7 +726,7 @@ export class CombineGsplat
}
}
-export const defineGsplatNormal = unindent(`
+export const defineGsplatNormal = unindent(/* glsl */ `
vec3 gsplatNormal(vec3 scales, vec4 quaternion) {
float minScale = min(scales.x, min(scales.y, scales.z));
vec3 normal;
diff --git a/src/dyno/util.ts b/src/dyno/util.ts
index aed7f26a..3dbc0857 100644
--- a/src/dyno/util.ts
+++ b/src/dyno/util.ts
@@ -119,7 +119,7 @@ export class PcgNext
outTypes: { state: "uint" },
inputs: { state },
globals: () => [
- unindent(`
+ unindent(/* glsl */ `
uint pcg_next(uint state) {
return state * 747796405u + 2891336453u;
}
@@ -151,7 +151,7 @@ export class PcgHash
outTypes: { hash: "uint" },
inputs: { state },
globals: () => [
- unindent(`
+ unindent(/* glsl */ `
uint pcg_hash(uint state) {
uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (hash >> 22u) ^ hash;
@@ -180,7 +180,7 @@ export class PcgMix
outTypes: { state: "uint" },
inputs: { value },
globals: () => [
- unindent(`
+ unindent(/* glsl */ `
uint pcg_mix(uint value) {
return value;
}
diff --git a/src/utils.ts b/src/utils.ts
index 0e6d62f1..9c0afad8 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -934,7 +934,7 @@ export function omitUndefined(obj: T): Partial {
}
// "Identity" vertex shader that just passes through the position.
-export const IDENT_VERTEX_SHADER = unindent(`
+export const IDENT_VERTEX_SHADER = unindent(/* glsl */ `
precision highp float;
in vec3 position;