@triforge/shader-core 0.3.0 → 0.4.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/dist/bundle.js CHANGED
@@ -237,6 +237,18 @@ var ShaderNode = class {
237
237
  enumerable: true,
238
238
  configurable: true
239
239
  });
240
+ const AXES = ["x", "y", "z"];
241
+ AXES.forEach((axis, idx) => {
242
+ Object.defineProperty(this.parameters, `${paramName}.${axis}`, {
243
+ get: () => uniforms[uniformName].value[idx],
244
+ set: (v) => {
245
+ const arr = uniforms[uniformName].value;
246
+ arr[idx] = finiteOr(v, 0);
247
+ },
248
+ enumerable: true,
249
+ configurable: true
250
+ });
251
+ });
240
252
  } else {
241
253
  Object.defineProperty(this.parameters, paramName, {
242
254
  get: () => uniforms[uniformName].value,
@@ -2753,13 +2765,19 @@ var Bump = class _Bump extends ProcessNode {
2753
2765
  return "Bump";
2754
2766
  }
2755
2767
  static {
2756
- this.instanceSpecificDef = false;
2768
+ // Both modes emit their own per-instance defs (a #ifndef-guarded shared function
2769
+ // for 'derivative', a per-instance uniform declaration for 'uv-offset' — see
2770
+ // compileDefs). instanceSpecificDef:true is required so multiple 'uv-offset'
2771
+ // instances each get their own uniform decl instead of being deduped by nodeType.
2772
+ this.instanceSpecificDef = true;
2757
2773
  }
2758
2774
  get metadata() {
2759
2775
  return { label: "Bump", category: "Vector", color: "#4a3a8a", cost: "medium" };
2760
2776
  }
2761
2777
  static {
2762
- this.glslFunction = `
2778
+ this.derivativeGlslFunction = `
2779
+ #ifndef _ST_BUMP_FN
2780
+ #define _ST_BUMP_FN
2763
2781
  vec3 _st_bump(float height, float strength, float distance, vec3 N) {
2764
2782
  // Cotangent frame bump \u2014 camera-independent.
2765
2783
  // We derive world-space surface tangent T and bitangent B from the UV
@@ -2786,15 +2804,34 @@ vec3 _st_bump(float height, float strength, float distance, vec3 N) {
2786
2804
 
2787
2805
  float scale = strength * distance * 50.0;
2788
2806
  return normalize(N - T * dhdu * scale - B * dhdv * scale);
2789
- }`;
2807
+ }
2808
+ #endif`;
2790
2809
  }
2791
2810
  constructor(inputs = {}) {
2792
2811
  super("Bump");
2812
+ this._method = inputs.method ?? "derivative";
2813
+ if (this._method === "uv-offset") {
2814
+ if (ShaderConfig.errorLevel !== "off" && !inputs.uniformName) {
2815
+ ShaderNodeError.throw({
2816
+ nodeType: "Bump",
2817
+ nodeId: this.id,
2818
+ problem: 'uniformName is required when method:"uv-offset".',
2819
+ fix: 'new Bump({ method: "uv-offset", uniformName: "uHeightTex" })\n After compile(): mat.material.uniforms.uHeightTex = { value: texture }'
2820
+ });
2821
+ }
2822
+ if (inputs.uniformName) assertGlslIdentifier(inputs.uniformName, "Bump uniformName");
2823
+ this._uniformName = inputs.uniformName ?? null;
2824
+ } else {
2825
+ this._uniformName = null;
2826
+ }
2793
2827
  this._inputs = this.createInputs(inputs, {
2794
2828
  strength: ["float", inputs.strength ?? 1],
2795
2829
  distance: ["float", inputs.distance ?? 1],
2796
2830
  height: ["float", 0.5],
2797
- normal: ["color", null]
2831
+ normal: ["color", null],
2832
+ vector: ["vector", null],
2833
+ texelSize: ["float", inputs.texelSize ?? 1 / 512],
2834
+ lod: ["float", inputs.lod ?? 0]
2798
2835
  });
2799
2836
  this._outputs = this.createOutputs({ Normal: "color" });
2800
2837
  }
@@ -2805,13 +2842,60 @@ vec3 _st_bump(float height, float strength, float distance, vec3 N) {
2805
2842
  return this._outputs;
2806
2843
  }
2807
2844
  compileDefs() {
2808
- return _Bump.glslFunction;
2845
+ if (this._method === "uv-offset") {
2846
+ return [
2847
+ "#ifndef _ST_BUMP_TEXLOD_EXT",
2848
+ "#define _ST_BUMP_TEXLOD_EXT",
2849
+ "#extension GL_EXT_shader_texture_lod : enable",
2850
+ "#endif",
2851
+ `uniform sampler2D ${this._uniformName};`
2852
+ ].join("\n");
2853
+ }
2854
+ return _Bump.derivativeGlslFunction;
2809
2855
  }
2810
2856
  compileCall(ctx) {
2811
- const height = ctx.resolveInput(this._inputs.height);
2812
2857
  const strength = ctx.resolveInput(this._inputs.strength);
2813
2858
  const distance = ctx.resolveInput(this._inputs.distance);
2814
2859
  const normal = this._inputs.normal.isConnected() ? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name) : "normalize(vNormal)";
2860
+ if (this._method === "uv-offset") {
2861
+ const uv = this._inputs.vector.isConnected() ? ctx.resolveInput(this._inputs.vector) : "vUv";
2862
+ const texelSize = ctx.resolveInput(this._inputs.texelSize);
2863
+ const lod = ctx.resolveInput(this._inputs.lod);
2864
+ const id = this.id;
2865
+ const hL = `_bmp_${id}_hL`, hR = `_bmp_${id}_hR`;
2866
+ const hD = `_bmp_${id}_hD`, hU = `_bmp_${id}_hU`;
2867
+ const dPdx = `_bmp_${id}_dPdx`, dPdy = `_bmp_${id}_dPdy`;
2868
+ const dUdx = `_bmp_${id}_dUdx`, dUdy = `_bmp_${id}_dUdy`;
2869
+ const det = `_bmp_${id}_det`, sgn = `_bmp_${id}_sgn`, invDet = `_bmp_${id}_invDet`;
2870
+ const T = `_bmp_${id}_T`, B = `_bmp_${id}_B`;
2871
+ const dhdu = `_bmp_${id}_dhdu`, dhdv = `_bmp_${id}_dhdv`;
2872
+ const scale = `_bmp_${id}_scale`;
2873
+ const ts = `_bmp_${id}_ts`;
2874
+ return [
2875
+ `float ${ts} = ${texelSize};`,
2876
+ `float ${hL} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(${ts}, 0.0), ${lod}).r;`,
2877
+ `float ${hR} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(${ts}, 0.0), ${lod}).r;`,
2878
+ `float ${hD} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(0.0, ${ts}), ${lod}).r;`,
2879
+ `float ${hU} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(0.0, ${ts}), ${lod}).r;`,
2880
+ // Cotangent frame from screen-space derivatives — this builds the tangent
2881
+ // basis (surface-fixed), not the height sample, so it doesn't carry the
2882
+ // camera-distance instability the uv-offset method exists to avoid.
2883
+ `vec3 ${dPdx} = dFdx(vPosition);`,
2884
+ `vec3 ${dPdy} = dFdy(vPosition);`,
2885
+ `vec2 ${dUdx} = dFdx(vUv);`,
2886
+ `vec2 ${dUdy} = dFdy(vUv);`,
2887
+ `float ${det} = ${dUdx}.x * ${dUdy}.y - ${dUdx}.y * ${dUdy}.x;`,
2888
+ `float ${sgn} = sign(${det});`,
2889
+ `float ${invDet} = ${sgn} / max(abs(${det}), 1e-6);`,
2890
+ `vec3 ${T} = normalize((${dUdy}.y * ${dPdx} - ${dUdx}.y * ${dPdy}) * ${invDet});`,
2891
+ `vec3 ${B} = normalize(cross(${normal}, ${T})) * ${sgn};`,
2892
+ `float ${dhdu} = (${hR} - ${hL}) / max(2.0 * ${ts}, 1e-6);`,
2893
+ `float ${dhdv} = (${hU} - ${hD}) / max(2.0 * ${ts}, 1e-6);`,
2894
+ `float ${scale} = ${strength} * ${distance} * 50.0;`,
2895
+ `vec3 ${ctx.outputVar(this, "Normal")} = normalize(${normal} - ${T} * ${dhdu} * ${scale} - ${B} * ${dhdv} * ${scale});`
2896
+ ].join("\n ");
2897
+ }
2898
+ const height = ctx.resolveInput(this._inputs.height);
2815
2899
  return `vec3 ${ctx.outputVar(this, "Normal")} = _st_bump(${height}, ${strength}, ${distance}, ${normal});`;
2816
2900
  }
2817
2901
  };
@@ -4257,6 +4341,40 @@ vec3 _st_translucentBSDF(vec3 color, vec3 N) {
4257
4341
  }
4258
4342
  };
4259
4343
 
4344
+ // src/nodes/process/TransparentBSDF.ts
4345
+ var TransparentBSDF = class extends ProcessNode {
4346
+ get nodeType() {
4347
+ return "TransparentBSDF";
4348
+ }
4349
+ static {
4350
+ this.instanceSpecificDef = false;
4351
+ }
4352
+ get metadata() {
4353
+ return { label: "Transparent BSDF", category: "Shader", color: "#336699", cost: "low" };
4354
+ }
4355
+ constructor() {
4356
+ super("TransparentBSDF");
4357
+ this._inputs = this.createInputs({}, {});
4358
+ this._outputs = this.createOutputs({ BSDF: "shader" });
4359
+ }
4360
+ getInputSockets() {
4361
+ return this._inputs;
4362
+ }
4363
+ getOutputSockets() {
4364
+ return this._outputs;
4365
+ }
4366
+ compileDefs() {
4367
+ return "";
4368
+ }
4369
+ /** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
4370
+ wantsTransparency() {
4371
+ return true;
4372
+ }
4373
+ compileCall(ctx) {
4374
+ return `vec4 ${ctx.outputVar(this, "BSDF")} = vec4(0.0, 0.0, 0.0, 0.0);`;
4375
+ }
4376
+ };
4377
+
4260
4378
  // src/nodes/process/PrincipledHair.ts
4261
4379
  var PrincipledHair = class _PrincipledHair extends ProcessNode {
4262
4380
  get nodeType() {
@@ -5660,6 +5778,7 @@ export {
5660
5778
  TextureCoordinate,
5661
5779
  ToonBSDF,
5662
5780
  TranslucentBSDF,
5781
+ TransparentBSDF,
5663
5782
  UVMap,
5664
5783
  Value,
5665
5784
  VectorCurves,
@@ -1 +1 @@
1
- {"version":3,"file":"ShaderNode.d.ts","sourceRoot":"","sources":["../../src/core/ShaderNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAsBjD,6DAA6D;AAC7D,KAAK,QAAQ,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAE/C,8CAA8C;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAK,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAK,MAAM,CAAA;IAChB,IAAI,EAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,8BAAsB,UAAU;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEvC;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAK;IAElE,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAmC;IACtD,yDAAyD;IACzD,OAAO,CAAC,YAAY,CAAkC;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAA;IAC/B,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAA;IAErC,QAAQ,CAAC,eAAe,IAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAEzD;;;;;;;;;OASG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAelC;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,MAAM;IAE9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,cAAc,GAAG,MAAM;IAE/E;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,UAAQ;IAElC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAkCvC;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAQ/B;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;CAqBpE"}
1
+ {"version":3,"file":"ShaderNode.d.ts","sourceRoot":"","sources":["../../src/core/ShaderNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAsBjD,6DAA6D;AAC7D,KAAK,QAAQ,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AAE/C,8CAA8C;AAC9C,KAAK,SAAS,GAAG,UAAU,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAK,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAK,MAAM,CAAA;IAChB,IAAI,EAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,8BAAsB,UAAU;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEvC;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAK;IAElE,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAmC;IACtD,yDAAyD;IACzD,OAAO,CAAC,YAAY,CAAkC;gBAE1C,QAAQ,EAAE,MAAM;IAI5B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAA;IAC/B,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAA;IAErC,QAAQ,CAAC,eAAe,IAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAEzD;;;;;;;;;OASG;IACH,gBAAgB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAIzG;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAelC;;;OAGG;IACH,QAAQ,CAAC,WAAW,IAAI,MAAM;IAE9B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,qBAAqB,EAAE,cAAc,GAAG,MAAM;IAE/E;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,UAAQ;IAElC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,YAAY,CACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAkCvC;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;IAQ/B;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI;CAqCpE"}
@@ -151,6 +151,22 @@ export class ShaderNode {
151
151
  enumerable: true,
152
152
  configurable: true,
153
153
  });
154
+ // Per-component aliases (e.g. parameters['location.x']) for any vector-typed
155
+ // uniform parameter, so a KeyframeTrack can animate a single axis. Reads/writes
156
+ // go through the same uniforms[uniformName].value array as the whole-vector
157
+ // getter/setter above, so both access styles stay in sync automatically.
158
+ const AXES = ['x', 'y', 'z'];
159
+ AXES.forEach((axis, idx) => {
160
+ Object.defineProperty(this.parameters, `${paramName}.${axis}`, {
161
+ get: () => uniforms[uniformName].value[idx],
162
+ set: (v) => {
163
+ const arr = uniforms[uniformName].value;
164
+ arr[idx] = finiteOr(v, 0);
165
+ },
166
+ enumerable: true,
167
+ configurable: true,
168
+ });
169
+ });
154
170
  }
155
171
  else {
156
172
  Object.defineProperty(this.parameters, paramName, {
package/dist/index.d.ts CHANGED
@@ -83,6 +83,7 @@ export { SubsurfaceScattering } from './nodes/process/SubsurfaceScattering.js';
83
83
  export { ToonBSDF } from './nodes/process/ToonBSDF.js';
84
84
  export { SpecularBSDF } from './nodes/process/SpecularBSDF.js';
85
85
  export { TranslucentBSDF } from './nodes/process/TranslucentBSDF.js';
86
+ export { TransparentBSDF } from './nodes/process/TransparentBSDF.js';
86
87
  export { PrincipledHair } from './nodes/process/PrincipledHair.js';
87
88
  export { Math as ShaderMath } from './nodes/process/Math.js';
88
89
  export { Clamp } from './nodes/process/Clamp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -88,6 +88,7 @@ export { SubsurfaceScattering } from './nodes/process/SubsurfaceScattering.js';
88
88
  export { ToonBSDF } from './nodes/process/ToonBSDF.js';
89
89
  export { SpecularBSDF } from './nodes/process/SpecularBSDF.js';
90
90
  export { TranslucentBSDF } from './nodes/process/TranslucentBSDF.js';
91
+ export { TransparentBSDF } from './nodes/process/TransparentBSDF.js';
91
92
  export { PrincipledHair } from './nodes/process/PrincipledHair.js';
92
93
  // ── Process nodes — Converter ─────────────────────────────────────────────────
93
94
  export { Math as ShaderMath } from './nodes/process/Math.js';
@@ -30,7 +30,7 @@ export class AddShader extends ProcessNode {
30
30
  }
31
31
  }
32
32
  AddShader.instanceSpecificDef = false;
33
- AddShader.glslFunction = `
34
- vec4 _st_addShader(vec4 a, vec4 b) {
35
- return vec4(a.rgb + b.rgb, max(a.a, b.a));
33
+ AddShader.glslFunction = `
34
+ vec4 _st_addShader(vec4 a, vec4 b) {
35
+ return vec4(a.rgb + b.rgb, max(a.a, b.a));
36
36
  }`;
@@ -7,19 +7,42 @@ export interface BumpInputs {
7
7
  distance?: OutputSocket | number;
8
8
  height?: OutputSocket;
9
9
  normal?: OutputSocket;
10
+ /**
11
+ * 'derivative' (default) — height gradient via dFdx/dFdy of the `height` input.
12
+ * Screen-space, camera/rasterization-dependent: stable for procedural/vertex-fed
13
+ * height but can speckle or seam-flicker across a wide camera-distance range when
14
+ * `height` comes from a sampled texture.
15
+ *
16
+ * 'uv-offset' — explicit texelSize-offset samples of a height texture at a fixed
17
+ * LOD, independent of screen-space derivatives. Stable under camera motion for
18
+ * texture-driven relief (e.g. planetary crater/regolith maps). Requires `uniformName`.
19
+ */
20
+ method?: 'derivative' | 'uv-offset';
21
+ /** Required when method:'uv-offset'. Name of the sampler2D height-map uniform. */
22
+ uniformName?: string;
23
+ /** UV to sample at, when method:'uv-offset'. Defaults to the surface UV (vUv). */
24
+ vector?: OutputSocket;
25
+ /** Texel size (1 / texture resolution) for the uv-offset samples. Default 1/512. */
26
+ texelSize?: OutputSocket | number;
27
+ /** Explicit mip/LOD level for the uv-offset samples. Default 0. */
28
+ lod?: OutputSocket | number;
10
29
  }
11
30
  /**
12
31
  * Bump — Blender "Bump" node equivalent.
13
- * Converts a height map into a perturbed surface normal using screen-space derivatives.
32
+ * Converts a height map into a perturbed surface normal.
14
33
  *
15
34
  * Inputs: strength [0-1], distance, height (float), normal (optional override)
35
+ * method ('derivative' | 'uv-offset'), uniformName/vector/texelSize/lod
36
+ * (uv-offset mode only)
16
37
  * Outputs: Normal (color/vec3)
17
38
  */
18
39
  export declare class Bump extends ProcessNode {
19
40
  get nodeType(): string;
20
41
  static instanceSpecificDef: boolean;
21
42
  get metadata(): NodeMetadata;
22
- static glslFunction: string;
43
+ static derivativeGlslFunction: string;
44
+ private readonly _method;
45
+ private readonly _uniformName;
23
46
  private readonly _inputs;
24
47
  private readonly _outputs;
25
48
  constructor(inputs?: BumpInputs);
@@ -1 +1 @@
1
- {"version":3,"file":"Bump.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Bump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB,MAAM,CAAC,EAAI,YAAY,CAAA;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,IAAK,SAAQ,WAAW;IACnC,IAAI,QAAQ,WAAoB;IAChC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SA2BnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,UAAe;IAWnC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CASzC"}
1
+ {"version":3,"file":"Bump.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Bump.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAIvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAChC,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAO,YAAY,GAAG,WAAW,CAAA;IACxC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,MAAM,CAAC,EAAO,YAAY,CAAA;IAC1B,oFAAoF;IACpF,SAAS,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;IACnC,mEAAmE;IACnE,GAAG,CAAC,EAAU,YAAY,GAAG,MAAM,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,qBAAa,IAAK,SAAQ,WAAW;IACnC,IAAI,QAAQ,WAAoB;IAKhC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,sBAAsB,SA8BxB;IAEL,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,UAAe;IA+BnC,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAarB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAkDzC"}
@@ -1,9 +1,14 @@
1
1
  import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import { ShaderNodeError } from '../../core/ShaderNodeError.js';
3
+ import { ShaderConfig } from '../../core/ShaderConfig.js';
4
+ import { assertGlslIdentifier } from '../../core/glslIdentifier.js';
2
5
  /**
3
6
  * Bump — Blender "Bump" node equivalent.
4
- * Converts a height map into a perturbed surface normal using screen-space derivatives.
7
+ * Converts a height map into a perturbed surface normal.
5
8
  *
6
9
  * Inputs: strength [0-1], distance, height (float), normal (optional override)
10
+ * method ('derivative' | 'uv-offset'), uniformName/vector/texelSize/lod
11
+ * (uv-offset mode only)
7
12
  * Outputs: Normal (color/vec3)
8
13
  */
9
14
  export class Bump extends ProcessNode {
@@ -13,53 +18,129 @@ export class Bump extends ProcessNode {
13
18
  }
14
19
  constructor(inputs = {}) {
15
20
  super('Bump');
21
+ this._method = inputs.method ?? 'derivative';
22
+ if (this._method === 'uv-offset') {
23
+ if (ShaderConfig.errorLevel !== 'off' && !inputs.uniformName) {
24
+ ShaderNodeError.throw({
25
+ nodeType: 'Bump',
26
+ nodeId: this.id,
27
+ problem: 'uniformName is required when method:"uv-offset".',
28
+ fix: 'new Bump({ method: "uv-offset", uniformName: "uHeightTex" })\n After compile(): mat.material.uniforms.uHeightTex = { value: texture }',
29
+ });
30
+ }
31
+ if (inputs.uniformName)
32
+ assertGlslIdentifier(inputs.uniformName, 'Bump uniformName');
33
+ this._uniformName = inputs.uniformName ?? null;
34
+ }
35
+ else {
36
+ this._uniformName = null;
37
+ }
16
38
  this._inputs = this.createInputs(inputs, {
17
39
  strength: ['float', inputs.strength ?? 1.0],
18
40
  distance: ['float', inputs.distance ?? 1.0],
19
41
  height: ['float', 0.5],
20
42
  normal: ['color', null],
43
+ vector: ['vector', null],
44
+ texelSize: ['float', inputs.texelSize ?? 1 / 512],
45
+ lod: ['float', inputs.lod ?? 0.0],
21
46
  });
22
47
  this._outputs = this.createOutputs({ Normal: 'color' });
23
48
  }
24
49
  getInputSockets() { return this._inputs; }
25
50
  getOutputSockets() { return this._outputs; }
26
- compileDefs() { return Bump.glslFunction; }
51
+ compileDefs() {
52
+ if (this._method === 'uv-offset') {
53
+ return [
54
+ '#ifndef _ST_BUMP_TEXLOD_EXT',
55
+ '#define _ST_BUMP_TEXLOD_EXT',
56
+ '#extension GL_EXT_shader_texture_lod : enable',
57
+ '#endif',
58
+ `uniform sampler2D ${this._uniformName};`,
59
+ ].join('\n');
60
+ }
61
+ return Bump.derivativeGlslFunction;
62
+ }
27
63
  compileCall(ctx) {
28
- const height = ctx.resolveInput(this._inputs.height);
29
64
  const strength = ctx.resolveInput(this._inputs.strength);
30
65
  const distance = ctx.resolveInput(this._inputs.distance);
31
66
  const normal = this._inputs.normal.isConnected()
32
67
  ? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name)
33
68
  : 'normalize(vNormal)';
69
+ if (this._method === 'uv-offset') {
70
+ const uv = this._inputs.vector.isConnected() ? ctx.resolveInput(this._inputs.vector) : 'vUv';
71
+ const texelSize = ctx.resolveInput(this._inputs.texelSize);
72
+ const lod = ctx.resolveInput(this._inputs.lod);
73
+ const id = this.id;
74
+ const hL = `_bmp_${id}_hL`, hR = `_bmp_${id}_hR`;
75
+ const hD = `_bmp_${id}_hD`, hU = `_bmp_${id}_hU`;
76
+ const dPdx = `_bmp_${id}_dPdx`, dPdy = `_bmp_${id}_dPdy`;
77
+ const dUdx = `_bmp_${id}_dUdx`, dUdy = `_bmp_${id}_dUdy`;
78
+ const det = `_bmp_${id}_det`, sgn = `_bmp_${id}_sgn`, invDet = `_bmp_${id}_invDet`;
79
+ const T = `_bmp_${id}_T`, B = `_bmp_${id}_B`;
80
+ const dhdu = `_bmp_${id}_dhdu`, dhdv = `_bmp_${id}_dhdv`;
81
+ const scale = `_bmp_${id}_scale`;
82
+ const ts = `_bmp_${id}_ts`;
83
+ return [
84
+ `float ${ts} = ${texelSize};`,
85
+ `float ${hL} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(${ts}, 0.0), ${lod}).r;`,
86
+ `float ${hR} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(${ts}, 0.0), ${lod}).r;`,
87
+ `float ${hD} = texture2DLodEXT(${this._uniformName}, ${uv} - vec2(0.0, ${ts}), ${lod}).r;`,
88
+ `float ${hU} = texture2DLodEXT(${this._uniformName}, ${uv} + vec2(0.0, ${ts}), ${lod}).r;`,
89
+ // Cotangent frame from screen-space derivatives — this builds the tangent
90
+ // basis (surface-fixed), not the height sample, so it doesn't carry the
91
+ // camera-distance instability the uv-offset method exists to avoid.
92
+ `vec3 ${dPdx} = dFdx(vPosition);`,
93
+ `vec3 ${dPdy} = dFdy(vPosition);`,
94
+ `vec2 ${dUdx} = dFdx(vUv);`,
95
+ `vec2 ${dUdy} = dFdy(vUv);`,
96
+ `float ${det} = ${dUdx}.x * ${dUdy}.y - ${dUdx}.y * ${dUdy}.x;`,
97
+ `float ${sgn} = sign(${det});`,
98
+ `float ${invDet} = ${sgn} / max(abs(${det}), 1e-6);`,
99
+ `vec3 ${T} = normalize((${dUdy}.y * ${dPdx} - ${dUdx}.y * ${dPdy}) * ${invDet});`,
100
+ `vec3 ${B} = normalize(cross(${normal}, ${T})) * ${sgn};`,
101
+ `float ${dhdu} = (${hR} - ${hL}) / max(2.0 * ${ts}, 1e-6);`,
102
+ `float ${dhdv} = (${hU} - ${hD}) / max(2.0 * ${ts}, 1e-6);`,
103
+ `float ${scale} = ${strength} * ${distance} * 50.0;`,
104
+ `vec3 ${ctx.outputVar(this, 'Normal')} = normalize(${normal} - ${T} * ${dhdu} * ${scale} - ${B} * ${dhdv} * ${scale});`,
105
+ ].join('\n ');
106
+ }
107
+ const height = ctx.resolveInput(this._inputs.height);
34
108
  return `vec3 ${ctx.outputVar(this, 'Normal')} = _st_bump(${height}, ${strength}, ${distance}, ${normal});`;
35
109
  }
36
110
  }
37
- Bump.instanceSpecificDef = false;
38
- Bump.glslFunction = `
39
- vec3 _st_bump(float height, float strength, float distance, vec3 N) {
40
- // Cotangent frame bump — camera-independent.
41
- // We derive world-space surface tangent T and bitangent B from the UV
42
- // parameterisation (cotangent frame). This gives vectors that are fixed
43
- // to the surface regardless of camera orientation.
44
- // Then we express the height gradient in UV space (dh/du, dh/dv) which
45
- // is also surface-fixed, eliminating the screen-space dependency.
46
- vec3 dPdx = dFdx(vPosition);
47
- vec3 dPdy = dFdy(vPosition);
48
- vec2 dUdx = dFdx(vUv);
49
- vec2 dUdy = dFdy(vUv);
50
-
51
- float det = dUdx.x * dUdy.y - dUdx.y * dUdy.x;
52
- float sgn = sign(det);
53
- float invDet = sgn / max(abs(det), 1e-6);
54
-
55
- // World-space tangent and bitangent from UV Jacobian (camera-independent)
56
- vec3 T = normalize((dUdy.y * dPdx - dUdx.y * dPdy) * invDet);
57
- vec3 B = normalize(cross(N, T)) * sgn;
58
-
59
- // Height gradient in UV space (camera-independent)
60
- float dhdu = (dUdy.y * dFdx(height) - dUdx.y * dFdy(height)) * invDet;
61
- float dhdv = (dUdx.x * dFdy(height) - dUdy.x * dFdx(height)) * invDet;
62
-
63
- float scale = strength * distance * 50.0;
64
- return normalize(N - T * dhdu * scale - B * dhdv * scale);
65
- }`;
111
+ // Both modes emit their own per-instance defs (a #ifndef-guarded shared function
112
+ // for 'derivative', a per-instance uniform declaration for 'uv-offset' — see
113
+ // compileDefs). instanceSpecificDef:true is required so multiple 'uv-offset'
114
+ // instances each get their own uniform decl instead of being deduped by nodeType.
115
+ Bump.instanceSpecificDef = true;
116
+ Bump.derivativeGlslFunction = `
117
+ #ifndef _ST_BUMP_FN
118
+ #define _ST_BUMP_FN
119
+ vec3 _st_bump(float height, float strength, float distance, vec3 N) {
120
+ // Cotangent frame bump — camera-independent.
121
+ // We derive world-space surface tangent T and bitangent B from the UV
122
+ // parameterisation (cotangent frame). This gives vectors that are fixed
123
+ // to the surface regardless of camera orientation.
124
+ // Then we express the height gradient in UV space (dh/du, dh/dv) which
125
+ // is also surface-fixed, eliminating the screen-space dependency.
126
+ vec3 dPdx = dFdx(vPosition);
127
+ vec3 dPdy = dFdy(vPosition);
128
+ vec2 dUdx = dFdx(vUv);
129
+ vec2 dUdy = dFdy(vUv);
130
+
131
+ float det = dUdx.x * dUdy.y - dUdx.y * dUdy.x;
132
+ float sgn = sign(det);
133
+ float invDet = sgn / max(abs(det), 1e-6);
134
+
135
+ // World-space tangent and bitangent from UV Jacobian (camera-independent)
136
+ vec3 T = normalize((dUdy.y * dPdx - dUdx.y * dPdy) * invDet);
137
+ vec3 B = normalize(cross(N, T)) * sgn;
138
+
139
+ // Height gradient in UV space (camera-independent)
140
+ float dhdu = (dUdy.y * dFdx(height) - dUdx.y * dFdy(height)) * invDet;
141
+ float dhdv = (dUdx.x * dFdy(height) - dUdy.x * dFdx(height)) * invDet;
142
+
143
+ float scale = strength * distance * 50.0;
144
+ return normalize(N - T * dhdu * scale - B * dhdv * scale);
145
+ }
146
+ #endif`;
@@ -33,11 +33,11 @@ export class DiffuseBSDF extends ProcessNode {
33
33
  }
34
34
  }
35
35
  DiffuseBSDF.instanceSpecificDef = false;
36
- DiffuseBSDF.glslFunction = `
37
- vec3 _st_diffuseBSDF(vec3 color, float roughness, vec3 N) {
38
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
39
- float NdotL = max(dot(N, L), 0.0);
40
- float diffuse = NdotL / 3.14159265;
41
- vec3 ambient = color * 0.15;
42
- return ambient + color * (diffuse * (1.0 - roughness * 0.5));
36
+ DiffuseBSDF.glslFunction = `
37
+ vec3 _st_diffuseBSDF(vec3 color, float roughness, vec3 N) {
38
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
39
+ float NdotL = max(dot(N, L), 0.0);
40
+ float diffuse = NdotL / 3.14159265;
41
+ vec3 ambient = color * 0.15;
42
+ return ambient + color * (diffuse * (1.0 - roughness * 0.5));
43
43
  }`;
@@ -30,7 +30,7 @@ export class Emission extends ProcessNode {
30
30
  }
31
31
  }
32
32
  Emission.instanceSpecificDef = false;
33
- Emission.glslFunction = `
34
- vec3 _st_emission(vec3 color, float strength) {
35
- return color * strength;
33
+ Emission.glslFunction = `
34
+ vec3 _st_emission(vec3 color, float strength) {
35
+ return color * strength;
36
36
  }`;
@@ -35,17 +35,17 @@ export class GlassBSDF extends ProcessNode {
35
35
  }
36
36
  }
37
37
  GlassBSDF.instanceSpecificDef = false;
38
- GlassBSDF.glslFunction = `
39
- vec3 _st_glassBSDF(vec3 color, float roughness, float ior, vec3 N) {
40
- vec3 V = normalize(cameraPosition - vPosition);
41
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
- vec3 H = normalize(L + V);
43
- float F0 = pow((1.0 - ior) / (1.0 + ior), 2.0);
44
- float fresnel = F0 + (1.0 - F0) * pow(1.0 - max(dot(V, N), 0.0), 5.0);
45
- float NdotH = max(dot(N, H), 0.0);
46
- float a2 = roughness * roughness * roughness * roughness;
47
- float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
48
- vec3 spec = vec3(1.0) * D * fresnel;
49
- vec3 refr = color * (1.0 - fresnel) * (1.0 - roughness * 0.3);
50
- return spec + refr;
38
+ GlassBSDF.glslFunction = `
39
+ vec3 _st_glassBSDF(vec3 color, float roughness, float ior, vec3 N) {
40
+ vec3 V = normalize(cameraPosition - vPosition);
41
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
+ vec3 H = normalize(L + V);
43
+ float F0 = pow((1.0 - ior) / (1.0 + ior), 2.0);
44
+ float fresnel = F0 + (1.0 - F0) * pow(1.0 - max(dot(V, N), 0.0), 5.0);
45
+ float NdotH = max(dot(N, H), 0.0);
46
+ float a2 = roughness * roughness * roughness * roughness;
47
+ float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
48
+ vec3 spec = vec3(1.0) * D * fresnel;
49
+ vec3 refr = color * (1.0 - fresnel) * (1.0 - roughness * 0.3);
50
+ return spec + refr;
51
51
  }`;
@@ -33,18 +33,18 @@ export class GlossyBSDF extends ProcessNode {
33
33
  }
34
34
  }
35
35
  GlossyBSDF.instanceSpecificDef = false;
36
- GlossyBSDF.glslFunction = `
37
- vec3 _st_glossyBSDF(vec3 color, float roughness, vec3 N) {
38
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
39
- vec3 V = normalize(cameraPosition - vPosition);
40
- vec3 H = normalize(L + V);
41
- float a = roughness * roughness;
42
- float a2 = a * a;
43
- float NdotH = max(dot(N, H), 0.0);
44
- float D = a2 / max(3.14159265 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
45
- float NdotL = max(dot(N, L), 0.0);
46
- float NdotV = max(dot(N, V), 0.0001);
47
- float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
48
- float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
49
- return color * D * G / max(4.0 * NdotL * NdotV, 0.0001) * NdotL;
36
+ GlossyBSDF.glslFunction = `
37
+ vec3 _st_glossyBSDF(vec3 color, float roughness, vec3 N) {
38
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
39
+ vec3 V = normalize(cameraPosition - vPosition);
40
+ vec3 H = normalize(L + V);
41
+ float a = roughness * roughness;
42
+ float a2 = a * a;
43
+ float NdotH = max(dot(N, H), 0.0);
44
+ float D = a2 / max(3.14159265 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
45
+ float NdotL = max(dot(N, L), 0.0);
46
+ float NdotV = max(dot(N, V), 0.0001);
47
+ float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
48
+ float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
49
+ return color * D * G / max(4.0 * NdotL * NdotV, 0.0001) * NdotL;
50
50
  }`;
@@ -41,7 +41,7 @@ export class MixShader extends ProcessNode {
41
41
  }
42
42
  }
43
43
  MixShader.instanceSpecificDef = false;
44
- MixShader.glslFunction = `
45
- vec4 _st_mixShader(float fac, vec4 a, vec4 b) {
46
- return mix(a, b, clamp(fac, 0.0, 1.0));
44
+ MixShader.glslFunction = `
45
+ vec4 _st_mixShader(float fac, vec4 a, vec4 b) {
46
+ return mix(a, b, clamp(fac, 0.0, 1.0));
47
47
  }`;
@@ -48,43 +48,43 @@ export class PrincipledBSDF extends ProcessNode {
48
48
  }
49
49
  }
50
50
  PrincipledBSDF.instanceSpecificDef = false;
51
- PrincipledBSDF.glslFunction = `
52
- // Set these on material.uniforms after compile()
53
- #ifndef _ST_HAIR_LIGHT_UNIFORMS
54
- #define _ST_HAIR_LIGHT_UNIFORMS
55
- uniform vec3 uSunDirection;
56
- uniform vec3 uSunColor;
57
- uniform vec3 uAmbientColor;
58
- #endif
59
-
60
- vec3 _st_schlick(vec3 F0, float c) {
61
- return F0 + (1.0 - F0) * pow(clamp(1.0 - c, 0.0, 1.0), 5.0);
62
- }
63
- float _st_ggx(float NdotH, float r) {
64
- float a = r * r, a2 = a * a;
65
- float d = (NdotH * NdotH) * (a2 - 1.0) + 1.0;
66
- return a2 / max(3.14159 * d * d, 1e-7);
67
- }
68
- float _st_geo(float NdotX, float r) {
69
- float k = (r + 1.0) * (r + 1.0) / 8.0;
70
- return NdotX / max(NdotX * (1.0 - k) + k, 1e-7);
71
- }
72
- vec3 _st_principledBSDF(vec3 base, float metallic, float roughness, float ior, vec3 N) {
73
- vec3 V = normalize(cameraPosition - vPosition);
74
- vec3 L = normalize(uSunDirection);
75
- vec3 H = normalize(L + V);
76
- float r = max(roughness, 0.04);
77
- float NdotL = max(dot(N, L), 0.0);
78
- float NdotV = max(dot(N, V), 1e-4);
79
- float NdotH = max(dot(N, H), 0.0);
80
- float HdotV = max(dot(H, V), 0.0);
81
- float f0s = pow((1.0 - ior) / (1.0 + ior), 2.0);
82
- vec3 F0 = mix(vec3(f0s), base, metallic);
83
- vec3 F = _st_schlick(F0, HdotV);
84
- float D = _st_ggx(NdotH, r);
85
- float G = _st_geo(NdotL, r) * _st_geo(NdotV, r);
86
- vec3 spec = (D * G * F) / max(4.0 * NdotV * NdotL, 1e-7);
87
- vec3 kD = (1.0 - F) * (1.0 - metallic);
88
- vec3 ambient = uAmbientColor * base;
89
- return ambient + (kD * base / 3.14159 + spec * uSunColor) * NdotL;
51
+ PrincipledBSDF.glslFunction = `
52
+ // Set these on material.uniforms after compile()
53
+ #ifndef _ST_HAIR_LIGHT_UNIFORMS
54
+ #define _ST_HAIR_LIGHT_UNIFORMS
55
+ uniform vec3 uSunDirection;
56
+ uniform vec3 uSunColor;
57
+ uniform vec3 uAmbientColor;
58
+ #endif
59
+
60
+ vec3 _st_schlick(vec3 F0, float c) {
61
+ return F0 + (1.0 - F0) * pow(clamp(1.0 - c, 0.0, 1.0), 5.0);
62
+ }
63
+ float _st_ggx(float NdotH, float r) {
64
+ float a = r * r, a2 = a * a;
65
+ float d = (NdotH * NdotH) * (a2 - 1.0) + 1.0;
66
+ return a2 / max(3.14159 * d * d, 1e-7);
67
+ }
68
+ float _st_geo(float NdotX, float r) {
69
+ float k = (r + 1.0) * (r + 1.0) / 8.0;
70
+ return NdotX / max(NdotX * (1.0 - k) + k, 1e-7);
71
+ }
72
+ vec3 _st_principledBSDF(vec3 base, float metallic, float roughness, float ior, vec3 N) {
73
+ vec3 V = normalize(cameraPosition - vPosition);
74
+ vec3 L = normalize(uSunDirection);
75
+ vec3 H = normalize(L + V);
76
+ float r = max(roughness, 0.04);
77
+ float NdotL = max(dot(N, L), 0.0);
78
+ float NdotV = max(dot(N, V), 1e-4);
79
+ float NdotH = max(dot(N, H), 0.0);
80
+ float HdotV = max(dot(H, V), 0.0);
81
+ float f0s = pow((1.0 - ior) / (1.0 + ior), 2.0);
82
+ vec3 F0 = mix(vec3(f0s), base, metallic);
83
+ vec3 F = _st_schlick(F0, HdotV);
84
+ float D = _st_ggx(NdotH, r);
85
+ float G = _st_geo(NdotL, r) * _st_geo(NdotV, r);
86
+ vec3 spec = (D * G * F) / max(4.0 * NdotV * NdotL, 1e-7);
87
+ vec3 kD = (1.0 - F) * (1.0 - metallic);
88
+ vec3 ambient = uAmbientColor * base;
89
+ return ambient + (kD * base / 3.14159 + spec * uSunColor) * NdotL;
90
90
  }`;
@@ -64,74 +64,74 @@ export class PrincipledHair extends ProcessNode {
64
64
  }
65
65
  PrincipledHair.instanceSpecificDef = false;
66
66
  // Light uniforms guarded by a #define so they survive alongside PrincipledBSDF in the same graph.
67
- PrincipledHair.glslFunction = `
68
- #ifndef _ST_HAIR_LIGHT_UNIFORMS
69
- #define _ST_HAIR_LIGHT_UNIFORMS
70
- uniform vec3 uSunDirection;
71
- uniform vec3 uSunColor;
72
- uniform vec3 uAmbientColor;
73
- #endif
74
-
75
- float _st_hairHash(float n) {
76
- return fract(sin(n * 127.1 + 311.7) * 43758.5453);
77
- }
78
-
79
- // Kajiya-Kay dual-lobe hair BSDF.
80
- // T = strand tangent (unit, world space)
81
- // R = primary specular exponent = 1 / (roughness^2)
82
- // R2 = secondary specular exponent = 1 / (radialRoughness^2)
83
- vec3 _st_principledHair(
84
- vec3 color,
85
- float roughness,
86
- float radialRoughness,
87
- float coat,
88
- float ior,
89
- float offset,
90
- float randomColor,
91
- float randomRoughness,
92
- float rnd,
93
- vec3 T
94
- ) {
95
- // Per-strand variation
96
- float rc = _st_hairHash(rnd * 1.3731 + 0.1);
97
- float rr = _st_hairHash(rnd * 2.7183 + 0.2);
98
- color = mix(color, color * (0.6 + 0.8 * rc), randomColor);
99
- roughness = clamp(roughness + (rr - 0.5) * randomRoughness * 0.5, 0.02, 1.0);
100
-
101
- vec3 V = normalize(cameraPosition - vPosition);
102
- vec3 L = normalize(uSunDirection);
103
- vec3 H = normalize(L + V);
104
- vec3 N = normalize(vNormal);
105
-
106
- // Kajiya-Kay diffuse: sin(angle T, L)
107
- float cosT = dot(T, L);
108
- float sinT = sqrt(max(1.0 - cosT * cosT, 0.0));
109
- float diff = sinT * max(dot(N, L) * 0.5 + 0.5, 0.0); // wrap diffuse
110
-
111
- // R lobe — primary specular, shifted by +offset along normal
112
- float f0 = pow(clamp((1.0 - ior) / (1.0 + ior), 0.0, 1.0), 2.0);
113
- vec3 T1 = normalize(T + offset * N);
114
- float cosTH1 = dot(T1, H);
115
- float sinTH1 = sqrt(max(1.0 - cosTH1 * cosTH1, 0.0));
116
- float exp1 = max(1.0 / max(roughness * roughness, 0.001), 1.0);
117
- float spec1 = pow(sinTH1, exp1);
118
- vec3 F1 = vec3(f0) + (vec3(1.0) - vec3(f0)) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
119
-
120
- // TRT lobe — secondary specular, shifted by -2*offset, colored
121
- vec3 T2 = normalize(T - 2.0 * offset * N);
122
- float cosTH2 = dot(T2, H);
123
- float sinTH2 = sqrt(max(1.0 - cosTH2 * cosTH2, 0.0));
124
- float rr2 = clamp(radialRoughness, 0.02, 1.0);
125
- float exp2 = max(1.0 / max(rr2 * rr2, 0.001), 1.0);
126
- float spec2 = pow(sinTH2, exp2) * 0.25;
127
-
128
- // Coat gloss
129
- float cosTHc = dot(T, H);
130
- float sinTHc = sqrt(max(1.0 - cosTHc * cosTHc, 0.0));
131
- float coatSpec = pow(sinTHc, 128.0) * coat;
132
-
133
- vec3 diffuse = color * (uSunColor * diff + uAmbientColor);
134
- vec3 specular = uSunColor * (F1 * spec1 + vec3(coatSpec)) + color * uSunColor * spec2;
135
-
136
- return diffuse + specular;
67
+ PrincipledHair.glslFunction = `
68
+ #ifndef _ST_HAIR_LIGHT_UNIFORMS
69
+ #define _ST_HAIR_LIGHT_UNIFORMS
70
+ uniform vec3 uSunDirection;
71
+ uniform vec3 uSunColor;
72
+ uniform vec3 uAmbientColor;
73
+ #endif
74
+
75
+ float _st_hairHash(float n) {
76
+ return fract(sin(n * 127.1 + 311.7) * 43758.5453);
77
+ }
78
+
79
+ // Kajiya-Kay dual-lobe hair BSDF.
80
+ // T = strand tangent (unit, world space)
81
+ // R = primary specular exponent = 1 / (roughness^2)
82
+ // R2 = secondary specular exponent = 1 / (radialRoughness^2)
83
+ vec3 _st_principledHair(
84
+ vec3 color,
85
+ float roughness,
86
+ float radialRoughness,
87
+ float coat,
88
+ float ior,
89
+ float offset,
90
+ float randomColor,
91
+ float randomRoughness,
92
+ float rnd,
93
+ vec3 T
94
+ ) {
95
+ // Per-strand variation
96
+ float rc = _st_hairHash(rnd * 1.3731 + 0.1);
97
+ float rr = _st_hairHash(rnd * 2.7183 + 0.2);
98
+ color = mix(color, color * (0.6 + 0.8 * rc), randomColor);
99
+ roughness = clamp(roughness + (rr - 0.5) * randomRoughness * 0.5, 0.02, 1.0);
100
+
101
+ vec3 V = normalize(cameraPosition - vPosition);
102
+ vec3 L = normalize(uSunDirection);
103
+ vec3 H = normalize(L + V);
104
+ vec3 N = normalize(vNormal);
105
+
106
+ // Kajiya-Kay diffuse: sin(angle T, L)
107
+ float cosT = dot(T, L);
108
+ float sinT = sqrt(max(1.0 - cosT * cosT, 0.0));
109
+ float diff = sinT * max(dot(N, L) * 0.5 + 0.5, 0.0); // wrap diffuse
110
+
111
+ // R lobe — primary specular, shifted by +offset along normal
112
+ float f0 = pow(clamp((1.0 - ior) / (1.0 + ior), 0.0, 1.0), 2.0);
113
+ vec3 T1 = normalize(T + offset * N);
114
+ float cosTH1 = dot(T1, H);
115
+ float sinTH1 = sqrt(max(1.0 - cosTH1 * cosTH1, 0.0));
116
+ float exp1 = max(1.0 / max(roughness * roughness, 0.001), 1.0);
117
+ float spec1 = pow(sinTH1, exp1);
118
+ vec3 F1 = vec3(f0) + (vec3(1.0) - vec3(f0)) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
119
+
120
+ // TRT lobe — secondary specular, shifted by -2*offset, colored
121
+ vec3 T2 = normalize(T - 2.0 * offset * N);
122
+ float cosTH2 = dot(T2, H);
123
+ float sinTH2 = sqrt(max(1.0 - cosTH2 * cosTH2, 0.0));
124
+ float rr2 = clamp(radialRoughness, 0.02, 1.0);
125
+ float exp2 = max(1.0 / max(rr2 * rr2, 0.001), 1.0);
126
+ float spec2 = pow(sinTH2, exp2) * 0.25;
127
+
128
+ // Coat gloss
129
+ float cosTHc = dot(T, H);
130
+ float sinTHc = sqrt(max(1.0 - cosTHc * cosTHc, 0.0));
131
+ float coatSpec = pow(sinTHc, 128.0) * coat;
132
+
133
+ vec3 diffuse = color * (uSunColor * diff + uAmbientColor);
134
+ vec3 specular = uSunColor * (F1 * spec1 + vec3(coatSpec)) + color * uSunColor * spec2;
135
+
136
+ return diffuse + specular;
137
137
  }`;
@@ -43,25 +43,25 @@ export class PrincipledVolume extends ProcessNode {
43
43
  }
44
44
  }
45
45
  PrincipledVolume.instanceSpecificDef = false;
46
- PrincipledVolume.glslFunction = `
47
- vec3 _st_principledVolume(
48
- vec3 scatterColor, float density,
49
- float anisotropy, vec3 absorptionColor,
50
- vec3 emissionColor, float emissionStrength,
51
- float blackbodyIntensity, float temperature
52
- ) {
53
- float g = clamp(anisotropy, -0.9999, 0.9999);
54
- float g2 = g * g;
55
- float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
56
-
57
- vec3 scatter = scatterColor * density * phase;
58
- vec3 absorption = absorptionColor * density;
59
- vec3 emission = emissionColor * emissionStrength;
60
-
61
- // Simplified blackbody tint: blend toward hot white at high temperature
62
- float tNorm = clamp((temperature - 800.0) / 4200.0, 0.0, 1.0);
63
- vec3 bb = mix(vec3(1.0, 0.2, 0.0), vec3(1.0, 0.95, 0.8), tNorm);
64
- emission += bb * blackbodyIntensity * density;
65
-
66
- return scatter + emission - absorption * 0.5;
46
+ PrincipledVolume.glslFunction = `
47
+ vec3 _st_principledVolume(
48
+ vec3 scatterColor, float density,
49
+ float anisotropy, vec3 absorptionColor,
50
+ vec3 emissionColor, float emissionStrength,
51
+ float blackbodyIntensity, float temperature
52
+ ) {
53
+ float g = clamp(anisotropy, -0.9999, 0.9999);
54
+ float g2 = g * g;
55
+ float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
56
+
57
+ vec3 scatter = scatterColor * density * phase;
58
+ vec3 absorption = absorptionColor * density;
59
+ vec3 emission = emissionColor * emissionStrength;
60
+
61
+ // Simplified blackbody tint: blend toward hot white at high temperature
62
+ float tNorm = clamp((temperature - 800.0) / 4200.0, 0.0, 1.0);
63
+ vec3 bb = mix(vec3(1.0, 0.2, 0.0), vec3(1.0, 0.95, 0.8), tNorm);
64
+ emission += bb * blackbodyIntensity * density;
65
+
66
+ return scatter + emission - absorption * 0.5;
67
67
  }`;
@@ -36,11 +36,11 @@ export class RefractionBSDF extends ProcessNode {
36
36
  }
37
37
  }
38
38
  RefractionBSDF.instanceSpecificDef = false;
39
- RefractionBSDF.glslFunction = `
40
- vec3 _st_refractionBSDF(vec3 color, float roughness, float ior, vec3 N) {
41
- vec3 V = normalize(cameraPosition - vPosition);
42
- vec3 refDir = refract(-V, N, 1.0 / ior);
43
- float fresnel = pow(1.0 - max(dot(V, N), 0.0), 5.0);
44
- vec3 refColor = color * (1.0 - fresnel) * (1.0 - roughness * 0.5);
45
- return refColor;
39
+ RefractionBSDF.glslFunction = `
40
+ vec3 _st_refractionBSDF(vec3 color, float roughness, float ior, vec3 N) {
41
+ vec3 V = normalize(cameraPosition - vPosition);
42
+ vec3 refDir = refract(-V, N, 1.0 / ior);
43
+ float fresnel = pow(1.0 - max(dot(V, N), 0.0), 5.0);
44
+ vec3 refColor = color * (1.0 - fresnel) * (1.0 - roughness * 0.5);
45
+ return refColor;
46
46
  }`;
@@ -34,16 +34,16 @@ export class SheenBSDF extends ProcessNode {
34
34
  }
35
35
  }
36
36
  SheenBSDF.instanceSpecificDef = false;
37
- SheenBSDF.glslFunction = `
38
- vec3 _st_sheenBSDF(vec3 color, float roughness, vec3 N) {
39
- vec3 V = normalize(cameraPosition - vPosition);
40
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
41
- vec3 H = normalize(L + V);
42
- float NdotL = max(dot(N, L), 0.0);
43
- float NdotV = max(dot(N, V), 0.0001);
44
- float NdotH = max(dot(N, H), 0.0);
45
- float sinThetaH = sqrt(max(1.0 - NdotH * NdotH, 0.0));
46
- float r2 = roughness * roughness;
47
- float sheen = (2.0 + 1.0 / r2) * pow(sinThetaH, 1.0 / r2) / (2.0 * 3.14159);
48
- return color * sheen * NdotL / max(NdotL + NdotV - NdotL * NdotV, 0.0001) + color * 0.03;
37
+ SheenBSDF.glslFunction = `
38
+ vec3 _st_sheenBSDF(vec3 color, float roughness, vec3 N) {
39
+ vec3 V = normalize(cameraPosition - vPosition);
40
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
41
+ vec3 H = normalize(L + V);
42
+ float NdotL = max(dot(N, L), 0.0);
43
+ float NdotV = max(dot(N, V), 0.0001);
44
+ float NdotH = max(dot(N, H), 0.0);
45
+ float sinThetaH = sqrt(max(1.0 - NdotH * NdotH, 0.0));
46
+ float r2 = roughness * roughness;
47
+ float sheen = (2.0 + 1.0 / r2) * pow(sinThetaH, 1.0 / r2) / (2.0 * 3.14159);
48
+ return color * sheen * NdotL / max(NdotL + NdotV - NdotL * NdotV, 0.0001) + color * 0.03;
49
49
  }`;
@@ -36,19 +36,19 @@ export class SpecularBSDF extends ProcessNode {
36
36
  }
37
37
  }
38
38
  SpecularBSDF.instanceSpecificDef = false;
39
- SpecularBSDF.glslFunction = `
40
- vec3 _st_specularBSDF(vec3 base, vec3 spec, float roughness, vec3 N) {
41
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
- vec3 V = normalize(cameraPosition - vPosition);
43
- vec3 H = normalize(L + V);
44
- float NdotL = max(dot(N, L), 0.0);
45
- float NdotH = max(dot(N, H), 0.0);
46
- float NdotV = max(dot(N, V), 0.0001);
47
- float a2 = pow(roughness, 4.0);
48
- float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
49
- float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
50
- float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
51
- vec3 F = spec + (1.0 - spec) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
52
- vec3 specColor = D * G * F / max(4.0 * NdotL * NdotV, 0.0001);
53
- return (base / 3.14159 + specColor) * NdotL + base * 0.04;
39
+ SpecularBSDF.glslFunction = `
40
+ vec3 _st_specularBSDF(vec3 base, vec3 spec, float roughness, vec3 N) {
41
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
+ vec3 V = normalize(cameraPosition - vPosition);
43
+ vec3 H = normalize(L + V);
44
+ float NdotL = max(dot(N, L), 0.0);
45
+ float NdotH = max(dot(N, H), 0.0);
46
+ float NdotV = max(dot(N, V), 0.0001);
47
+ float a2 = pow(roughness, 4.0);
48
+ float D = a2 / max(3.14159 * pow(NdotH * NdotH * (a2 - 1.0) + 1.0, 2.0), 0.0001);
49
+ float k = (roughness + 1.0) * (roughness + 1.0) / 8.0;
50
+ float G = (NdotL / (NdotL * (1.0 - k) + k)) * (NdotV / (NdotV * (1.0 - k) + k));
51
+ vec3 F = spec + (1.0 - spec) * pow(1.0 - max(dot(H, V), 0.0), 5.0);
52
+ vec3 specColor = D * G * F / max(4.0 * NdotL * NdotV, 0.0001);
53
+ return (base / 3.14159 + specColor) * NdotL + base * 0.04;
54
54
  }`;
@@ -36,11 +36,11 @@ export class SubsurfaceScattering extends ProcessNode {
36
36
  }
37
37
  }
38
38
  SubsurfaceScattering.instanceSpecificDef = false;
39
- SubsurfaceScattering.glslFunction = `
40
- vec3 _st_sss(vec3 color, float scale, vec3 radius, vec3 N) {
41
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
- float wrap = max(dot(N, L) * 0.5 + 0.5, 0.0);
43
- vec3 scatter = color * radius * wrap * scale;
44
- float back = max(-dot(N, L), 0.0) * scale * 0.3;
45
- return color * (0.04 + wrap * 0.5) + scatter + color * back;
39
+ SubsurfaceScattering.glslFunction = `
40
+ vec3 _st_sss(vec3 color, float scale, vec3 radius, vec3 N) {
41
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
42
+ float wrap = max(dot(N, L) * 0.5 + 0.5, 0.0);
43
+ vec3 scatter = color * radius * wrap * scale;
44
+ float back = max(-dot(N, L), 0.0) * scale * 0.3;
45
+ return color * (0.04 + wrap * 0.5) + scatter + color * back;
46
46
  }`;
@@ -35,10 +35,10 @@ export class ToonBSDF extends ProcessNode {
35
35
  }
36
36
  }
37
37
  ToonBSDF.instanceSpecificDef = false;
38
- ToonBSDF.glslFunction = `
39
- vec3 _st_toonBSDF(vec3 color, float size, float smoothWidth, vec3 N) {
40
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
41
- float NdotL = dot(N, L) * 0.5 + 0.5;
42
- float band = smoothstep(size - smoothWidth, size + smoothWidth, NdotL);
43
- return color * band + color * 0.1;
38
+ ToonBSDF.glslFunction = `
39
+ vec3 _st_toonBSDF(vec3 color, float size, float smoothWidth, vec3 N) {
40
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
41
+ float NdotL = dot(N, L) * 0.5 + 0.5;
42
+ float band = smoothstep(size - smoothWidth, size + smoothWidth, NdotL);
43
+ return color * band + color * 0.1;
44
44
  }`;
@@ -31,9 +31,9 @@ export class TranslucentBSDF extends ProcessNode {
31
31
  }
32
32
  }
33
33
  TranslucentBSDF.instanceSpecificDef = false;
34
- TranslucentBSDF.glslFunction = `
35
- vec3 _st_translucentBSDF(vec3 color, vec3 N) {
36
- vec3 L = normalize(vec3(1.0, 2.0, 1.0));
37
- float backDot = max(dot(-N, L), 0.0);
38
- return color * backDot / 3.14159265 + color * 0.02;
34
+ TranslucentBSDF.glslFunction = `
35
+ vec3 _st_translucentBSDF(vec3 color, vec3 N) {
36
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
37
+ float backDot = max(dot(-N, L), 0.0);
38
+ return color * backDot / 3.14159265 + color * 0.02;
39
39
  }`;
@@ -0,0 +1,26 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import type { NodeMetadata } from '../../core/ShaderNode.js';
3
+ import type { CompileContext } from '../../core/CompileContext.js';
4
+ /**
5
+ * Transparent BSDF — Blender "Transparent BSDF" node equivalent.
6
+ * Passes light through unfiltered — full transparency, colorless, no inputs.
7
+ * Combine with MixShader/AddShader to build cutout, fresnel-fade, or
8
+ * rim-light materials without a hand-written GLSL output node.
9
+ *
10
+ * Outputs: BSDF (shader) — always vec4(0.0, 0.0, 0.0, 0.0)
11
+ */
12
+ export declare class TransparentBSDF extends ProcessNode {
13
+ get nodeType(): string;
14
+ static instanceSpecificDef: boolean;
15
+ get metadata(): NodeMetadata;
16
+ private readonly _inputs;
17
+ private readonly _outputs;
18
+ constructor();
19
+ getInputSockets(): Record<string, import("../../index.js").InputSocket<unknown>>;
20
+ getOutputSockets(): Record<string, import("../../index.js").OutputSocket>;
21
+ compileDefs(): string;
22
+ /** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
23
+ wantsTransparency(): boolean;
24
+ compileCall(ctx: CompileContext): string;
25
+ }
26
+ //# sourceMappingURL=TransparentBSDF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransparentBSDF.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/TransparentBSDF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAElE;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,QAAQ,WAA+B;IAC3C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;;IAQ5F,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,4GAA4G;IAC5G,iBAAiB,IAAI,OAAO;IAE5B,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAGzC"}
@@ -0,0 +1,29 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Transparent BSDF — Blender "Transparent BSDF" node equivalent.
4
+ * Passes light through unfiltered — full transparency, colorless, no inputs.
5
+ * Combine with MixShader/AddShader to build cutout, fresnel-fade, or
6
+ * rim-light materials without a hand-written GLSL output node.
7
+ *
8
+ * Outputs: BSDF (shader) — always vec4(0.0, 0.0, 0.0, 0.0)
9
+ */
10
+ export class TransparentBSDF extends ProcessNode {
11
+ get nodeType() { return 'TransparentBSDF'; }
12
+ get metadata() {
13
+ return { label: 'Transparent BSDF', category: 'Shader', color: '#336699', cost: 'low' };
14
+ }
15
+ constructor() {
16
+ super('TransparentBSDF');
17
+ this._inputs = this.createInputs({}, {});
18
+ this._outputs = this.createOutputs({ BSDF: 'shader' });
19
+ }
20
+ getInputSockets() { return this._inputs; }
21
+ getOutputSockets() { return this._outputs; }
22
+ compileDefs() { return ''; }
23
+ /** Always fully transparent — a constant, not a dynamic value, so this always requests transparent:true. */
24
+ wantsTransparency() { return true; }
25
+ compileCall(ctx) {
26
+ return `vec4 ${ctx.outputVar(this, 'BSDF')} = vec4(0.0, 0.0, 0.0, 0.0);`;
27
+ }
28
+ }
29
+ TransparentBSDF.instanceSpecificDef = false;
@@ -30,7 +30,7 @@ export class VolumeAbsorption extends ProcessNode {
30
30
  }
31
31
  }
32
32
  VolumeAbsorption.instanceSpecificDef = false;
33
- VolumeAbsorption.glslFunction = `
34
- vec3 _st_volumeAbsorption(vec3 color, float density) {
35
- return color * density;
33
+ VolumeAbsorption.glslFunction = `
34
+ vec3 _st_volumeAbsorption(vec3 color, float density) {
35
+ return color * density;
36
36
  }`;
@@ -32,11 +32,11 @@ export class VolumeScatter extends ProcessNode {
32
32
  }
33
33
  }
34
34
  VolumeScatter.instanceSpecificDef = false;
35
- VolumeScatter.glslFunction = `
36
- vec3 _st_volumeScatter(vec3 color, float density, float anisotropy) {
37
- float g = clamp(anisotropy, -0.9999, 0.9999);
38
- float g2 = g * g;
39
- // HG phase at cosTheta=0 (isotropic approximation for surface shading context)
40
- float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
41
- return color * density * phase;
35
+ VolumeScatter.glslFunction = `
36
+ vec3 _st_volumeScatter(vec3 color, float density, float anisotropy) {
37
+ float g = clamp(anisotropy, -0.9999, 0.9999);
38
+ float g2 = g * g;
39
+ // HG phase at cosTheta=0 (isotropic approximation for surface shading context)
40
+ float phase = (1.0 - g2) / pow(1.0 + g2, 1.5);
41
+ return color * density * phase;
42
42
  }`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@triforge/shader-core",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "GLSL shader library for Three.js with Blender workflow",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",