@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.
Files changed (297) hide show
  1. package/README.md +90 -0
  2. package/dist/bundle.js +5578 -0
  3. package/dist/core/CompileContext.d.ts +60 -0
  4. package/dist/core/CompileContext.d.ts.map +1 -0
  5. package/dist/core/CompileContext.js +276 -0
  6. package/dist/core/InputNode.d.ts +11 -0
  7. package/dist/core/InputNode.d.ts.map +1 -0
  8. package/dist/core/InputNode.js +13 -0
  9. package/dist/core/InputSocket.d.ts +21 -0
  10. package/dist/core/InputSocket.d.ts.map +1 -0
  11. package/dist/core/InputSocket.js +23 -0
  12. package/dist/core/OutputNode.d.ts +30 -0
  13. package/dist/core/OutputNode.d.ts.map +1 -0
  14. package/dist/core/OutputNode.js +60 -0
  15. package/dist/core/OutputSocket.d.ts +18 -0
  16. package/dist/core/OutputSocket.d.ts.map +1 -0
  17. package/dist/core/OutputSocket.js +16 -0
  18. package/dist/core/ProcessNode.d.ts +8 -0
  19. package/dist/core/ProcessNode.d.ts.map +1 -0
  20. package/dist/core/ProcessNode.js +7 -0
  21. package/dist/core/ShaderConfig.d.ts +13 -0
  22. package/dist/core/ShaderConfig.d.ts.map +1 -0
  23. package/dist/core/ShaderConfig.js +11 -0
  24. package/dist/core/ShaderNode.d.ts +114 -0
  25. package/dist/core/ShaderNode.d.ts.map +1 -0
  26. package/dist/core/ShaderNode.js +156 -0
  27. package/dist/core/ShaderNodeError.d.ts +32 -0
  28. package/dist/core/ShaderNodeError.d.ts.map +1 -0
  29. package/dist/core/ShaderNodeError.js +61 -0
  30. package/dist/core/SocketType.d.ts +12 -0
  31. package/dist/core/SocketType.d.ts.map +1 -0
  32. package/dist/core/SocketType.js +7 -0
  33. package/dist/index.d.ts +164 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +108 -0
  36. package/dist/nodes/input/Attribute.d.ts +45 -0
  37. package/dist/nodes/input/Attribute.d.ts.map +1 -0
  38. package/dist/nodes/input/Attribute.js +58 -0
  39. package/dist/nodes/input/CameraData.d.ts +21 -0
  40. package/dist/nodes/input/CameraData.d.ts.map +1 -0
  41. package/dist/nodes/input/CameraData.js +33 -0
  42. package/dist/nodes/input/ColorAttribute.d.ts +28 -0
  43. package/dist/nodes/input/ColorAttribute.d.ts.map +1 -0
  44. package/dist/nodes/input/ColorAttribute.js +32 -0
  45. package/dist/nodes/input/Geometry.d.ts +23 -0
  46. package/dist/nodes/input/Geometry.d.ts.map +1 -0
  47. package/dist/nodes/input/Geometry.js +38 -0
  48. package/dist/nodes/input/HairInfo.d.ts +38 -0
  49. package/dist/nodes/input/HairInfo.d.ts.map +1 -0
  50. package/dist/nodes/input/HairInfo.js +50 -0
  51. package/dist/nodes/input/LayerWeight.d.ts +26 -0
  52. package/dist/nodes/input/LayerWeight.d.ts.map +1 -0
  53. package/dist/nodes/input/LayerWeight.js +35 -0
  54. package/dist/nodes/input/LightPath.d.ts +60 -0
  55. package/dist/nodes/input/LightPath.d.ts.map +1 -0
  56. package/dist/nodes/input/LightPath.js +112 -0
  57. package/dist/nodes/input/ObjectInfo.d.ts +22 -0
  58. package/dist/nodes/input/ObjectInfo.d.ts.map +1 -0
  59. package/dist/nodes/input/ObjectInfo.js +41 -0
  60. package/dist/nodes/input/OceanAttribute.d.ts +32 -0
  61. package/dist/nodes/input/OceanAttribute.d.ts.map +1 -0
  62. package/dist/nodes/input/OceanAttribute.js +38 -0
  63. package/dist/nodes/input/ParticleInfo.d.ts +31 -0
  64. package/dist/nodes/input/ParticleInfo.d.ts.map +1 -0
  65. package/dist/nodes/input/ParticleInfo.js +44 -0
  66. package/dist/nodes/input/RGB.d.ts +19 -0
  67. package/dist/nodes/input/RGB.d.ts.map +1 -0
  68. package/dist/nodes/input/RGB.js +23 -0
  69. package/dist/nodes/input/ScreenCamera.d.ts +37 -0
  70. package/dist/nodes/input/ScreenCamera.d.ts.map +1 -0
  71. package/dist/nodes/input/ScreenCamera.js +59 -0
  72. package/dist/nodes/input/Tangent.d.ts +21 -0
  73. package/dist/nodes/input/Tangent.d.ts.map +1 -0
  74. package/dist/nodes/input/Tangent.js +30 -0
  75. package/dist/nodes/input/TextureCoordinate.d.ts +17 -0
  76. package/dist/nodes/input/TextureCoordinate.d.ts.map +1 -0
  77. package/dist/nodes/input/TextureCoordinate.js +24 -0
  78. package/dist/nodes/input/UVMap.d.ts +20 -0
  79. package/dist/nodes/input/UVMap.d.ts.map +1 -0
  80. package/dist/nodes/input/UVMap.js +23 -0
  81. package/dist/nodes/input/Value.d.ts +19 -0
  82. package/dist/nodes/input/Value.d.ts.map +1 -0
  83. package/dist/nodes/input/Value.js +22 -0
  84. package/dist/nodes/input/Wireframe.d.ts +25 -0
  85. package/dist/nodes/input/Wireframe.d.ts.map +1 -0
  86. package/dist/nodes/input/Wireframe.js +30 -0
  87. package/dist/nodes/output/Displacement.d.ts +28 -0
  88. package/dist/nodes/output/Displacement.d.ts.map +1 -0
  89. package/dist/nodes/output/Displacement.js +34 -0
  90. package/dist/nodes/output/MaterialOutput.d.ts +43 -0
  91. package/dist/nodes/output/MaterialOutput.d.ts.map +1 -0
  92. package/dist/nodes/output/MaterialOutput.js +118 -0
  93. package/dist/nodes/output/ScreenOutput.d.ts +38 -0
  94. package/dist/nodes/output/ScreenOutput.d.ts.map +1 -0
  95. package/dist/nodes/output/ScreenOutput.js +88 -0
  96. package/dist/nodes/process/AddShader.d.ts +30 -0
  97. package/dist/nodes/process/AddShader.d.ts.map +1 -0
  98. package/dist/nodes/process/AddShader.js +36 -0
  99. package/dist/nodes/process/AnimatedNoiseTexture.d.ts +39 -0
  100. package/dist/nodes/process/AnimatedNoiseTexture.d.ts.map +1 -0
  101. package/dist/nodes/process/AnimatedNoiseTexture.js +93 -0
  102. package/dist/nodes/process/Blackbody.d.ts +29 -0
  103. package/dist/nodes/process/Blackbody.d.ts.map +1 -0
  104. package/dist/nodes/process/Blackbody.js +50 -0
  105. package/dist/nodes/process/BrickTexture.d.ts +36 -0
  106. package/dist/nodes/process/BrickTexture.d.ts.map +1 -0
  107. package/dist/nodes/process/BrickTexture.js +71 -0
  108. package/dist/nodes/process/BrightContrast.d.ts +30 -0
  109. package/dist/nodes/process/BrightContrast.d.ts.map +1 -0
  110. package/dist/nodes/process/BrightContrast.js +41 -0
  111. package/dist/nodes/process/Bump.d.ts +31 -0
  112. package/dist/nodes/process/Bump.d.ts.map +1 -0
  113. package/dist/nodes/process/Bump.js +65 -0
  114. package/dist/nodes/process/CheckerTexture.d.ts +30 -0
  115. package/dist/nodes/process/CheckerTexture.d.ts.map +1 -0
  116. package/dist/nodes/process/CheckerTexture.js +48 -0
  117. package/dist/nodes/process/Clamp.d.ts +32 -0
  118. package/dist/nodes/process/Clamp.d.ts.map +1 -0
  119. package/dist/nodes/process/Clamp.js +37 -0
  120. package/dist/nodes/process/ColorRamp.d.ts +28 -0
  121. package/dist/nodes/process/ColorRamp.d.ts.map +1 -0
  122. package/dist/nodes/process/ColorRamp.js +49 -0
  123. package/dist/nodes/process/CombineColor.d.ts +34 -0
  124. package/dist/nodes/process/CombineColor.d.ts.map +1 -0
  125. package/dist/nodes/process/CombineColor.js +69 -0
  126. package/dist/nodes/process/CombineRGB.d.ts +29 -0
  127. package/dist/nodes/process/CombineRGB.d.ts.map +1 -0
  128. package/dist/nodes/process/CombineRGB.js +33 -0
  129. package/dist/nodes/process/CombineXYZ.d.ts +29 -0
  130. package/dist/nodes/process/CombineXYZ.d.ts.map +1 -0
  131. package/dist/nodes/process/CombineXYZ.js +33 -0
  132. package/dist/nodes/process/DiffuseBSDF.d.ts +30 -0
  133. package/dist/nodes/process/DiffuseBSDF.d.ts.map +1 -0
  134. package/dist/nodes/process/DiffuseBSDF.js +43 -0
  135. package/dist/nodes/process/Emission.d.ts +30 -0
  136. package/dist/nodes/process/Emission.d.ts.map +1 -0
  137. package/dist/nodes/process/Emission.js +36 -0
  138. package/dist/nodes/process/EnvironmentTexture.d.ts +41 -0
  139. package/dist/nodes/process/EnvironmentTexture.d.ts.map +1 -0
  140. package/dist/nodes/process/EnvironmentTexture.js +65 -0
  141. package/dist/nodes/process/FloatCurve.d.ts +34 -0
  142. package/dist/nodes/process/FloatCurve.d.ts.map +1 -0
  143. package/dist/nodes/process/FloatCurve.js +46 -0
  144. package/dist/nodes/process/Fresnel.d.ts +36 -0
  145. package/dist/nodes/process/Fresnel.d.ts.map +1 -0
  146. package/dist/nodes/process/Fresnel.js +53 -0
  147. package/dist/nodes/process/Gamma.d.ts +29 -0
  148. package/dist/nodes/process/Gamma.d.ts.map +1 -0
  149. package/dist/nodes/process/Gamma.js +35 -0
  150. package/dist/nodes/process/GlassBSDF.d.ts +31 -0
  151. package/dist/nodes/process/GlassBSDF.d.ts.map +1 -0
  152. package/dist/nodes/process/GlassBSDF.js +51 -0
  153. package/dist/nodes/process/GlossyBSDF.d.ts +30 -0
  154. package/dist/nodes/process/GlossyBSDF.d.ts.map +1 -0
  155. package/dist/nodes/process/GlossyBSDF.js +50 -0
  156. package/dist/nodes/process/GradientTexture.d.ts +31 -0
  157. package/dist/nodes/process/GradientTexture.d.ts.map +1 -0
  158. package/dist/nodes/process/GradientTexture.js +49 -0
  159. package/dist/nodes/process/HashValue.d.ts +30 -0
  160. package/dist/nodes/process/HashValue.d.ts.map +1 -0
  161. package/dist/nodes/process/HashValue.js +34 -0
  162. package/dist/nodes/process/HueSaturationValue.d.ts +32 -0
  163. package/dist/nodes/process/HueSaturationValue.d.ts.map +1 -0
  164. package/dist/nodes/process/HueSaturationValue.js +58 -0
  165. package/dist/nodes/process/ImageTexture.d.ts +34 -0
  166. package/dist/nodes/process/ImageTexture.d.ts.map +1 -0
  167. package/dist/nodes/process/ImageTexture.js +53 -0
  168. package/dist/nodes/process/InvertColor.d.ts +29 -0
  169. package/dist/nodes/process/InvertColor.d.ts.map +1 -0
  170. package/dist/nodes/process/InvertColor.js +35 -0
  171. package/dist/nodes/process/MagicTexture.d.ts +30 -0
  172. package/dist/nodes/process/MagicTexture.d.ts.map +1 -0
  173. package/dist/nodes/process/MagicTexture.js +54 -0
  174. package/dist/nodes/process/MapRange.d.ts +38 -0
  175. package/dist/nodes/process/MapRange.d.ts.map +1 -0
  176. package/dist/nodes/process/MapRange.js +52 -0
  177. package/dist/nodes/process/Mapping.d.ts +37 -0
  178. package/dist/nodes/process/Mapping.d.ts.map +1 -0
  179. package/dist/nodes/process/Mapping.js +57 -0
  180. package/dist/nodes/process/Math.d.ts +40 -0
  181. package/dist/nodes/process/Math.d.ts.map +1 -0
  182. package/dist/nodes/process/Math.js +100 -0
  183. package/dist/nodes/process/MixRGB.d.ts +35 -0
  184. package/dist/nodes/process/MixRGB.d.ts.map +1 -0
  185. package/dist/nodes/process/MixRGB.js +63 -0
  186. package/dist/nodes/process/MixShader.d.ts +35 -0
  187. package/dist/nodes/process/MixShader.d.ts.map +1 -0
  188. package/dist/nodes/process/MixShader.js +47 -0
  189. package/dist/nodes/process/MusgraveTexture.d.ts +36 -0
  190. package/dist/nodes/process/MusgraveTexture.d.ts.map +1 -0
  191. package/dist/nodes/process/MusgraveTexture.js +70 -0
  192. package/dist/nodes/process/NoiseTexture.d.ts +31 -0
  193. package/dist/nodes/process/NoiseTexture.d.ts.map +1 -0
  194. package/dist/nodes/process/NoiseTexture.js +78 -0
  195. package/dist/nodes/process/Normal.d.ts +30 -0
  196. package/dist/nodes/process/Normal.d.ts.map +1 -0
  197. package/dist/nodes/process/Normal.js +38 -0
  198. package/dist/nodes/process/NormalMap.d.ts +34 -0
  199. package/dist/nodes/process/NormalMap.d.ts.map +1 -0
  200. package/dist/nodes/process/NormalMap.js +54 -0
  201. package/dist/nodes/process/PrincipledBSDF.d.ts +32 -0
  202. package/dist/nodes/process/PrincipledBSDF.d.ts.map +1 -0
  203. package/dist/nodes/process/PrincipledBSDF.js +75 -0
  204. package/dist/nodes/process/PrincipledHair.d.ts +63 -0
  205. package/dist/nodes/process/PrincipledHair.d.ts.map +1 -0
  206. package/dist/nodes/process/PrincipledHair.js +137 -0
  207. package/dist/nodes/process/PrincipledVolume.d.ts +37 -0
  208. package/dist/nodes/process/PrincipledVolume.d.ts.map +1 -0
  209. package/dist/nodes/process/PrincipledVolume.js +67 -0
  210. package/dist/nodes/process/RGBCurves.d.ts +45 -0
  211. package/dist/nodes/process/RGBCurves.d.ts.map +1 -0
  212. package/dist/nodes/process/RGBCurves.js +81 -0
  213. package/dist/nodes/process/RGBtoBW.d.ts +28 -0
  214. package/dist/nodes/process/RGBtoBW.d.ts.map +1 -0
  215. package/dist/nodes/process/RGBtoBW.js +31 -0
  216. package/dist/nodes/process/RefractionBSDF.d.ts +32 -0
  217. package/dist/nodes/process/RefractionBSDF.d.ts.map +1 -0
  218. package/dist/nodes/process/RefractionBSDF.js +46 -0
  219. package/dist/nodes/process/SchwarzschildMarch.d.ts +56 -0
  220. package/dist/nodes/process/SchwarzschildMarch.d.ts.map +1 -0
  221. package/dist/nodes/process/SchwarzschildMarch.js +306 -0
  222. package/dist/nodes/process/SeparateColor.d.ts +33 -0
  223. package/dist/nodes/process/SeparateColor.d.ts.map +1 -0
  224. package/dist/nodes/process/SeparateColor.js +79 -0
  225. package/dist/nodes/process/SeparateRGB.d.ts +27 -0
  226. package/dist/nodes/process/SeparateRGB.d.ts.map +1 -0
  227. package/dist/nodes/process/SeparateRGB.js +31 -0
  228. package/dist/nodes/process/SeparateXYZ.d.ts +27 -0
  229. package/dist/nodes/process/SeparateXYZ.d.ts.map +1 -0
  230. package/dist/nodes/process/SeparateXYZ.js +31 -0
  231. package/dist/nodes/process/ShaderScript.d.ts +95 -0
  232. package/dist/nodes/process/ShaderScript.d.ts.map +1 -0
  233. package/dist/nodes/process/ShaderScript.js +119 -0
  234. package/dist/nodes/process/ShaderToRGB.d.ts +28 -0
  235. package/dist/nodes/process/ShaderToRGB.d.ts.map +1 -0
  236. package/dist/nodes/process/ShaderToRGB.js +33 -0
  237. package/dist/nodes/process/SheenBSDF.d.ts +31 -0
  238. package/dist/nodes/process/SheenBSDF.d.ts.map +1 -0
  239. package/dist/nodes/process/SheenBSDF.js +49 -0
  240. package/dist/nodes/process/SpecularBSDF.d.ts +32 -0
  241. package/dist/nodes/process/SpecularBSDF.d.ts.map +1 -0
  242. package/dist/nodes/process/SpecularBSDF.js +54 -0
  243. package/dist/nodes/process/SubsurfaceScattering.d.ts +33 -0
  244. package/dist/nodes/process/SubsurfaceScattering.d.ts.map +1 -0
  245. package/dist/nodes/process/SubsurfaceScattering.js +46 -0
  246. package/dist/nodes/process/ToonBSDF.d.ts +31 -0
  247. package/dist/nodes/process/ToonBSDF.d.ts.map +1 -0
  248. package/dist/nodes/process/ToonBSDF.js +44 -0
  249. package/dist/nodes/process/TranslucentBSDF.d.ts +29 -0
  250. package/dist/nodes/process/TranslucentBSDF.d.ts.map +1 -0
  251. package/dist/nodes/process/TranslucentBSDF.js +39 -0
  252. package/dist/nodes/process/VectorCurves.d.ts +42 -0
  253. package/dist/nodes/process/VectorCurves.d.ts.map +1 -0
  254. package/dist/nodes/process/VectorCurves.js +71 -0
  255. package/dist/nodes/process/VectorMath.d.ts +38 -0
  256. package/dist/nodes/process/VectorMath.d.ts.map +1 -0
  257. package/dist/nodes/process/VectorMath.js +105 -0
  258. package/dist/nodes/process/VectorRotate.d.ts +34 -0
  259. package/dist/nodes/process/VectorRotate.d.ts.map +1 -0
  260. package/dist/nodes/process/VectorRotate.js +52 -0
  261. package/dist/nodes/process/VectorTransform.d.ts +36 -0
  262. package/dist/nodes/process/VectorTransform.d.ts.map +1 -0
  263. package/dist/nodes/process/VectorTransform.js +48 -0
  264. package/dist/nodes/process/VolumeAbsorption.d.ts +30 -0
  265. package/dist/nodes/process/VolumeAbsorption.d.ts.map +1 -0
  266. package/dist/nodes/process/VolumeAbsorption.js +36 -0
  267. package/dist/nodes/process/VolumeScatter.d.ts +31 -0
  268. package/dist/nodes/process/VolumeScatter.d.ts.map +1 -0
  269. package/dist/nodes/process/VolumeScatter.js +42 -0
  270. package/dist/nodes/process/VoronoiTexture.d.ts +38 -0
  271. package/dist/nodes/process/VoronoiTexture.d.ts.map +1 -0
  272. package/dist/nodes/process/VoronoiTexture.js +123 -0
  273. package/dist/nodes/process/WaveTexture.d.ts +39 -0
  274. package/dist/nodes/process/WaveTexture.d.ts.map +1 -0
  275. package/dist/nodes/process/WaveTexture.js +77 -0
  276. package/dist/nodes/process/Wavelength.d.ts +28 -0
  277. package/dist/nodes/process/Wavelength.d.ts.map +1 -0
  278. package/dist/nodes/process/Wavelength.js +43 -0
  279. package/dist/nodes/process/WhiteNoise.d.ts +27 -0
  280. package/dist/nodes/process/WhiteNoise.d.ts.map +1 -0
  281. package/dist/nodes/process/WhiteNoise.js +44 -0
  282. package/dist/nodes/shader/AmbientOcclusion.d.ts +47 -0
  283. package/dist/nodes/shader/AmbientOcclusion.d.ts.map +1 -0
  284. package/dist/nodes/shader/AmbientOcclusion.js +128 -0
  285. package/dist/nodes/shader/RayPortal.d.ts +57 -0
  286. package/dist/nodes/shader/RayPortal.d.ts.map +1 -0
  287. package/dist/nodes/shader/RayPortal.js +56 -0
  288. package/dist/shaders/color.d.ts +12 -0
  289. package/dist/shaders/color.d.ts.map +1 -0
  290. package/dist/shaders/color.js +42 -0
  291. package/dist/shaders/noise.d.ts +12 -0
  292. package/dist/shaders/noise.d.ts.map +1 -0
  293. package/dist/shaders/noise.js +70 -0
  294. package/dist/types/shader.d.ts +17 -0
  295. package/dist/types/shader.d.ts.map +1 -0
  296. package/dist/types/shader.js +1 -0
  297. 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"}