@triforge/shader-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/bundle.js +5578 -0
- package/dist/core/CompileContext.d.ts +60 -0
- package/dist/core/CompileContext.d.ts.map +1 -0
- package/dist/core/CompileContext.js +276 -0
- package/dist/core/InputNode.d.ts +11 -0
- package/dist/core/InputNode.d.ts.map +1 -0
- package/dist/core/InputNode.js +13 -0
- package/dist/core/InputSocket.d.ts +21 -0
- package/dist/core/InputSocket.d.ts.map +1 -0
- package/dist/core/InputSocket.js +23 -0
- package/dist/core/OutputNode.d.ts +30 -0
- package/dist/core/OutputNode.d.ts.map +1 -0
- package/dist/core/OutputNode.js +60 -0
- package/dist/core/OutputSocket.d.ts +18 -0
- package/dist/core/OutputSocket.d.ts.map +1 -0
- package/dist/core/OutputSocket.js +16 -0
- package/dist/core/ProcessNode.d.ts +8 -0
- package/dist/core/ProcessNode.d.ts.map +1 -0
- package/dist/core/ProcessNode.js +7 -0
- package/dist/core/ShaderConfig.d.ts +13 -0
- package/dist/core/ShaderConfig.d.ts.map +1 -0
- package/dist/core/ShaderConfig.js +11 -0
- package/dist/core/ShaderNode.d.ts +114 -0
- package/dist/core/ShaderNode.d.ts.map +1 -0
- package/dist/core/ShaderNode.js +156 -0
- package/dist/core/ShaderNodeError.d.ts +32 -0
- package/dist/core/ShaderNodeError.d.ts.map +1 -0
- package/dist/core/ShaderNodeError.js +61 -0
- package/dist/core/SocketType.d.ts +12 -0
- package/dist/core/SocketType.d.ts.map +1 -0
- package/dist/core/SocketType.js +7 -0
- package/dist/index.d.ts +164 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/nodes/input/Attribute.d.ts +45 -0
- package/dist/nodes/input/Attribute.d.ts.map +1 -0
- package/dist/nodes/input/Attribute.js +58 -0
- package/dist/nodes/input/CameraData.d.ts +21 -0
- package/dist/nodes/input/CameraData.d.ts.map +1 -0
- package/dist/nodes/input/CameraData.js +33 -0
- package/dist/nodes/input/ColorAttribute.d.ts +28 -0
- package/dist/nodes/input/ColorAttribute.d.ts.map +1 -0
- package/dist/nodes/input/ColorAttribute.js +32 -0
- package/dist/nodes/input/Geometry.d.ts +23 -0
- package/dist/nodes/input/Geometry.d.ts.map +1 -0
- package/dist/nodes/input/Geometry.js +38 -0
- package/dist/nodes/input/HairInfo.d.ts +38 -0
- package/dist/nodes/input/HairInfo.d.ts.map +1 -0
- package/dist/nodes/input/HairInfo.js +50 -0
- package/dist/nodes/input/LayerWeight.d.ts +26 -0
- package/dist/nodes/input/LayerWeight.d.ts.map +1 -0
- package/dist/nodes/input/LayerWeight.js +35 -0
- package/dist/nodes/input/LightPath.d.ts +60 -0
- package/dist/nodes/input/LightPath.d.ts.map +1 -0
- package/dist/nodes/input/LightPath.js +112 -0
- package/dist/nodes/input/ObjectInfo.d.ts +22 -0
- package/dist/nodes/input/ObjectInfo.d.ts.map +1 -0
- package/dist/nodes/input/ObjectInfo.js +41 -0
- package/dist/nodes/input/OceanAttribute.d.ts +32 -0
- package/dist/nodes/input/OceanAttribute.d.ts.map +1 -0
- package/dist/nodes/input/OceanAttribute.js +38 -0
- package/dist/nodes/input/ParticleInfo.d.ts +31 -0
- package/dist/nodes/input/ParticleInfo.d.ts.map +1 -0
- package/dist/nodes/input/ParticleInfo.js +44 -0
- package/dist/nodes/input/RGB.d.ts +19 -0
- package/dist/nodes/input/RGB.d.ts.map +1 -0
- package/dist/nodes/input/RGB.js +23 -0
- package/dist/nodes/input/ScreenCamera.d.ts +37 -0
- package/dist/nodes/input/ScreenCamera.d.ts.map +1 -0
- package/dist/nodes/input/ScreenCamera.js +59 -0
- package/dist/nodes/input/Tangent.d.ts +21 -0
- package/dist/nodes/input/Tangent.d.ts.map +1 -0
- package/dist/nodes/input/Tangent.js +30 -0
- package/dist/nodes/input/TextureCoordinate.d.ts +17 -0
- package/dist/nodes/input/TextureCoordinate.d.ts.map +1 -0
- package/dist/nodes/input/TextureCoordinate.js +24 -0
- package/dist/nodes/input/UVMap.d.ts +20 -0
- package/dist/nodes/input/UVMap.d.ts.map +1 -0
- package/dist/nodes/input/UVMap.js +23 -0
- package/dist/nodes/input/Value.d.ts +19 -0
- package/dist/nodes/input/Value.d.ts.map +1 -0
- package/dist/nodes/input/Value.js +22 -0
- package/dist/nodes/input/Wireframe.d.ts +25 -0
- package/dist/nodes/input/Wireframe.d.ts.map +1 -0
- package/dist/nodes/input/Wireframe.js +30 -0
- package/dist/nodes/output/Displacement.d.ts +28 -0
- package/dist/nodes/output/Displacement.d.ts.map +1 -0
- package/dist/nodes/output/Displacement.js +34 -0
- package/dist/nodes/output/MaterialOutput.d.ts +43 -0
- package/dist/nodes/output/MaterialOutput.d.ts.map +1 -0
- package/dist/nodes/output/MaterialOutput.js +118 -0
- package/dist/nodes/output/ScreenOutput.d.ts +38 -0
- package/dist/nodes/output/ScreenOutput.d.ts.map +1 -0
- package/dist/nodes/output/ScreenOutput.js +88 -0
- package/dist/nodes/process/AddShader.d.ts +30 -0
- package/dist/nodes/process/AddShader.d.ts.map +1 -0
- package/dist/nodes/process/AddShader.js +36 -0
- package/dist/nodes/process/AnimatedNoiseTexture.d.ts +39 -0
- package/dist/nodes/process/AnimatedNoiseTexture.d.ts.map +1 -0
- package/dist/nodes/process/AnimatedNoiseTexture.js +93 -0
- package/dist/nodes/process/Blackbody.d.ts +29 -0
- package/dist/nodes/process/Blackbody.d.ts.map +1 -0
- package/dist/nodes/process/Blackbody.js +50 -0
- package/dist/nodes/process/BrickTexture.d.ts +36 -0
- package/dist/nodes/process/BrickTexture.d.ts.map +1 -0
- package/dist/nodes/process/BrickTexture.js +71 -0
- package/dist/nodes/process/BrightContrast.d.ts +30 -0
- package/dist/nodes/process/BrightContrast.d.ts.map +1 -0
- package/dist/nodes/process/BrightContrast.js +41 -0
- package/dist/nodes/process/Bump.d.ts +31 -0
- package/dist/nodes/process/Bump.d.ts.map +1 -0
- package/dist/nodes/process/Bump.js +65 -0
- package/dist/nodes/process/CheckerTexture.d.ts +30 -0
- package/dist/nodes/process/CheckerTexture.d.ts.map +1 -0
- package/dist/nodes/process/CheckerTexture.js +48 -0
- package/dist/nodes/process/Clamp.d.ts +32 -0
- package/dist/nodes/process/Clamp.d.ts.map +1 -0
- package/dist/nodes/process/Clamp.js +37 -0
- package/dist/nodes/process/ColorRamp.d.ts +28 -0
- package/dist/nodes/process/ColorRamp.d.ts.map +1 -0
- package/dist/nodes/process/ColorRamp.js +49 -0
- package/dist/nodes/process/CombineColor.d.ts +34 -0
- package/dist/nodes/process/CombineColor.d.ts.map +1 -0
- package/dist/nodes/process/CombineColor.js +69 -0
- package/dist/nodes/process/CombineRGB.d.ts +29 -0
- package/dist/nodes/process/CombineRGB.d.ts.map +1 -0
- package/dist/nodes/process/CombineRGB.js +33 -0
- package/dist/nodes/process/CombineXYZ.d.ts +29 -0
- package/dist/nodes/process/CombineXYZ.d.ts.map +1 -0
- package/dist/nodes/process/CombineXYZ.js +33 -0
- package/dist/nodes/process/DiffuseBSDF.d.ts +30 -0
- package/dist/nodes/process/DiffuseBSDF.d.ts.map +1 -0
- package/dist/nodes/process/DiffuseBSDF.js +43 -0
- package/dist/nodes/process/Emission.d.ts +30 -0
- package/dist/nodes/process/Emission.d.ts.map +1 -0
- package/dist/nodes/process/Emission.js +36 -0
- package/dist/nodes/process/EnvironmentTexture.d.ts +41 -0
- package/dist/nodes/process/EnvironmentTexture.d.ts.map +1 -0
- package/dist/nodes/process/EnvironmentTexture.js +65 -0
- package/dist/nodes/process/FloatCurve.d.ts +34 -0
- package/dist/nodes/process/FloatCurve.d.ts.map +1 -0
- package/dist/nodes/process/FloatCurve.js +46 -0
- package/dist/nodes/process/Fresnel.d.ts +36 -0
- package/dist/nodes/process/Fresnel.d.ts.map +1 -0
- package/dist/nodes/process/Fresnel.js +53 -0
- package/dist/nodes/process/Gamma.d.ts +29 -0
- package/dist/nodes/process/Gamma.d.ts.map +1 -0
- package/dist/nodes/process/Gamma.js +35 -0
- package/dist/nodes/process/GlassBSDF.d.ts +31 -0
- package/dist/nodes/process/GlassBSDF.d.ts.map +1 -0
- package/dist/nodes/process/GlassBSDF.js +51 -0
- package/dist/nodes/process/GlossyBSDF.d.ts +30 -0
- package/dist/nodes/process/GlossyBSDF.d.ts.map +1 -0
- package/dist/nodes/process/GlossyBSDF.js +50 -0
- package/dist/nodes/process/GradientTexture.d.ts +31 -0
- package/dist/nodes/process/GradientTexture.d.ts.map +1 -0
- package/dist/nodes/process/GradientTexture.js +49 -0
- package/dist/nodes/process/HashValue.d.ts +30 -0
- package/dist/nodes/process/HashValue.d.ts.map +1 -0
- package/dist/nodes/process/HashValue.js +34 -0
- package/dist/nodes/process/HueSaturationValue.d.ts +32 -0
- package/dist/nodes/process/HueSaturationValue.d.ts.map +1 -0
- package/dist/nodes/process/HueSaturationValue.js +58 -0
- package/dist/nodes/process/ImageTexture.d.ts +34 -0
- package/dist/nodes/process/ImageTexture.d.ts.map +1 -0
- package/dist/nodes/process/ImageTexture.js +53 -0
- package/dist/nodes/process/InvertColor.d.ts +29 -0
- package/dist/nodes/process/InvertColor.d.ts.map +1 -0
- package/dist/nodes/process/InvertColor.js +35 -0
- package/dist/nodes/process/MagicTexture.d.ts +30 -0
- package/dist/nodes/process/MagicTexture.d.ts.map +1 -0
- package/dist/nodes/process/MagicTexture.js +54 -0
- package/dist/nodes/process/MapRange.d.ts +38 -0
- package/dist/nodes/process/MapRange.d.ts.map +1 -0
- package/dist/nodes/process/MapRange.js +52 -0
- package/dist/nodes/process/Mapping.d.ts +37 -0
- package/dist/nodes/process/Mapping.d.ts.map +1 -0
- package/dist/nodes/process/Mapping.js +57 -0
- package/dist/nodes/process/Math.d.ts +40 -0
- package/dist/nodes/process/Math.d.ts.map +1 -0
- package/dist/nodes/process/Math.js +100 -0
- package/dist/nodes/process/MixRGB.d.ts +35 -0
- package/dist/nodes/process/MixRGB.d.ts.map +1 -0
- package/dist/nodes/process/MixRGB.js +63 -0
- package/dist/nodes/process/MixShader.d.ts +35 -0
- package/dist/nodes/process/MixShader.d.ts.map +1 -0
- package/dist/nodes/process/MixShader.js +47 -0
- package/dist/nodes/process/MusgraveTexture.d.ts +36 -0
- package/dist/nodes/process/MusgraveTexture.d.ts.map +1 -0
- package/dist/nodes/process/MusgraveTexture.js +70 -0
- package/dist/nodes/process/NoiseTexture.d.ts +31 -0
- package/dist/nodes/process/NoiseTexture.d.ts.map +1 -0
- package/dist/nodes/process/NoiseTexture.js +78 -0
- package/dist/nodes/process/Normal.d.ts +30 -0
- package/dist/nodes/process/Normal.d.ts.map +1 -0
- package/dist/nodes/process/Normal.js +38 -0
- package/dist/nodes/process/NormalMap.d.ts +34 -0
- package/dist/nodes/process/NormalMap.d.ts.map +1 -0
- package/dist/nodes/process/NormalMap.js +54 -0
- package/dist/nodes/process/PrincipledBSDF.d.ts +32 -0
- package/dist/nodes/process/PrincipledBSDF.d.ts.map +1 -0
- package/dist/nodes/process/PrincipledBSDF.js +75 -0
- package/dist/nodes/process/PrincipledHair.d.ts +63 -0
- package/dist/nodes/process/PrincipledHair.d.ts.map +1 -0
- package/dist/nodes/process/PrincipledHair.js +137 -0
- package/dist/nodes/process/PrincipledVolume.d.ts +37 -0
- package/dist/nodes/process/PrincipledVolume.d.ts.map +1 -0
- package/dist/nodes/process/PrincipledVolume.js +67 -0
- package/dist/nodes/process/RGBCurves.d.ts +45 -0
- package/dist/nodes/process/RGBCurves.d.ts.map +1 -0
- package/dist/nodes/process/RGBCurves.js +81 -0
- package/dist/nodes/process/RGBtoBW.d.ts +28 -0
- package/dist/nodes/process/RGBtoBW.d.ts.map +1 -0
- package/dist/nodes/process/RGBtoBW.js +31 -0
- package/dist/nodes/process/RefractionBSDF.d.ts +32 -0
- package/dist/nodes/process/RefractionBSDF.d.ts.map +1 -0
- package/dist/nodes/process/RefractionBSDF.js +46 -0
- package/dist/nodes/process/SchwarzschildMarch.d.ts +56 -0
- package/dist/nodes/process/SchwarzschildMarch.d.ts.map +1 -0
- package/dist/nodes/process/SchwarzschildMarch.js +306 -0
- package/dist/nodes/process/SeparateColor.d.ts +33 -0
- package/dist/nodes/process/SeparateColor.d.ts.map +1 -0
- package/dist/nodes/process/SeparateColor.js +79 -0
- package/dist/nodes/process/SeparateRGB.d.ts +27 -0
- package/dist/nodes/process/SeparateRGB.d.ts.map +1 -0
- package/dist/nodes/process/SeparateRGB.js +31 -0
- package/dist/nodes/process/SeparateXYZ.d.ts +27 -0
- package/dist/nodes/process/SeparateXYZ.d.ts.map +1 -0
- package/dist/nodes/process/SeparateXYZ.js +31 -0
- package/dist/nodes/process/ShaderScript.d.ts +95 -0
- package/dist/nodes/process/ShaderScript.d.ts.map +1 -0
- package/dist/nodes/process/ShaderScript.js +119 -0
- package/dist/nodes/process/ShaderToRGB.d.ts +28 -0
- package/dist/nodes/process/ShaderToRGB.d.ts.map +1 -0
- package/dist/nodes/process/ShaderToRGB.js +33 -0
- package/dist/nodes/process/SheenBSDF.d.ts +31 -0
- package/dist/nodes/process/SheenBSDF.d.ts.map +1 -0
- package/dist/nodes/process/SheenBSDF.js +49 -0
- package/dist/nodes/process/SpecularBSDF.d.ts +32 -0
- package/dist/nodes/process/SpecularBSDF.d.ts.map +1 -0
- package/dist/nodes/process/SpecularBSDF.js +54 -0
- package/dist/nodes/process/SubsurfaceScattering.d.ts +33 -0
- package/dist/nodes/process/SubsurfaceScattering.d.ts.map +1 -0
- package/dist/nodes/process/SubsurfaceScattering.js +46 -0
- package/dist/nodes/process/ToonBSDF.d.ts +31 -0
- package/dist/nodes/process/ToonBSDF.d.ts.map +1 -0
- package/dist/nodes/process/ToonBSDF.js +44 -0
- package/dist/nodes/process/TranslucentBSDF.d.ts +29 -0
- package/dist/nodes/process/TranslucentBSDF.d.ts.map +1 -0
- package/dist/nodes/process/TranslucentBSDF.js +39 -0
- package/dist/nodes/process/VectorCurves.d.ts +42 -0
- package/dist/nodes/process/VectorCurves.d.ts.map +1 -0
- package/dist/nodes/process/VectorCurves.js +71 -0
- package/dist/nodes/process/VectorMath.d.ts +38 -0
- package/dist/nodes/process/VectorMath.d.ts.map +1 -0
- package/dist/nodes/process/VectorMath.js +105 -0
- package/dist/nodes/process/VectorRotate.d.ts +34 -0
- package/dist/nodes/process/VectorRotate.d.ts.map +1 -0
- package/dist/nodes/process/VectorRotate.js +52 -0
- package/dist/nodes/process/VectorTransform.d.ts +36 -0
- package/dist/nodes/process/VectorTransform.d.ts.map +1 -0
- package/dist/nodes/process/VectorTransform.js +48 -0
- package/dist/nodes/process/VolumeAbsorption.d.ts +30 -0
- package/dist/nodes/process/VolumeAbsorption.d.ts.map +1 -0
- package/dist/nodes/process/VolumeAbsorption.js +36 -0
- package/dist/nodes/process/VolumeScatter.d.ts +31 -0
- package/dist/nodes/process/VolumeScatter.d.ts.map +1 -0
- package/dist/nodes/process/VolumeScatter.js +42 -0
- package/dist/nodes/process/VoronoiTexture.d.ts +38 -0
- package/dist/nodes/process/VoronoiTexture.d.ts.map +1 -0
- package/dist/nodes/process/VoronoiTexture.js +123 -0
- package/dist/nodes/process/WaveTexture.d.ts +39 -0
- package/dist/nodes/process/WaveTexture.d.ts.map +1 -0
- package/dist/nodes/process/WaveTexture.js +77 -0
- package/dist/nodes/process/Wavelength.d.ts +28 -0
- package/dist/nodes/process/Wavelength.d.ts.map +1 -0
- package/dist/nodes/process/Wavelength.js +43 -0
- package/dist/nodes/process/WhiteNoise.d.ts +27 -0
- package/dist/nodes/process/WhiteNoise.d.ts.map +1 -0
- package/dist/nodes/process/WhiteNoise.js +44 -0
- package/dist/nodes/shader/AmbientOcclusion.d.ts +47 -0
- package/dist/nodes/shader/AmbientOcclusion.d.ts.map +1 -0
- package/dist/nodes/shader/AmbientOcclusion.js +128 -0
- package/dist/nodes/shader/RayPortal.d.ts +57 -0
- package/dist/nodes/shader/RayPortal.d.ts.map +1 -0
- package/dist/nodes/shader/RayPortal.js +56 -0
- package/dist/shaders/color.d.ts +12 -0
- package/dist/shaders/color.d.ts.map +1 -0
- package/dist/shaders/color.js +42 -0
- package/dist/shaders/noise.d.ts +12 -0
- package/dist/shaders/noise.d.ts.map +1 -0
- package/dist/shaders/noise.js +70 -0
- package/dist/types/shader.d.ts +17 -0
- package/dist/types/shader.d.ts.map +1 -0
- package/dist/types/shader.js +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mix RGB — Blender "Mix" color node equivalent.
|
|
4
|
+
* Blends two colours using a mode selector.
|
|
5
|
+
*
|
|
6
|
+
* Inputs: fac [0-1], colorA, colorB
|
|
7
|
+
* Outputs: Color (color)
|
|
8
|
+
*/
|
|
9
|
+
export class MixRGB extends ProcessNode {
|
|
10
|
+
get nodeType() { return 'MixRGB'; }
|
|
11
|
+
get metadata() {
|
|
12
|
+
return { label: 'Mix RGB', category: 'Color', color: '#633060', cost: 'low' };
|
|
13
|
+
}
|
|
14
|
+
constructor(inputs = {}) {
|
|
15
|
+
super('MixRGB');
|
|
16
|
+
this.mode = inputs.mode ?? 'MIX';
|
|
17
|
+
this.clamp = inputs.clamp ?? false;
|
|
18
|
+
this._inputs = this.createInputs(inputs, {
|
|
19
|
+
fac: ['float', inputs.fac ?? 0.5],
|
|
20
|
+
colorA: ['color', '#000000'],
|
|
21
|
+
colorB: ['color', '#ffffff'],
|
|
22
|
+
});
|
|
23
|
+
this._outputs = this.createOutputs({ Color: 'color' });
|
|
24
|
+
}
|
|
25
|
+
getInputSockets() { return this._inputs; }
|
|
26
|
+
getOutputSockets() { return this._outputs; }
|
|
27
|
+
compileDefs() { return MixRGB.glslFunction; }
|
|
28
|
+
compileCall(ctx) {
|
|
29
|
+
const modeIndex = [
|
|
30
|
+
'MIX', 'DARKEN', 'MULTIPLY', 'BURN', 'LIGHTEN', 'SCREEN', 'DODGE', 'ADD',
|
|
31
|
+
'OVERLAY', 'SOFT_LIGHT', 'LINEAR_LIGHT', 'DIFFERENCE', 'EXCLUSION', 'SUBTRACT', 'DIVIDE',
|
|
32
|
+
].indexOf(this.mode);
|
|
33
|
+
const idx = modeIndex === -1 ? 0 : modeIndex;
|
|
34
|
+
const fac = ctx.resolveInput(this._inputs.fac);
|
|
35
|
+
const colorA = ctx.resolveInput(this._inputs.colorA);
|
|
36
|
+
const colorB = ctx.resolveInput(this._inputs.colorB);
|
|
37
|
+
const out = ctx.outputVar(this, 'Color');
|
|
38
|
+
const expr = `_st_mixRGB(${idx}, ${fac}, ${colorA}, ${colorB})`;
|
|
39
|
+
return `vec3 ${out} = ${this.clamp ? `clamp(${expr}, 0.0, 1.0)` : expr};`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
MixRGB.instanceSpecificDef = false;
|
|
43
|
+
MixRGB.glslFunction = `
|
|
44
|
+
vec3 _st_mixRGB(int mode, float fac, vec3 a, vec3 b) {
|
|
45
|
+
fac = clamp(fac, 0.0, 1.0);
|
|
46
|
+
vec3 col = a;
|
|
47
|
+
if (mode == 0) col = mix(a, b, fac);
|
|
48
|
+
else if (mode == 1) col = mix(a, min(a, b), fac);
|
|
49
|
+
else if (mode == 2) col = mix(a, a * b, fac);
|
|
50
|
+
else if (mode == 3) col = mix(a, vec3(1.0) - (vec3(1.0) - a) * (vec3(1.0) - b) / max(vec3(1.0) - a, vec3(0.001)), fac);
|
|
51
|
+
else if (mode == 4) col = mix(a, max(a, b), fac);
|
|
52
|
+
else if (mode == 5) col = mix(a, vec3(1.0) - (vec3(1.0) - a) * (vec3(1.0) - b), fac);
|
|
53
|
+
else if (mode == 6) col = mix(a, a / max(vec3(1.0) - b, vec3(0.001)), fac);
|
|
54
|
+
else if (mode == 7) col = mix(a, clamp(a + b, 0.0, 1.0), fac);
|
|
55
|
+
else if (mode == 8) col = mix(a, mix(2.0*a*b, vec3(1.0)-2.0*(vec3(1.0)-a)*(vec3(1.0)-b), step(vec3(0.5), a)), fac);
|
|
56
|
+
else if (mode == 9) col = mix(a, mix(2.0*a*b + a*a*(1.0-2.0*b), sqrt(max(a,vec3(0.0)))*(2.0*b-1.0)+2.0*a*(1.0-b), step(vec3(0.5), b)), fac);
|
|
57
|
+
else if (mode == 10) col = mix(a, clamp(2.0*a*b - 1.0 + 2.0*(vec3(1.0)-a)*(b-0.5), 0.0, 1.0), fac);
|
|
58
|
+
else if (mode == 11) col = mix(a, abs(a - b), fac);
|
|
59
|
+
else if (mode == 12) col = mix(a, a + b - 2.0*a*b, fac);
|
|
60
|
+
else if (mode == 13) col = mix(a, clamp(a - b, 0.0, 1.0), fac);
|
|
61
|
+
else if (mode == 14) col = mix(a, a / max(b, vec3(0.0001)), fac);
|
|
62
|
+
return col;
|
|
63
|
+
}`;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export interface MixShaderInputs {
|
|
6
|
+
fac?: OutputSocket | number;
|
|
7
|
+
shader1?: OutputSocket;
|
|
8
|
+
shader2?: OutputSocket;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Mix Shader — Blender "Mix Shader" node equivalent.
|
|
12
|
+
* Blends two BSDF shader outputs by a factor.
|
|
13
|
+
*
|
|
14
|
+
* Inputs:
|
|
15
|
+
* fac (float) — blend factor [0-1] 0 = full shader1, 1 = full shader2
|
|
16
|
+
* shader1 (shader) — first BSDF
|
|
17
|
+
* shader2 (shader) — second BSDF
|
|
18
|
+
*
|
|
19
|
+
* Outputs:
|
|
20
|
+
* BSDF (shader) — blended result
|
|
21
|
+
*/
|
|
22
|
+
export declare class MixShader extends ProcessNode {
|
|
23
|
+
get nodeType(): string;
|
|
24
|
+
static instanceSpecificDef: boolean;
|
|
25
|
+
get metadata(): NodeMetadata;
|
|
26
|
+
static glslFunction: string;
|
|
27
|
+
private readonly _inputs;
|
|
28
|
+
private readonly _outputs;
|
|
29
|
+
constructor(inputs?: MixShaderInputs);
|
|
30
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
31
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
32
|
+
compileDefs(): string;
|
|
33
|
+
compileCall(ctx: CompileContext): string;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=MixShader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MixShader.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/MixShader.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,eAAe;IAC9B,GAAG,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IAC/B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,SAAU,SAAQ,WAAW;IACxC,IAAI,QAAQ,WAAyB;IACrC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAO3B;IAED,MAAM,CAAC,YAAY,SAGnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,eAAoB;IAUxC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mix Shader — Blender "Mix Shader" node equivalent.
|
|
4
|
+
* Blends two BSDF shader outputs by a factor.
|
|
5
|
+
*
|
|
6
|
+
* Inputs:
|
|
7
|
+
* fac (float) — blend factor [0-1] 0 = full shader1, 1 = full shader2
|
|
8
|
+
* shader1 (shader) — first BSDF
|
|
9
|
+
* shader2 (shader) — second BSDF
|
|
10
|
+
*
|
|
11
|
+
* Outputs:
|
|
12
|
+
* BSDF (shader) — blended result
|
|
13
|
+
*/
|
|
14
|
+
export class MixShader extends ProcessNode {
|
|
15
|
+
get nodeType() { return 'MixShader'; }
|
|
16
|
+
get metadata() {
|
|
17
|
+
return {
|
|
18
|
+
label: 'Mix Shader',
|
|
19
|
+
category: 'Shader',
|
|
20
|
+
color: '#336699',
|
|
21
|
+
cost: 'low',
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
constructor(inputs = {}) {
|
|
25
|
+
super('MixShader');
|
|
26
|
+
this._inputs = this.createInputs(inputs, {
|
|
27
|
+
fac: ['float', 0.5],
|
|
28
|
+
shader1: ['shader', null],
|
|
29
|
+
shader2: ['shader', null],
|
|
30
|
+
});
|
|
31
|
+
this._outputs = this.createOutputs({ BSDF: 'shader' });
|
|
32
|
+
}
|
|
33
|
+
getInputSockets() { return this._inputs; }
|
|
34
|
+
getOutputSockets() { return this._outputs; }
|
|
35
|
+
compileDefs() { return MixShader.glslFunction; }
|
|
36
|
+
compileCall(ctx) {
|
|
37
|
+
const fac = ctx.resolveInput(this._inputs.fac);
|
|
38
|
+
const shader1 = ctx.resolveInput(this._inputs.shader1);
|
|
39
|
+
const shader2 = ctx.resolveInput(this._inputs.shader2);
|
|
40
|
+
return `vec3 ${ctx.outputVar(this, 'BSDF')} = _st_mixShader(${fac}, ${shader1}, ${shader2});`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
MixShader.instanceSpecificDef = false;
|
|
44
|
+
MixShader.glslFunction = `
|
|
45
|
+
vec3 _st_mixShader(float fac, vec3 a, vec3 b) {
|
|
46
|
+
return mix(a, b, clamp(fac, 0.0, 1.0));
|
|
47
|
+
}`;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export type MusgraveType = 'FBM' | 'MULTIFRACTAL' | 'HYBRID_MULTIFRACTAL' | 'RIDGED_MULTIFRACTAL' | 'HETERO_TERRAIN';
|
|
6
|
+
export interface MusgraveTextureInputs {
|
|
7
|
+
vector?: OutputSocket;
|
|
8
|
+
scale?: number | OutputSocket;
|
|
9
|
+
detail?: number | OutputSocket;
|
|
10
|
+
dimension?: number | OutputSocket;
|
|
11
|
+
lacunarity?: number | OutputSocket;
|
|
12
|
+
offset?: number | OutputSocket;
|
|
13
|
+
gain?: number | OutputSocket;
|
|
14
|
+
type?: MusgraveType;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Musgrave Texture — Blender "Musgrave Texture" node equivalent.
|
|
18
|
+
* Complex fractal noise — terrain, clouds, organic surfaces.
|
|
19
|
+
*
|
|
20
|
+
* Outputs: Fac (float), Color (color)
|
|
21
|
+
*/
|
|
22
|
+
export declare class MusgraveTexture extends ProcessNode {
|
|
23
|
+
get nodeType(): string;
|
|
24
|
+
static instanceSpecificDef: boolean;
|
|
25
|
+
get metadata(): NodeMetadata;
|
|
26
|
+
static glslFunction: string;
|
|
27
|
+
private readonly musType;
|
|
28
|
+
private readonly _inputs;
|
|
29
|
+
private readonly _outputs;
|
|
30
|
+
constructor(inputs?: MusgraveTextureInputs);
|
|
31
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
32
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
33
|
+
compileDefs(): string;
|
|
34
|
+
compileCall(ctx: CompileContext): string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=MusgraveTexture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MusgraveTexture.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/MusgraveTexture.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,MAAM,YAAY,GAAG,KAAK,GAAG,cAAc,GAAG,qBAAqB,GAAG,qBAAqB,GAAG,gBAAgB,CAAA;AAEpH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAM,YAAY,CAAA;IACzB,KAAK,CAAC,EAAO,MAAM,GAAG,YAAY,CAAA;IAClC,MAAM,CAAC,EAAM,MAAM,GAAG,YAAY,CAAA;IAClC,SAAS,CAAC,EAAG,MAAM,GAAG,YAAY,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;IAClC,MAAM,CAAC,EAAM,MAAM,GAAG,YAAY,CAAA;IAClC,IAAI,CAAC,EAAQ,MAAM,GAAG,YAAY,CAAA;IAClC,IAAI,CAAC,EAAQ,YAAY,CAAA;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,QAAQ,WAA+B;IAC3C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SA0BnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,qBAA0B;IAe9C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAYzC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Musgrave Texture — Blender "Musgrave Texture" node equivalent.
|
|
4
|
+
* Complex fractal noise — terrain, clouds, organic surfaces.
|
|
5
|
+
*
|
|
6
|
+
* Outputs: Fac (float), Color (color)
|
|
7
|
+
*/
|
|
8
|
+
export class MusgraveTexture extends ProcessNode {
|
|
9
|
+
get nodeType() { return 'MusgraveTexture'; }
|
|
10
|
+
get metadata() {
|
|
11
|
+
return { label: 'Musgrave Texture', category: 'Texture', color: '#3a6b3a', cost: 'high', costNote: 'Fractal octave loop — limit detail to <=8.' };
|
|
12
|
+
}
|
|
13
|
+
constructor(inputs = {}) {
|
|
14
|
+
super('MusgraveTexture');
|
|
15
|
+
this.musType = inputs.type ?? 'FBM';
|
|
16
|
+
this._inputs = this.createInputs(inputs, {
|
|
17
|
+
vector: ['color', null],
|
|
18
|
+
scale: ['float', inputs.scale ?? 5.0],
|
|
19
|
+
detail: ['float', inputs.detail ?? 8.0],
|
|
20
|
+
dimension: ['float', inputs.dimension ?? 2.0],
|
|
21
|
+
lacunarity: ['float', inputs.lacunarity ?? 2.0],
|
|
22
|
+
offset: ['float', inputs.offset ?? 0.0],
|
|
23
|
+
gain: ['float', inputs.gain ?? 1.0],
|
|
24
|
+
});
|
|
25
|
+
this._outputs = this.createOutputs({ Fac: 'float', Color: 'color' });
|
|
26
|
+
}
|
|
27
|
+
getInputSockets() { return this._inputs; }
|
|
28
|
+
getOutputSockets() { return this._outputs; }
|
|
29
|
+
compileDefs() { return MusgraveTexture.glslFunction; }
|
|
30
|
+
compileCall(ctx) {
|
|
31
|
+
const typeMap = { FBM: 0, MULTIFRACTAL: 1, HYBRID_MULTIFRACTAL: 2, RIDGED_MULTIFRACTAL: 3, HETERO_TERRAIN: 3 };
|
|
32
|
+
const vec = this._inputs.vector.isConnected()
|
|
33
|
+
? `vec3(${ctx.outputVar(this._inputs.vector.connection.node, this._inputs.vector.connection.name)})`
|
|
34
|
+
: 'vec3(vUv, 0.0)';
|
|
35
|
+
const fv = ctx.outputVar(this, 'Fac');
|
|
36
|
+
const cv = ctx.outputVar(this, 'Color');
|
|
37
|
+
return [
|
|
38
|
+
`float ${fv} = _st_musgrave(${vec}, ${ctx.resolveInput(this._inputs.scale)}, ${ctx.resolveInput(this._inputs.detail)}, ${ctx.resolveInput(this._inputs.dimension)}, ${ctx.resolveInput(this._inputs.lacunarity)}, ${ctx.resolveInput(this._inputs.offset)}, ${ctx.resolveInput(this._inputs.gain)}, ${typeMap[this.musType]});`,
|
|
39
|
+
`vec3 ${cv} = vec3(${fv});`,
|
|
40
|
+
].join('\n ');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
MusgraveTexture.instanceSpecificDef = false;
|
|
44
|
+
MusgraveTexture.glslFunction = `
|
|
45
|
+
float _st_mhash(vec3 p) { return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453); }
|
|
46
|
+
vec3 _st_mgrad(vec3 p) { float h = _st_mhash(floor(p)); return normalize(vec3(h, fract(h*34.), fract(h*89.))*2.-1.); }
|
|
47
|
+
float _st_mperlin(vec3 p) {
|
|
48
|
+
vec3 pi=floor(p), pf=p-pi, u=pf*pf*(3.-2.*pf);
|
|
49
|
+
return mix(mix(mix(dot(_st_mgrad(pi+vec3(0,0,0)),pf-vec3(0,0,0)),dot(_st_mgrad(pi+vec3(1,0,0)),pf-vec3(1,0,0)),u.x),
|
|
50
|
+
mix(dot(_st_mgrad(pi+vec3(0,1,0)),pf-vec3(0,1,0)),dot(_st_mgrad(pi+vec3(1,1,0)),pf-vec3(1,1,0)),u.x),u.y),
|
|
51
|
+
mix(mix(dot(_st_mgrad(pi+vec3(0,0,1)),pf-vec3(0,0,1)),dot(_st_mgrad(pi+vec3(1,0,1)),pf-vec3(1,0,1)),u.x),
|
|
52
|
+
mix(dot(_st_mgrad(pi+vec3(0,1,1)),pf-vec3(0,1,1)),dot(_st_mgrad(pi+vec3(1,1,1)),pf-vec3(1,1,1)),u.x),u.y),u.z);
|
|
53
|
+
}
|
|
54
|
+
float _st_musgrave(vec3 p, float scale, float detail, float dimension, float lacunarity, float offset, float gain, int mtype) {
|
|
55
|
+
p *= scale;
|
|
56
|
+
float value = 0.0, amp = 1.0, freq = 1.0, weight = 1.0;
|
|
57
|
+
int oct = int(clamp(detail, 1.0, 16.0));
|
|
58
|
+
float H = max(dimension, 0.0001);
|
|
59
|
+
for (int i = 0; i < 16; i++) {
|
|
60
|
+
if (i >= oct) break;
|
|
61
|
+
float n = _st_mperlin(p * freq);
|
|
62
|
+
if (mtype == 0) { value += amp * n; }
|
|
63
|
+
else if (mtype == 1) { value += amp * abs(n); }
|
|
64
|
+
else if (mtype == 2) { float signal = abs(n) + offset; weight = clamp(signal * gain, 0.0, 1.0); value += weight * signal * amp; }
|
|
65
|
+
else if (mtype == 3) { float signal = offset - abs(n); signal *= signal; value += weight * signal * amp; weight = clamp(signal * gain, 0.0, 1.0); }
|
|
66
|
+
amp *= pow(freq, -H);
|
|
67
|
+
freq *= lacunarity;
|
|
68
|
+
}
|
|
69
|
+
return value * 0.5 + 0.5;
|
|
70
|
+
}`;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export interface NoiseTextureInputs {
|
|
6
|
+
vector?: OutputSocket;
|
|
7
|
+
scale?: number | OutputSocket;
|
|
8
|
+
detail?: number | OutputSocket;
|
|
9
|
+
roughness?: number | OutputSocket;
|
|
10
|
+
distortion?: number | OutputSocket;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Noise Texture — Blender "Noise Texture" node equivalent.
|
|
14
|
+
*
|
|
15
|
+
* Inputs: vector, scale, detail, roughness, distortion
|
|
16
|
+
* Outputs: Fac (float), Color (color)
|
|
17
|
+
*/
|
|
18
|
+
export declare class NoiseTexture extends ProcessNode {
|
|
19
|
+
get nodeType(): string;
|
|
20
|
+
static instanceSpecificDef: boolean;
|
|
21
|
+
get metadata(): NodeMetadata;
|
|
22
|
+
static glslFunction: string;
|
|
23
|
+
private readonly _inputs;
|
|
24
|
+
private readonly _outputs;
|
|
25
|
+
constructor(inputs?: NoiseTextureInputs);
|
|
26
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
27
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
28
|
+
compileDefs(): string;
|
|
29
|
+
compileCall(ctx: CompileContext): string;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=NoiseTexture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoiseTexture.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/NoiseTexture.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,kBAAkB;IACjC,MAAM,CAAC,EAAM,YAAY,CAAA;IACzB,KAAK,CAAC,EAAO,MAAM,GAAG,YAAY,CAAA;IAClC,MAAM,CAAC,EAAM,MAAM,GAAG,YAAY,CAAA;IAClC,SAAS,CAAC,EAAG,MAAM,GAAG,YAAY,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;CACnC;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,QAAQ,WAA4B;IACxC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAsCnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,kBAAuB;IAY3C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAWzC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Noise Texture — Blender "Noise Texture" node equivalent.
|
|
4
|
+
*
|
|
5
|
+
* Inputs: vector, scale, detail, roughness, distortion
|
|
6
|
+
* Outputs: Fac (float), Color (color)
|
|
7
|
+
*/
|
|
8
|
+
export class NoiseTexture extends ProcessNode {
|
|
9
|
+
get nodeType() { return 'NoiseTexture'; }
|
|
10
|
+
get metadata() {
|
|
11
|
+
return { label: 'Noise Texture', category: 'Texture', color: '#3a6b3a', cost: 'medium', costNote: 'Keep detail <= 4 on mobile.' };
|
|
12
|
+
}
|
|
13
|
+
constructor(inputs = {}) {
|
|
14
|
+
super('NoiseTexture');
|
|
15
|
+
this._inputs = this.createInputs(inputs, {
|
|
16
|
+
vector: ['color', null],
|
|
17
|
+
scale: ['float', 5.0],
|
|
18
|
+
detail: ['float', 2.0],
|
|
19
|
+
roughness: ['float', 0.5],
|
|
20
|
+
distortion: ['float', 0.0],
|
|
21
|
+
});
|
|
22
|
+
this._outputs = this.createOutputs({ Fac: 'float', Color: 'color' });
|
|
23
|
+
}
|
|
24
|
+
getInputSockets() { return this._inputs; }
|
|
25
|
+
getOutputSockets() { return this._outputs; }
|
|
26
|
+
compileDefs() { return this.glslFunction ?? NoiseTexture.glslFunction; }
|
|
27
|
+
compileCall(ctx) {
|
|
28
|
+
const p3 = this._inputs.vector.isConnected()
|
|
29
|
+
? ctx.outputVar(this._inputs.vector.connection.node, this._inputs.vector.connection.name)
|
|
30
|
+
: 'vPosition';
|
|
31
|
+
const fv = ctx.outputVar(this, 'Fac');
|
|
32
|
+
const cv = ctx.outputVar(this, 'Color');
|
|
33
|
+
return [
|
|
34
|
+
`float ${fv} = _st_noiseTexture(${p3}, ${ctx.resolveInput(this._inputs.scale)}, ${ctx.resolveInput(this._inputs.detail)}, ${ctx.resolveInput(this._inputs.roughness)}, ${ctx.resolveInput(this._inputs.distortion)});`,
|
|
35
|
+
`vec3 ${cv} = vec3(${fv});`,
|
|
36
|
+
].join('\n ');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
NoiseTexture.instanceSpecificDef = false;
|
|
40
|
+
NoiseTexture.glslFunction = `
|
|
41
|
+
float _st_phash(vec3 p) {
|
|
42
|
+
return fract(sin(dot(p, vec3(127.1, 311.7, 74.7))) * 43758.5453);
|
|
43
|
+
}
|
|
44
|
+
vec3 _st_pgrad(vec3 p) {
|
|
45
|
+
float h = _st_phash(floor(p));
|
|
46
|
+
return normalize(vec3(h, fract(h * 34.0), fract(h * 89.0)) * 2.0 - 1.0);
|
|
47
|
+
}
|
|
48
|
+
float _st_perlin(vec3 p) {
|
|
49
|
+
vec3 pi = floor(p), pf = p - pi, u = pf * pf * (3.0 - 2.0 * pf);
|
|
50
|
+
float v000 = dot(_st_pgrad(pi+vec3(0,0,0)), pf-vec3(0,0,0));
|
|
51
|
+
float v100 = dot(_st_pgrad(pi+vec3(1,0,0)), pf-vec3(1,0,0));
|
|
52
|
+
float v010 = dot(_st_pgrad(pi+vec3(0,1,0)), pf-vec3(0,1,0));
|
|
53
|
+
float v110 = dot(_st_pgrad(pi+vec3(1,1,0)), pf-vec3(1,1,0));
|
|
54
|
+
float v001 = dot(_st_pgrad(pi+vec3(0,0,1)), pf-vec3(0,0,1));
|
|
55
|
+
float v101 = dot(_st_pgrad(pi+vec3(1,0,1)), pf-vec3(1,0,1));
|
|
56
|
+
float v011 = dot(_st_pgrad(pi+vec3(0,1,1)), pf-vec3(0,1,1));
|
|
57
|
+
float v111 = dot(_st_pgrad(pi+vec3(1,1,1)), pf-vec3(1,1,1));
|
|
58
|
+
return mix(
|
|
59
|
+
mix(mix(v000,v100,u.x), mix(v010,v110,u.x), u.y),
|
|
60
|
+
mix(mix(v001,v101,u.x), mix(v011,v111,u.x), u.y), u.z
|
|
61
|
+
) * 0.5 + 0.5;
|
|
62
|
+
}
|
|
63
|
+
float _st_noiseTexture(vec3 p3, float scale, float detail, float roughness, float distortion) {
|
|
64
|
+
vec3 p = p3 * scale;
|
|
65
|
+
if (distortion > 0.0) {
|
|
66
|
+
p.x += distortion * _st_perlin(p + vec3(1.7, 9.2, 3.4));
|
|
67
|
+
p.y += distortion * _st_perlin(p + vec3(8.3, 2.8, 5.1));
|
|
68
|
+
p.z += distortion * _st_perlin(p + vec3(4.1, 6.5, 1.9));
|
|
69
|
+
}
|
|
70
|
+
float value = 0.0, amplitude = 1.0, frequency = 1.0, maxAmp = 0.0;
|
|
71
|
+
int octaves = int(clamp(detail, 1.0, 8.0));
|
|
72
|
+
for (int i = 0; i < 8; i++) {
|
|
73
|
+
if (i >= octaves) break;
|
|
74
|
+
value += amplitude * _st_perlin(p * frequency);
|
|
75
|
+
maxAmp += amplitude; amplitude *= roughness; frequency *= 2.0;
|
|
76
|
+
}
|
|
77
|
+
return value / maxAmp;
|
|
78
|
+
}`;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export interface NormalInputs {
|
|
6
|
+
normal?: OutputSocket;
|
|
7
|
+
direction?: [number, number, number];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Normal — Blender "Normal" vector node equivalent.
|
|
11
|
+
* Outputs a static customisable direction vector.
|
|
12
|
+
* Also computes a dot product of the surface normal against that direction.
|
|
13
|
+
*
|
|
14
|
+
* Inputs: normal (override), direction ([x,y,z] — default: [0,0,1])
|
|
15
|
+
* Outputs: Normal (color/vec3), Dot (float)
|
|
16
|
+
*/
|
|
17
|
+
export declare class Normal extends ProcessNode {
|
|
18
|
+
get nodeType(): string;
|
|
19
|
+
static instanceSpecificDef: boolean;
|
|
20
|
+
get metadata(): NodeMetadata;
|
|
21
|
+
private readonly direction;
|
|
22
|
+
private readonly _inputs;
|
|
23
|
+
private readonly _outputs;
|
|
24
|
+
constructor(inputs?: NormalInputs);
|
|
25
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
26
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
27
|
+
compileDefs(): string;
|
|
28
|
+
compileCall(ctx: CompileContext): string;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=Normal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Normal.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Normal.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,YAAY;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED;;;;;;;GAOG;AACH,qBAAa,MAAO,SAAQ,WAAW;IACrC,IAAI,QAAQ,WAAsB;IAClC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,YAAiB;IAOrC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAazC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Normal — Blender "Normal" vector node equivalent.
|
|
4
|
+
* Outputs a static customisable direction vector.
|
|
5
|
+
* Also computes a dot product of the surface normal against that direction.
|
|
6
|
+
*
|
|
7
|
+
* Inputs: normal (override), direction ([x,y,z] — default: [0,0,1])
|
|
8
|
+
* Outputs: Normal (color/vec3), Dot (float)
|
|
9
|
+
*/
|
|
10
|
+
export class Normal extends ProcessNode {
|
|
11
|
+
get nodeType() { return 'Normal'; }
|
|
12
|
+
get metadata() {
|
|
13
|
+
return { label: 'Normal', category: 'Vector', color: '#4a3a8a', cost: 'low' };
|
|
14
|
+
}
|
|
15
|
+
constructor(inputs = {}) {
|
|
16
|
+
super('Normal');
|
|
17
|
+
this.direction = inputs.direction ?? [0, 0, 1];
|
|
18
|
+
this._inputs = this.createInputs(inputs, { normal: ['color', null] });
|
|
19
|
+
this._outputs = this.createOutputs({ Normal: 'color', Dot: 'float' });
|
|
20
|
+
}
|
|
21
|
+
getInputSockets() { return this._inputs; }
|
|
22
|
+
getOutputSockets() { return this._outputs; }
|
|
23
|
+
compileDefs() { return ''; }
|
|
24
|
+
compileCall(ctx) {
|
|
25
|
+
const [x, y, z] = this.direction;
|
|
26
|
+
const N = this._inputs.normal.isConnected()
|
|
27
|
+
? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name)
|
|
28
|
+
: 'normalize(vNormal)';
|
|
29
|
+
const nv = ctx.outputVar(this, 'Normal');
|
|
30
|
+
const dv = ctx.outputVar(this, 'Dot');
|
|
31
|
+
const dir = `vec3(${x.toFixed(4)}, ${y.toFixed(4)}, ${z.toFixed(4)})`;
|
|
32
|
+
return [
|
|
33
|
+
`vec3 ${nv} = normalize(${dir});`,
|
|
34
|
+
`float ${dv} = dot(${N}, ${nv});`,
|
|
35
|
+
].join('\n ');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
Normal.instanceSpecificDef = true;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export interface NormalMapInputs {
|
|
6
|
+
fac?: OutputSocket;
|
|
7
|
+
strength?: number | OutputSocket;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Normal Map — converts a float noise value into a surface normal.
|
|
11
|
+
* Derives normals via numerical gradient of the input Fac value.
|
|
12
|
+
* Connect to PrincipledBSDF.normal input for surface detail lighting.
|
|
13
|
+
*
|
|
14
|
+
* Inputs:
|
|
15
|
+
* fac (float) — greyscale height value, typically from NoiseTexture.Fac
|
|
16
|
+
* strength (float) — normal intensity [0-10] default: 1.0
|
|
17
|
+
*
|
|
18
|
+
* Outputs:
|
|
19
|
+
* Normal (vector) — perturbed surface normal, ready for PrincipledBSDF.normal
|
|
20
|
+
*/
|
|
21
|
+
export declare class NormalMap extends ProcessNode {
|
|
22
|
+
get nodeType(): string;
|
|
23
|
+
static instanceSpecificDef: boolean;
|
|
24
|
+
get metadata(): NodeMetadata;
|
|
25
|
+
static glslFunction: string;
|
|
26
|
+
private readonly _inputs;
|
|
27
|
+
private readonly _outputs;
|
|
28
|
+
constructor(inputs?: NormalMapInputs);
|
|
29
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
30
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
31
|
+
compileDefs(): string;
|
|
32
|
+
compileCall(ctx: CompileContext): string;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=NormalMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NormalMap.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/NormalMap.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,eAAe;IAC9B,GAAG,CAAC,EAAO,YAAY,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;CACjC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,SAAU,SAAQ,WAAW;IACxC,IAAI,QAAQ,WAAyB;IACrC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAQ3B;IAED,MAAM,CAAC,YAAY,SAGnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,eAAoB;IASxC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAezC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Normal Map — converts a float noise value into a surface normal.
|
|
4
|
+
* Derives normals via numerical gradient of the input Fac value.
|
|
5
|
+
* Connect to PrincipledBSDF.normal input for surface detail lighting.
|
|
6
|
+
*
|
|
7
|
+
* Inputs:
|
|
8
|
+
* fac (float) — greyscale height value, typically from NoiseTexture.Fac
|
|
9
|
+
* strength (float) — normal intensity [0-10] default: 1.0
|
|
10
|
+
*
|
|
11
|
+
* Outputs:
|
|
12
|
+
* Normal (vector) — perturbed surface normal, ready for PrincipledBSDF.normal
|
|
13
|
+
*/
|
|
14
|
+
export class NormalMap extends ProcessNode {
|
|
15
|
+
get nodeType() { return 'NormalMap'; }
|
|
16
|
+
get metadata() {
|
|
17
|
+
return {
|
|
18
|
+
label: 'Normal Map',
|
|
19
|
+
category: 'Vector',
|
|
20
|
+
color: '#4a3a8a',
|
|
21
|
+
cost: 'medium',
|
|
22
|
+
costNote: 'Samples input Fac four times for gradient computation.',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
constructor(inputs = {}) {
|
|
26
|
+
super('NormalMap');
|
|
27
|
+
this._inputs = this.createInputs(inputs, {
|
|
28
|
+
fac: ['float', 0.5],
|
|
29
|
+
strength: ['float', inputs.strength ?? 1.0],
|
|
30
|
+
});
|
|
31
|
+
this._outputs = this.createOutputs({ Normal: 'color' });
|
|
32
|
+
}
|
|
33
|
+
getInputSockets() { return this._inputs; }
|
|
34
|
+
getOutputSockets() { return this._outputs; }
|
|
35
|
+
compileDefs() { return ''; }
|
|
36
|
+
compileCall(ctx) {
|
|
37
|
+
const facVar = this._inputs.fac.isConnected()
|
|
38
|
+
? ctx.outputVar(this._inputs.fac.connection.node, this._inputs.fac.connection.name)
|
|
39
|
+
: ctx.resolveInput(this._inputs.fac);
|
|
40
|
+
const strength = ctx.resolveInput(this._inputs.strength);
|
|
41
|
+
const normalVar = ctx.outputVar(this, 'Normal');
|
|
42
|
+
// Numerical gradient — samples fac variable neighbour delta via world position
|
|
43
|
+
return [
|
|
44
|
+
`float _nm_nx_${this.id} = dFdx(${facVar});`,
|
|
45
|
+
`float _nm_ny_${this.id} = dFdy(${facVar});`,
|
|
46
|
+
`vec3 ${normalVar} = normalize(vec3(-_nm_nx_${this.id} * ${strength}, 1.0, -_nm_ny_${this.id} * ${strength}));`,
|
|
47
|
+
].join('\n ');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
NormalMap.instanceSpecificDef = false;
|
|
51
|
+
NormalMap.glslFunction = `
|
|
52
|
+
vec3 _st_normalMap(float fac, float strength) {
|
|
53
|
+
return vec3(0.0, 1.0, 0.0);
|
|
54
|
+
}`;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import type { NodeMetadata } from '../../core/ShaderNode.js';
|
|
3
|
+
import type { CompileContext } from '../../core/CompileContext.js';
|
|
4
|
+
import type { OutputSocket } from '../../core/OutputSocket.js';
|
|
5
|
+
export interface PrincipledBSDFInputs {
|
|
6
|
+
baseColor?: OutputSocket | string;
|
|
7
|
+
metallic?: OutputSocket | number;
|
|
8
|
+
roughness?: OutputSocket | number;
|
|
9
|
+
ior?: OutputSocket | number;
|
|
10
|
+
alpha?: OutputSocket | number;
|
|
11
|
+
normal?: OutputSocket;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Principled BSDF — Blender "Principled BSDF" node equivalent.
|
|
15
|
+
*
|
|
16
|
+
* Inputs: baseColor, metallic, roughness, ior, alpha, normal
|
|
17
|
+
* Outputs: BSDF (shader)
|
|
18
|
+
*/
|
|
19
|
+
export declare class PrincipledBSDF extends ProcessNode {
|
|
20
|
+
get nodeType(): string;
|
|
21
|
+
static instanceSpecificDef: boolean;
|
|
22
|
+
get metadata(): NodeMetadata;
|
|
23
|
+
static glslFunction: string;
|
|
24
|
+
private readonly _inputs;
|
|
25
|
+
private readonly _outputs;
|
|
26
|
+
constructor(inputs?: PrincipledBSDFInputs);
|
|
27
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
28
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
29
|
+
compileDefs(): string;
|
|
30
|
+
compileCall(ctx: CompileContext): string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=PrincipledBSDF.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrincipledBSDF.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/PrincipledBSDF.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,oBAAoB;IACnC,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACjC,QAAQ,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IACjC,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACjC,GAAG,CAAC,EAAQ,YAAY,GAAG,MAAM,CAAA;IACjC,KAAK,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IACjC,MAAM,CAAC,EAAK,YAAY,CAAA;CACzB;AAED;;;;;GAKG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,IAAI,QAAQ,WAA8B;IAC1C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAuCnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,oBAAyB;IAa7C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}
|