@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,53 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import { ShaderNodeError } from '../../core/ShaderNodeError.js';
|
|
3
|
+
import { ShaderConfig } from '../../core/ShaderConfig.js';
|
|
4
|
+
/**
|
|
5
|
+
* Image Texture — Blender "Image Texture" node equivalent.
|
|
6
|
+
* Samples an external texture via a sampler2D uniform.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const node = new ImageTexture({ uniformName: 'uAlbedo' })
|
|
10
|
+
* // After mat.compile():
|
|
11
|
+
* mat.material.uniforms.uAlbedo = { value: new THREE.TextureLoader().load('path.jpg') }
|
|
12
|
+
*
|
|
13
|
+
* Inputs: vector (UV), uniformName (string — name of sampler2D uniform)
|
|
14
|
+
* Outputs: Color (color), Alpha (float)
|
|
15
|
+
*/
|
|
16
|
+
export class ImageTexture extends ProcessNode {
|
|
17
|
+
get nodeType() { return 'ImageTexture'; }
|
|
18
|
+
get metadata() {
|
|
19
|
+
return { label: 'Image Texture', category: 'Texture', color: '#3a6b3a', cost: 'medium' };
|
|
20
|
+
}
|
|
21
|
+
constructor(inputs) {
|
|
22
|
+
super('ImageTexture');
|
|
23
|
+
if (ShaderConfig.errorLevel !== 'off' && !inputs.uniformName) {
|
|
24
|
+
ShaderNodeError.throw({
|
|
25
|
+
nodeType: 'ImageTexture',
|
|
26
|
+
nodeId: this.id,
|
|
27
|
+
problem: 'uniformName is required.',
|
|
28
|
+
fix: 'new ImageTexture({ uniformName: "uMyTexture" })\n After compile(): mat.material.uniforms.uMyTexture = { value: texture }',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
this.uniformName = inputs.uniformName;
|
|
32
|
+
this._inputs = this.createInputs(inputs, { vector: ['vector', null] });
|
|
33
|
+
this._outputs = this.createOutputs({ Color: 'color', Alpha: 'float' });
|
|
34
|
+
}
|
|
35
|
+
getInputSockets() { return this._inputs; }
|
|
36
|
+
getOutputSockets() { return this._outputs; }
|
|
37
|
+
compileDefs() {
|
|
38
|
+
return `uniform sampler2D ${this.uniformName};`;
|
|
39
|
+
}
|
|
40
|
+
compileCall(ctx) {
|
|
41
|
+
const uv = this._inputs.vector.isConnected()
|
|
42
|
+
? ctx.outputVar(this._inputs.vector.connection.node, this._inputs.vector.connection.name)
|
|
43
|
+
: 'vUv';
|
|
44
|
+
const cv = ctx.outputVar(this, 'Color');
|
|
45
|
+
const av = ctx.outputVar(this, 'Alpha');
|
|
46
|
+
return [
|
|
47
|
+
`vec4 _it_${this.id} = texture2D(${this.uniformName}, ${uv});`,
|
|
48
|
+
`vec3 ${cv} = _it_${this.id}.rgb;`,
|
|
49
|
+
`float ${av} = _it_${this.id}.a;`,
|
|
50
|
+
].join('\n ');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
ImageTexture.instanceSpecificDef = true;
|
|
@@ -0,0 +1,29 @@
|
|
|
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 InvertColorInputs {
|
|
6
|
+
color?: OutputSocket | string;
|
|
7
|
+
fac?: OutputSocket | number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Invert Color — Blender "Invert Color" node equivalent.
|
|
11
|
+
* Produces the negative of a colour, blended by fac.
|
|
12
|
+
*
|
|
13
|
+
* Inputs: color, fac [0-1] (0 = original, 1 = fully inverted)
|
|
14
|
+
* Outputs: Color (color)
|
|
15
|
+
*/
|
|
16
|
+
export declare class InvertColor extends ProcessNode {
|
|
17
|
+
get nodeType(): string;
|
|
18
|
+
static instanceSpecificDef: boolean;
|
|
19
|
+
get metadata(): NodeMetadata;
|
|
20
|
+
static glslFunction: string;
|
|
21
|
+
private readonly _inputs;
|
|
22
|
+
private readonly _outputs;
|
|
23
|
+
constructor(inputs?: InvertColorInputs);
|
|
24
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
25
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
26
|
+
compileDefs(): string;
|
|
27
|
+
compileCall(ctx: CompileContext): string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=InvertColor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvertColor.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/InvertColor.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,iBAAiB;IAChC,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAC7B,GAAG,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;CAC9B;AAED;;;;;;GAMG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,IAAI,QAAQ,WAA2B;IACvC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAGnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,iBAAsB;IAS1C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAKzC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Invert Color — Blender "Invert Color" node equivalent.
|
|
4
|
+
* Produces the negative of a colour, blended by fac.
|
|
5
|
+
*
|
|
6
|
+
* Inputs: color, fac [0-1] (0 = original, 1 = fully inverted)
|
|
7
|
+
* Outputs: Color (color)
|
|
8
|
+
*/
|
|
9
|
+
export class InvertColor extends ProcessNode {
|
|
10
|
+
get nodeType() { return 'InvertColor'; }
|
|
11
|
+
get metadata() {
|
|
12
|
+
return { label: 'Invert Color', category: 'Color', color: '#633060', cost: 'low' };
|
|
13
|
+
}
|
|
14
|
+
constructor(inputs = {}) {
|
|
15
|
+
super('InvertColor');
|
|
16
|
+
this._inputs = this.createInputs(inputs, {
|
|
17
|
+
color: ['color', '#ffffff'],
|
|
18
|
+
fac: ['float', inputs.fac ?? 1.0],
|
|
19
|
+
});
|
|
20
|
+
this._outputs = this.createOutputs({ Color: 'color' });
|
|
21
|
+
}
|
|
22
|
+
getInputSockets() { return this._inputs; }
|
|
23
|
+
getOutputSockets() { return this._outputs; }
|
|
24
|
+
compileDefs() { return InvertColor.glslFunction; }
|
|
25
|
+
compileCall(ctx) {
|
|
26
|
+
const col = ctx.resolveInput(this._inputs.color);
|
|
27
|
+
const fac = ctx.resolveInput(this._inputs.fac);
|
|
28
|
+
return `vec3 ${ctx.outputVar(this, 'Color')} = _st_invertColor(${col}, ${fac});`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
InvertColor.instanceSpecificDef = false;
|
|
32
|
+
InvertColor.glslFunction = `
|
|
33
|
+
vec3 _st_invertColor(vec3 col, float fac) {
|
|
34
|
+
return mix(col, 1.0 - col, clamp(fac, 0.0, 1.0));
|
|
35
|
+
}`;
|
|
@@ -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 MagicTextureInputs {
|
|
6
|
+
vector?: OutputSocket;
|
|
7
|
+
scale?: number | OutputSocket;
|
|
8
|
+
distortion?: number | OutputSocket;
|
|
9
|
+
depth?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Magic Texture — Blender "Magic Texture" node equivalent.
|
|
13
|
+
* Swirling psychedelic colour pattern from sine wave interference.
|
|
14
|
+
*
|
|
15
|
+
* Outputs: Color (color), Fac (float)
|
|
16
|
+
*/
|
|
17
|
+
export declare class MagicTexture extends ProcessNode {
|
|
18
|
+
get nodeType(): string;
|
|
19
|
+
static instanceSpecificDef: boolean;
|
|
20
|
+
get metadata(): NodeMetadata;
|
|
21
|
+
static glslFunction: string;
|
|
22
|
+
private readonly _inputs;
|
|
23
|
+
private readonly _outputs;
|
|
24
|
+
constructor(inputs?: MagicTextureInputs);
|
|
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=MagicTexture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MagicTexture.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/MagicTexture.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,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;IAClC,KAAK,CAAC,EAAO,MAAM,CAAA;CACpB;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,SAanB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,kBAAuB;IAU3C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAczC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Magic Texture — Blender "Magic Texture" node equivalent.
|
|
4
|
+
* Swirling psychedelic colour pattern from sine wave interference.
|
|
5
|
+
*
|
|
6
|
+
* Outputs: Color (color), Fac (float)
|
|
7
|
+
*/
|
|
8
|
+
export class MagicTexture extends ProcessNode {
|
|
9
|
+
get nodeType() { return 'MagicTexture'; }
|
|
10
|
+
get metadata() {
|
|
11
|
+
return { label: 'Magic Texture', category: 'Texture', color: '#3a6b3a', cost: 'low' };
|
|
12
|
+
}
|
|
13
|
+
constructor(inputs = {}) {
|
|
14
|
+
super('MagicTexture');
|
|
15
|
+
this._inputs = this.createInputs(inputs, {
|
|
16
|
+
vector: ['color', null],
|
|
17
|
+
scale: ['float', inputs.scale ?? 5.0],
|
|
18
|
+
distortion: ['float', inputs.distortion ?? 1.0],
|
|
19
|
+
});
|
|
20
|
+
this._outputs = this.createOutputs({ Color: 'color', Fac: 'float' });
|
|
21
|
+
}
|
|
22
|
+
getInputSockets() { return this._inputs; }
|
|
23
|
+
getOutputSockets() { return this._outputs; }
|
|
24
|
+
compileDefs() { return MagicTexture.glslFunction; }
|
|
25
|
+
compileCall(ctx) {
|
|
26
|
+
const vec = this._inputs.vector.isConnected()
|
|
27
|
+
? `vec3(${ctx.outputVar(this._inputs.vector.connection.node, this._inputs.vector.connection.name)})`
|
|
28
|
+
: 'vec3(vUv, 0.0)';
|
|
29
|
+
const sc = ctx.resolveInput(this._inputs.scale);
|
|
30
|
+
const di = ctx.resolveInput(this._inputs.distortion);
|
|
31
|
+
const cv = ctx.outputVar(this, 'Color');
|
|
32
|
+
const fv = ctx.outputVar(this, 'Fac');
|
|
33
|
+
return [
|
|
34
|
+
`vec4 _mg_${this.id} = _st_magicTexture(${vec}, ${sc}, ${di});`,
|
|
35
|
+
`vec3 ${cv} = _mg_${this.id}.rgb;`,
|
|
36
|
+
`float ${fv} = _mg_${this.id}.a;`,
|
|
37
|
+
].join('\n ');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
MagicTexture.instanceSpecificDef = false;
|
|
41
|
+
MagicTexture.glslFunction = `
|
|
42
|
+
vec4 _st_magicTexture(vec3 p, float scale, float distortion) {
|
|
43
|
+
p *= scale;
|
|
44
|
+
float x = sin((p.x + p.y + p.z) * distortion);
|
|
45
|
+
float y = cos((-p.x + p.y - p.z) * distortion);
|
|
46
|
+
float z = -cos((-p.x - p.y + p.z) * distortion);
|
|
47
|
+
vec3 col = (vec3(x, y, z) + 1.0) * 0.5;
|
|
48
|
+
col = vec3(
|
|
49
|
+
sin((col.x + col.y) * 6.28318),
|
|
50
|
+
sin((col.y + col.z) * 6.28318),
|
|
51
|
+
sin((col.z + col.x) * 6.28318)
|
|
52
|
+
) * 0.5 + 0.5;
|
|
53
|
+
return vec4(col, (col.r + col.g + col.b) / 3.0);
|
|
54
|
+
}`;
|
|
@@ -0,0 +1,38 @@
|
|
|
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 MapRangeMode = 'LINEAR' | 'STEPPED' | 'SMOOTHSTEP' | 'SMOOTHERSTEP';
|
|
6
|
+
export interface MapRangeInputs {
|
|
7
|
+
value?: OutputSocket | number;
|
|
8
|
+
fromMin?: OutputSocket | number;
|
|
9
|
+
fromMax?: OutputSocket | number;
|
|
10
|
+
toMin?: OutputSocket | number;
|
|
11
|
+
toMax?: OutputSocket | number;
|
|
12
|
+
steps?: OutputSocket | number;
|
|
13
|
+
mode?: MapRangeMode;
|
|
14
|
+
clamp?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Map Range — Blender "Map Range" converter node equivalent.
|
|
18
|
+
* Remaps a value from one range to another.
|
|
19
|
+
*
|
|
20
|
+
* Inputs: value, fromMin, fromMax, toMin, toMax, steps, mode, clamp
|
|
21
|
+
* Outputs: Result (float)
|
|
22
|
+
*/
|
|
23
|
+
export declare class MapRange extends ProcessNode {
|
|
24
|
+
get nodeType(): string;
|
|
25
|
+
static instanceSpecificDef: boolean;
|
|
26
|
+
get metadata(): NodeMetadata;
|
|
27
|
+
static glslFunction: string;
|
|
28
|
+
private readonly mode;
|
|
29
|
+
private readonly doClamp;
|
|
30
|
+
private readonly _inputs;
|
|
31
|
+
private readonly _outputs;
|
|
32
|
+
constructor(inputs?: MapRangeInputs);
|
|
33
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
34
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
35
|
+
compileDefs(): string;
|
|
36
|
+
compileCall(ctx: CompileContext): string;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=MapRange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapRange.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/MapRange.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,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,CAAA;AAE/E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,OAAO,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAChC,OAAO,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAChC,KAAK,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,KAAK,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,KAAK,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,IAAI,CAAC,EAAM,YAAY,CAAA;IACvB,KAAK,CAAC,EAAK,OAAO,CAAA;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,WAAW;IACvC,IAAI,QAAQ,WAAwB;IACpC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SASnB;IAEA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,cAAmB;IAevC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAUzC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Map Range — Blender "Map Range" converter node equivalent.
|
|
4
|
+
* Remaps a value from one range to another.
|
|
5
|
+
*
|
|
6
|
+
* Inputs: value, fromMin, fromMax, toMin, toMax, steps, mode, clamp
|
|
7
|
+
* Outputs: Result (float)
|
|
8
|
+
*/
|
|
9
|
+
export class MapRange extends ProcessNode {
|
|
10
|
+
get nodeType() { return 'MapRange'; }
|
|
11
|
+
get metadata() {
|
|
12
|
+
return { label: 'Map Range', category: 'Converter', color: '#4a3a6a', cost: 'low' };
|
|
13
|
+
}
|
|
14
|
+
constructor(inputs = {}) {
|
|
15
|
+
super('MapRange');
|
|
16
|
+
this.mode = inputs.mode ?? 'LINEAR';
|
|
17
|
+
this.doClamp = inputs.clamp ?? false;
|
|
18
|
+
this._inputs = this.createInputs(inputs, {
|
|
19
|
+
value: ['float', inputs.value ?? 0.5],
|
|
20
|
+
fromMin: ['float', inputs.fromMin ?? 0.0],
|
|
21
|
+
fromMax: ['float', inputs.fromMax ?? 1.0],
|
|
22
|
+
toMin: ['float', inputs.toMin ?? 0.0],
|
|
23
|
+
toMax: ['float', inputs.toMax ?? 1.0],
|
|
24
|
+
steps: ['float', inputs.steps ?? 4.0],
|
|
25
|
+
});
|
|
26
|
+
this._outputs = this.createOutputs({ Result: 'float' });
|
|
27
|
+
}
|
|
28
|
+
getInputSockets() { return this._inputs; }
|
|
29
|
+
getOutputSockets() { return this._outputs; }
|
|
30
|
+
compileDefs() { return MapRange.glslFunction; }
|
|
31
|
+
compileCall(ctx) {
|
|
32
|
+
const modeIdx = { LINEAR: 0, STEPPED: 1, SMOOTHSTEP: 2, SMOOTHERSTEP: 3 }[this.mode];
|
|
33
|
+
const v = ctx.resolveInput(this._inputs.value);
|
|
34
|
+
const f0 = ctx.resolveInput(this._inputs.fromMin);
|
|
35
|
+
const f1 = ctx.resolveInput(this._inputs.fromMax);
|
|
36
|
+
const t0 = ctx.resolveInput(this._inputs.toMin);
|
|
37
|
+
const t1 = ctx.resolveInput(this._inputs.toMax);
|
|
38
|
+
const st = ctx.resolveInput(this._inputs.steps);
|
|
39
|
+
return `float ${ctx.outputVar(this, 'Result')} = _st_mapRange(${v}, ${f0}, ${f1}, ${t0}, ${t1}, ${st}, ${modeIdx}, ${this.doClamp});`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
MapRange.instanceSpecificDef = false;
|
|
43
|
+
MapRange.glslFunction = `
|
|
44
|
+
float _st_mapRange(float v, float fMin, float fMax, float tMin, float tMax, float steps, int mode, bool doClamp) {
|
|
45
|
+
float range = fMax - fMin;
|
|
46
|
+
float t = range == 0.0 ? 0.0 : (v - fMin) / range;
|
|
47
|
+
if (mode == 1) t = (steps > 0.0) ? floor(t * steps + 0.5) / steps : t;
|
|
48
|
+
else if (mode == 2) t = t * t * (3.0 - 2.0 * t);
|
|
49
|
+
else if (mode == 3) t = t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
|
|
50
|
+
if (doClamp) t = clamp(t, 0.0, 1.0);
|
|
51
|
+
return tMin + t * (tMax - tMin);
|
|
52
|
+
}`;
|
|
@@ -0,0 +1,37 @@
|
|
|
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 MappingMode = 'TEXTURE' | 'POINT' | 'VECTOR' | 'NORMAL';
|
|
6
|
+
export interface MappingInputs {
|
|
7
|
+
mode?: MappingMode;
|
|
8
|
+
vector?: OutputSocket;
|
|
9
|
+
location?: [number, number, number];
|
|
10
|
+
rotation?: [number, number, number];
|
|
11
|
+
scale?: [number, number, number];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Mapping — Blender "Mapping" node equivalent.
|
|
15
|
+
* Transforms UV/vector coordinates: translate, rotate, scale.
|
|
16
|
+
*
|
|
17
|
+
* Inputs: vector, location, rotation (degrees), scale
|
|
18
|
+
* Outputs: Vector (vector/color)
|
|
19
|
+
*/
|
|
20
|
+
export declare class Mapping extends ProcessNode {
|
|
21
|
+
get nodeType(): string;
|
|
22
|
+
static instanceSpecificDef: boolean;
|
|
23
|
+
get metadata(): NodeMetadata;
|
|
24
|
+
static glslFunction: string;
|
|
25
|
+
private readonly loc;
|
|
26
|
+
private readonly rot;
|
|
27
|
+
private readonly scl;
|
|
28
|
+
private readonly mode;
|
|
29
|
+
private readonly _inputs;
|
|
30
|
+
private readonly _outputs;
|
|
31
|
+
constructor(inputs?: MappingInputs);
|
|
32
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
33
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
34
|
+
compileDefs(): string;
|
|
35
|
+
compileCall(ctx: CompileContext): string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mapping.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Mapping.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,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEnE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAM,WAAW,CAAA;IACtB,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,KAAK,CAAC,EAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AAED;;;;;;GAMG;AACH,qBAAa,OAAQ,SAAQ,WAAW;IACtC,IAAI,QAAQ,WAAuB;IACnC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAYnB;IAEA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,aAAkB;IAUtC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAkBzC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
/**
|
|
3
|
+
* Mapping — Blender "Mapping" node equivalent.
|
|
4
|
+
* Transforms UV/vector coordinates: translate, rotate, scale.
|
|
5
|
+
*
|
|
6
|
+
* Inputs: vector, location, rotation (degrees), scale
|
|
7
|
+
* Outputs: Vector (vector/color)
|
|
8
|
+
*/
|
|
9
|
+
export class Mapping extends ProcessNode {
|
|
10
|
+
get nodeType() { return 'Mapping'; }
|
|
11
|
+
get metadata() {
|
|
12
|
+
return { label: 'Mapping', category: 'Vector', color: '#4a3a8a', cost: 'low' };
|
|
13
|
+
}
|
|
14
|
+
constructor(inputs = {}) {
|
|
15
|
+
super('Mapping');
|
|
16
|
+
this.mode = inputs.mode ?? 'TEXTURE';
|
|
17
|
+
this.loc = inputs.location ?? [0, 0, 0];
|
|
18
|
+
this.rot = inputs.rotation ?? [0, 0, 0];
|
|
19
|
+
this.scl = inputs.scale ?? [1, 1, 1];
|
|
20
|
+
this._inputs = this.createInputs(inputs, { vector: ['color', null] });
|
|
21
|
+
this._outputs = this.createOutputs({ Vector: 'color' });
|
|
22
|
+
}
|
|
23
|
+
getInputSockets() { return this._inputs; }
|
|
24
|
+
getOutputSockets() { return this._outputs; }
|
|
25
|
+
compileDefs() { return Mapping.glslFunction; }
|
|
26
|
+
compileCall(ctx) {
|
|
27
|
+
const v = ctx.resolveInput(this._inputs.vector);
|
|
28
|
+
const out = ctx.outputVar(this, 'Vector');
|
|
29
|
+
const toRad = (d) => (d * Math.PI / 180).toFixed(6);
|
|
30
|
+
const [lx, ly, lz] = this.loc;
|
|
31
|
+
const [rx, ry, rz] = this.rot.map(Number);
|
|
32
|
+
const [sx, sy, sz] = this.scl;
|
|
33
|
+
return [
|
|
34
|
+
`vec3 _mp_v_${this.id} = ${v};`,
|
|
35
|
+
`_mp_v_${this.id} = _mp_v_${this.id} - vec3(${lx.toFixed(4)}, ${ly.toFixed(4)}, ${lz.toFixed(4)});`,
|
|
36
|
+
`_mp_v_${this.id} = _st_rotateX(_mp_v_${this.id}, ${toRad(rx)});`,
|
|
37
|
+
`_mp_v_${this.id} = _st_rotateY(_mp_v_${this.id}, ${toRad(ry)});`,
|
|
38
|
+
`_mp_v_${this.id} = _st_rotateZ(_mp_v_${this.id}, ${toRad(rz)});`,
|
|
39
|
+
`_mp_v_${this.id} = _mp_v_${this.id} * vec3(${sx.toFixed(4)}, ${sy.toFixed(4)}, ${sz.toFixed(4)});`,
|
|
40
|
+
`vec3 ${out} = _mp_v_${this.id};`,
|
|
41
|
+
].join('\n ');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
Mapping.instanceSpecificDef = false;
|
|
45
|
+
Mapping.glslFunction = `
|
|
46
|
+
vec3 _st_rotateX(vec3 v, float a) {
|
|
47
|
+
float c = cos(a), s = sin(a);
|
|
48
|
+
return vec3(v.x, c * v.y - s * v.z, s * v.y + c * v.z);
|
|
49
|
+
}
|
|
50
|
+
vec3 _st_rotateY(vec3 v, float a) {
|
|
51
|
+
float c = cos(a), s = sin(a);
|
|
52
|
+
return vec3(c * v.x + s * v.z, v.y, -s * v.x + c * v.z);
|
|
53
|
+
}
|
|
54
|
+
vec3 _st_rotateZ(vec3 v, float a) {
|
|
55
|
+
float c = cos(a), s = sin(a);
|
|
56
|
+
return vec3(c * v.x - s * v.y, s * v.x + c * v.y, v.z);
|
|
57
|
+
}`;
|
|
@@ -0,0 +1,40 @@
|
|
|
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 MathMode = 'ADD' | 'SUBTRACT' | 'MULTIPLY' | 'DIVIDE' | 'POWER' | 'LOGARITHM' | 'SQRT' | 'INV_SQRT' | 'ABSOLUTE' | 'ROUND' | 'FLOOR' | 'CEIL' | 'TRUNCATE' | 'FRACTION' | 'MINIMUM' | 'MAXIMUM' | 'LESS_THAN' | 'GREATER_THAN' | 'CLAMP' | 'SNAP' | 'SINE' | 'COSINE' | 'TANGENT' | 'ARCSINE' | 'ARCCOSINE' | 'ARCTANGENT' | 'ARCTAN2' | 'MODULO' | 'WRAP' | 'PINGPONG' | 'SMOOTH_MIN' | 'SMOOTH_MAX';
|
|
6
|
+
export interface MathInputs {
|
|
7
|
+
mode: MathMode;
|
|
8
|
+
a?: OutputSocket | number;
|
|
9
|
+
b?: OutputSocket | number;
|
|
10
|
+
c?: OutputSocket | number;
|
|
11
|
+
clamp?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Math — Blender "Math" node equivalent.
|
|
15
|
+
* Single node with mode selector covering all arithmetic, trig, and comparison ops.
|
|
16
|
+
*
|
|
17
|
+
* Inputs: a, b (floats or connected sockets), c for ternary ops
|
|
18
|
+
* Outputs: Value (float)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* new Math({ mode: 'ADD', a: noise.output('Fac'), b: 0.5 })
|
|
22
|
+
* new Math({ mode: 'CLAMP', a: noise.output('Fac') })
|
|
23
|
+
* new Math({ mode: 'SINE', a: noise.output('Fac') })
|
|
24
|
+
*/
|
|
25
|
+
export declare class Math extends ProcessNode {
|
|
26
|
+
get nodeType(): string;
|
|
27
|
+
static instanceSpecificDef: boolean;
|
|
28
|
+
get metadata(): NodeMetadata;
|
|
29
|
+
private readonly mode;
|
|
30
|
+
private readonly clamp;
|
|
31
|
+
private readonly _inputs;
|
|
32
|
+
private readonly _outputs;
|
|
33
|
+
constructor(inputs: MathInputs);
|
|
34
|
+
getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
|
|
35
|
+
getOutputSockets(): Record<string, OutputSocket>;
|
|
36
|
+
compileDefs(): string;
|
|
37
|
+
compileCall(ctx: CompileContext): string;
|
|
38
|
+
private buildExpr;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Math.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAGvD,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,QAAQ,GAEhB,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAC1C,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAExD,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAEpD,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,GAEvE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAElF,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAA;AAEhE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAI,QAAQ,CAAA;IAChB,CAAC,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IAC7B,CAAC,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IAC7B,CAAC,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,IAAK,SAAQ,WAAW;IACnC,IAAI,QAAQ,WAAoB;IAChC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAO3B;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,EAAE,UAAU;IAuB9B,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAErB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;IAWxC,OAAO,CAAC,SAAS;CA0ClB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ProcessNode } from '../../core/ProcessNode.js';
|
|
2
|
+
import { ShaderNodeError } from '../../core/ShaderNodeError.js';
|
|
3
|
+
import { ShaderConfig } from '../../core/ShaderConfig.js';
|
|
4
|
+
/**
|
|
5
|
+
* Math — Blender "Math" node equivalent.
|
|
6
|
+
* Single node with mode selector covering all arithmetic, trig, and comparison ops.
|
|
7
|
+
*
|
|
8
|
+
* Inputs: a, b (floats or connected sockets), c for ternary ops
|
|
9
|
+
* Outputs: Value (float)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* new Math({ mode: 'ADD', a: noise.output('Fac'), b: 0.5 })
|
|
13
|
+
* new Math({ mode: 'CLAMP', a: noise.output('Fac') })
|
|
14
|
+
* new Math({ mode: 'SINE', a: noise.output('Fac') })
|
|
15
|
+
*/
|
|
16
|
+
export class Math extends ProcessNode {
|
|
17
|
+
get nodeType() { return 'Math'; }
|
|
18
|
+
get metadata() {
|
|
19
|
+
return {
|
|
20
|
+
label: 'Math',
|
|
21
|
+
category: 'Converter',
|
|
22
|
+
color: '#4a3a6a',
|
|
23
|
+
cost: 'low',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
constructor(inputs) {
|
|
27
|
+
super('Math');
|
|
28
|
+
if (ShaderConfig.errorLevel !== 'off' && !inputs.mode) {
|
|
29
|
+
ShaderNodeError.throw({
|
|
30
|
+
nodeType: 'Math',
|
|
31
|
+
nodeId: this.id,
|
|
32
|
+
problem: 'mode is required.',
|
|
33
|
+
fix: 'new Math({ mode: "ADD", a: ..., b: ... })',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
this.mode = inputs.mode;
|
|
37
|
+
this.clamp = inputs.clamp ?? false;
|
|
38
|
+
this._inputs = this.createInputs(inputs, {
|
|
39
|
+
a: ['float', inputs.a ?? 0.0],
|
|
40
|
+
b: ['float', inputs.b ?? 0.0],
|
|
41
|
+
c: ['float', inputs.c ?? 0.5],
|
|
42
|
+
});
|
|
43
|
+
this._outputs = this.createOutputs({ Value: 'float' });
|
|
44
|
+
}
|
|
45
|
+
getInputSockets() { return this._inputs; }
|
|
46
|
+
getOutputSockets() { return this._outputs; }
|
|
47
|
+
compileDefs() { return ''; }
|
|
48
|
+
compileCall(ctx) {
|
|
49
|
+
const a = ctx.resolveInput(this._inputs.a);
|
|
50
|
+
const b = ctx.resolveInput(this._inputs.b);
|
|
51
|
+
const c = ctx.resolveInput(this._inputs.c);
|
|
52
|
+
const out = ctx.outputVar(this, 'Value');
|
|
53
|
+
const expr = this.buildExpr(a, b, c);
|
|
54
|
+
const final = this.clamp ? `clamp(${expr}, 0.0, 1.0)` : expr;
|
|
55
|
+
return `float ${out} = ${final};`;
|
|
56
|
+
}
|
|
57
|
+
buildExpr(a, b, c) {
|
|
58
|
+
switch (this.mode) {
|
|
59
|
+
// Basic
|
|
60
|
+
case 'ADD': return `(${a} + ${b})`;
|
|
61
|
+
case 'SUBTRACT': return `(${a} - ${b})`;
|
|
62
|
+
case 'MULTIPLY': return `(${a} * ${b})`;
|
|
63
|
+
case 'DIVIDE': return `(${b} != 0.0 ? ${a} / ${b} : 0.0)`;
|
|
64
|
+
case 'POWER': return `pow(max(${a}, 0.0), ${b})`;
|
|
65
|
+
case 'LOGARITHM': return `(${a} > 0.0 && ${b} > 0.0 ? log(${a}) / log(${b}) : 0.0)`;
|
|
66
|
+
case 'SQRT': return `sqrt(max(${a}, 0.0))`;
|
|
67
|
+
case 'INV_SQRT': return `(${a} > 0.0 ? 1.0 / sqrt(${a}) : 0.0)`;
|
|
68
|
+
case 'ABSOLUTE': return `abs(${a})`;
|
|
69
|
+
// Rounding
|
|
70
|
+
case 'ROUND': return `floor(${a} + 0.5)`;
|
|
71
|
+
case 'FLOOR': return `floor(${a})`;
|
|
72
|
+
case 'CEIL': return `ceil(${a})`;
|
|
73
|
+
case 'TRUNCATE': return `trunc(${a})`;
|
|
74
|
+
case 'FRACTION': return `fract(${a})`;
|
|
75
|
+
// Comparison
|
|
76
|
+
case 'MINIMUM': return `min(${a}, ${b})`;
|
|
77
|
+
case 'MAXIMUM': return `max(${a}, ${b})`;
|
|
78
|
+
case 'LESS_THAN': return `(${a} < ${b} ? 1.0 : 0.0)`;
|
|
79
|
+
case 'GREATER_THAN': return `(${a} > ${b} ? 1.0 : 0.0)`;
|
|
80
|
+
case 'CLAMP': return `clamp(${a}, ${b}, ${c})`;
|
|
81
|
+
case 'SNAP': return `(${b} != 0.0 ? floor(${a} / ${b}) * ${b} : 0.0)`;
|
|
82
|
+
// Trig
|
|
83
|
+
case 'SINE': return `sin(${a})`;
|
|
84
|
+
case 'COSINE': return `cos(${a})`;
|
|
85
|
+
case 'TANGENT': return `tan(${a})`;
|
|
86
|
+
case 'ARCSINE': return `asin(clamp(${a}, -1.0, 1.0))`;
|
|
87
|
+
case 'ARCCOSINE': return `acos(clamp(${a}, -1.0, 1.0))`;
|
|
88
|
+
case 'ARCTANGENT': return `atan(${a})`;
|
|
89
|
+
case 'ARCTAN2': return `atan(${a}, ${b})`;
|
|
90
|
+
// Special
|
|
91
|
+
case 'MODULO': return `(${b} != 0.0 ? mod(${a}, ${b}) : 0.0)`;
|
|
92
|
+
case 'WRAP': return `(${c} != 0.0 ? mod(${a} - ${b}, ${c} - ${b}) + ${b} : ${b})`;
|
|
93
|
+
case 'PINGPONG': return `(${b} != 0.0 ? abs(fract((${a} - ${b}) / (${b} * 2.0)) * ${b} * 2.0 - ${b}) : 0.0)`;
|
|
94
|
+
case 'SMOOTH_MIN': return `(exp(-${c} * ${a}) + exp(-${c} * ${b}) > 0.0 ? -log(exp(-${c} * ${a}) + exp(-${c} * ${b})) / max(${c}, 0.0001) : min(${a}, ${b}))`;
|
|
95
|
+
case 'SMOOTH_MAX': return `(exp(${c} * ${a}) + exp(${c} * ${b}) > 0.0 ? log(exp(${c} * ${a}) + exp(${c} * ${b})) / max(${c}, 0.0001) : max(${a}, ${b}))`;
|
|
96
|
+
default: return `${a}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
Math.instanceSpecificDef = true; // each instance emits its own operation
|
|
@@ -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 type MixRGBMode = 'MIX' | 'DARKEN' | 'MULTIPLY' | 'BURN' | 'LIGHTEN' | 'SCREEN' | 'DODGE' | 'ADD' | 'OVERLAY' | 'SOFT_LIGHT' | 'LINEAR_LIGHT' | 'DIFFERENCE' | 'EXCLUSION' | 'SUBTRACT' | 'DIVIDE' | 'HUE' | 'SATURATION' | 'COLOR' | 'LUMINOSITY';
|
|
6
|
+
export interface MixRGBInputs {
|
|
7
|
+
mode?: MixRGBMode;
|
|
8
|
+
fac?: OutputSocket | number;
|
|
9
|
+
colorA?: OutputSocket | string;
|
|
10
|
+
colorB?: OutputSocket | string;
|
|
11
|
+
clamp?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Mix RGB — Blender "Mix" color node equivalent.
|
|
15
|
+
* Blends two colours using a mode selector.
|
|
16
|
+
*
|
|
17
|
+
* Inputs: fac [0-1], colorA, colorB
|
|
18
|
+
* Outputs: Color (color)
|
|
19
|
+
*/
|
|
20
|
+
export declare class MixRGB extends ProcessNode {
|
|
21
|
+
get nodeType(): string;
|
|
22
|
+
static instanceSpecificDef: boolean;
|
|
23
|
+
get metadata(): NodeMetadata;
|
|
24
|
+
static glslFunction: string;
|
|
25
|
+
private readonly mode;
|
|
26
|
+
private readonly clamp;
|
|
27
|
+
private readonly _inputs;
|
|
28
|
+
private readonly _outputs;
|
|
29
|
+
constructor(inputs?: MixRGBInputs);
|
|
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=MixRGB.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MixRGB.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/MixRGB.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,UAAU,GAClB,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GACtC,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GACtC,SAAS,GAAG,YAAY,GAAG,cAAc,GACzC,YAAY,GAAG,WAAW,GAAG,UAAU,GACvC,QAAQ,GAAG,KAAK,GAAG,YAAY,GAAG,OAAO,GAAG,YAAY,CAAA;AAE5D,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAI,UAAU,CAAA;IACnB,GAAG,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAC9B,KAAK,CAAC,EAAG,OAAO,CAAA;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,MAAO,SAAQ,WAAW;IACrC,IAAI,QAAQ,WAAsB;IAClC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAoBnB;IAEA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,YAAiB;IAYrC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAazC"}
|