@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 @@
1
+ {"version":3,"file":"ColorRamp.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/ColorRamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,WAAW;IACxC,IAAI,QAAQ,WAAyB;IACrC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,eAAoB;IASxC,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAwBrB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAGzC"}
@@ -0,0 +1,49 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import { CompileContext } from '../../core/CompileContext.js';
3
+ /**
4
+ * Color Ramp — Blender "ColorRamp" node equivalent.
5
+ *
6
+ * Inputs: fac (float)
7
+ * Outputs: Color (color)
8
+ */
9
+ export class ColorRamp extends ProcessNode {
10
+ get nodeType() { return 'ColorRamp'; }
11
+ get metadata() {
12
+ return { label: 'Color Ramp', category: 'Converter', color: '#633060', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('ColorRamp');
16
+ this.stops = inputs.stops ?? ['#000000', '#ffffff'];
17
+ this._inputs = this.createInputs(inputs, {
18
+ fac: ['float', 0.5],
19
+ });
20
+ this._outputs = this.createOutputs({ Color: 'color' });
21
+ }
22
+ getInputSockets() { return this._inputs; }
23
+ getOutputSockets() { return this._outputs; }
24
+ compileDefs() {
25
+ const fn = `_st_colorRamp_${this.id}`;
26
+ const cs = this.stops.map(CompileContext.hexToVec3);
27
+ const n = cs.length;
28
+ if (n === 1) {
29
+ return `\nvec3 ${fn}(float t) { return ${cs[0]}; }`;
30
+ }
31
+ // if-else chain with baked-in constants — GLSL ES 1.00 compatible.
32
+ // Avoids vec3[] array initialisation and dynamic indexing which require ES 3.00.
33
+ const segs = n - 1;
34
+ const lines = [`\nvec3 ${fn}(float t) {`, ` float s = clamp(t, 0.0, 1.0);`];
35
+ for (let i = 0; i < segs; i++) {
36
+ const posA = (i / segs).toFixed(6);
37
+ const posB = ((i + 1) / segs).toFixed(6);
38
+ const frac = `((s - ${posA}) * ${segs}.0)`;
39
+ const stmt = `return mix(${cs[i]}, ${cs[i + 1]}, clamp(${frac}, 0.0, 1.0));`;
40
+ lines.push(i < segs - 1 ? ` if (s < ${posB}) ${stmt}` : ` ${stmt}`);
41
+ }
42
+ lines.push('}');
43
+ return lines.join('\n');
44
+ }
45
+ compileCall(ctx) {
46
+ return `vec3 ${ctx.outputVar(this, 'Color')} = _st_colorRamp_${this.id}(${ctx.resolveInput(this._inputs.fac)});`;
47
+ }
48
+ }
49
+ ColorRamp.instanceSpecificDef = true;
@@ -0,0 +1,34 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import type { NodeMetadata } from '../../core/ShaderNode.js';
3
+ import type { CompileContext } from '../../core/CompileContext.js';
4
+ import type { OutputSocket } from '../../core/OutputSocket.js';
5
+ export type CombineColorMode = 'RGB' | 'HSV' | 'HSL';
6
+ export interface CombineColorInputs {
7
+ red?: OutputSocket | number;
8
+ green?: OutputSocket | number;
9
+ blue?: OutputSocket | number;
10
+ mode?: CombineColorMode;
11
+ }
12
+ /**
13
+ * Combine Color — Blender 3.4+ "Combine Color" node equivalent.
14
+ * Combines three float channels into a color using RGB, HSV, or HSL mode.
15
+ * Replaces the older CombineRGB node and adds HSV/HSL support.
16
+ *
17
+ * Inputs: red/green/blue (float) — semantics depend on mode
18
+ * Outputs: Color (color)
19
+ */
20
+ export declare class CombineColor 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 _inputs;
27
+ private readonly _outputs;
28
+ constructor(inputs?: CombineColorInputs);
29
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
30
+ getOutputSockets(): Record<string, OutputSocket>;
31
+ compileDefs(): string;
32
+ compileCall(ctx: CompileContext): string;
33
+ }
34
+ //# sourceMappingURL=CombineColor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombineColor.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/CombineColor.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,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAEpD,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;IAC7B,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IAC7B,IAAI,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAC7B,IAAI,CAAC,EAAG,gBAAgB,CAAA;CACzB;AAED;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,QAAQ,WAA4B;IACxC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAyBnB;IAEA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,kBAAuB;IAW3C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAezC"}
@@ -0,0 +1,69 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Combine Color — Blender 3.4+ "Combine Color" node equivalent.
4
+ * Combines three float channels into a color using RGB, HSV, or HSL mode.
5
+ * Replaces the older CombineRGB node and adds HSV/HSL support.
6
+ *
7
+ * Inputs: red/green/blue (float) — semantics depend on mode
8
+ * Outputs: Color (color)
9
+ */
10
+ export class CombineColor extends ProcessNode {
11
+ get nodeType() { return 'CombineColor'; }
12
+ get metadata() {
13
+ return { label: 'Combine Color', category: 'Converter', color: '#633060', cost: 'low' };
14
+ }
15
+ constructor(inputs = {}) {
16
+ super('CombineColor');
17
+ this.mode = inputs.mode ?? 'RGB';
18
+ this._inputs = this.createInputs(inputs, {
19
+ red: ['float', 0.0],
20
+ green: ['float', 0.0],
21
+ blue: ['float', 0.0],
22
+ });
23
+ this._outputs = this.createOutputs({ Color: 'color' });
24
+ }
25
+ getInputSockets() { return this._inputs; }
26
+ getOutputSockets() { return this._outputs; }
27
+ compileDefs() { return CombineColor.glslFunction; }
28
+ compileCall(ctx) {
29
+ const r = ctx.resolveInput(this._inputs.red);
30
+ const g = ctx.resolveInput(this._inputs.green);
31
+ const b = ctx.resolveInput(this._inputs.blue);
32
+ const cv = ctx.outputVar(this, 'Color');
33
+ switch (this.mode) {
34
+ case 'HSV':
35
+ return `vec3 ${cv} = _st_hsvToRgb(vec3(${r}, ${g}, ${b}));`;
36
+ case 'HSL':
37
+ return `vec3 ${cv} = _st_hslToRgb(vec3(${r}, ${g}, ${b}));`;
38
+ default:
39
+ return `vec3 ${cv} = vec3(${r}, ${g}, ${b});`;
40
+ }
41
+ }
42
+ }
43
+ CombineColor.instanceSpecificDef = false;
44
+ CombineColor.glslFunction = `
45
+ vec3 _st_hsvToRgb(vec3 c) {
46
+ vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
47
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
48
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
49
+ }
50
+ vec3 _st_hslToRgb(vec3 c) {
51
+ float h = c.x, s = c.y, l = c.z;
52
+ float q = l < 0.5 ? l * (1.0 + s) : l + s - l * s;
53
+ float p = 2.0 * l - q;
54
+ vec3 t = vec3(h + 1.0/3.0, h, h - 1.0/3.0);
55
+ t = fract(t);
56
+ vec3 rgb;
57
+ for (int i = 0; i < 3; i++) {
58
+ float ti = (i == 0) ? t.x : (i == 1) ? t.y : t.z;
59
+ float v;
60
+ if (ti < 1.0/6.0) v = p + (q - p) * 6.0 * ti;
61
+ else if (ti < 0.5) v = q;
62
+ else if (ti < 2.0/3.0) v = p + (q - p) * (2.0/3.0 - ti) * 6.0;
63
+ else v = p;
64
+ if (i == 0) rgb.r = v;
65
+ else if (i == 1) rgb.g = v;
66
+ else rgb.b = v;
67
+ }
68
+ return rgb;
69
+ }`;
@@ -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 CombineRGBInputs {
6
+ r?: OutputSocket | number;
7
+ g?: OutputSocket | number;
8
+ b?: OutputSocket | number;
9
+ }
10
+ /**
11
+ * Combine RGB — Blender "Combine Color" node equivalent.
12
+ * Combines three float channels into a colour.
13
+ *
14
+ * Inputs: R (float), G (float), B (float)
15
+ * Outputs: Color (color)
16
+ */
17
+ export declare class CombineRGB extends ProcessNode {
18
+ get nodeType(): string;
19
+ static instanceSpecificDef: boolean;
20
+ get metadata(): NodeMetadata;
21
+ private readonly _inputs;
22
+ private readonly _outputs;
23
+ constructor(inputs?: CombineRGBInputs);
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=CombineRGB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombineRGB.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/CombineRGB.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,gBAAgB;IAC/B,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACzB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACzB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,IAAI,QAAQ,WAA0B;IACtC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,gBAAqB;IAUzC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}
@@ -0,0 +1,33 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Combine RGB — Blender "Combine Color" node equivalent.
4
+ * Combines three float channels into a colour.
5
+ *
6
+ * Inputs: R (float), G (float), B (float)
7
+ * Outputs: Color (color)
8
+ */
9
+ export class CombineRGB extends ProcessNode {
10
+ get nodeType() { return 'CombineRGB'; }
11
+ get metadata() {
12
+ return { label: 'Combine RGB', category: 'Converter', color: '#4a3a6a', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('CombineRGB');
16
+ this._inputs = this.createInputs(inputs, {
17
+ r: ['float', inputs.r ?? 0.0],
18
+ g: ['float', inputs.g ?? 0.0],
19
+ b: ['float', inputs.b ?? 0.0],
20
+ });
21
+ this._outputs = this.createOutputs({ Color: 'color' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return ''; }
26
+ compileCall(ctx) {
27
+ const r = ctx.resolveInput(this._inputs.r);
28
+ const g = ctx.resolveInput(this._inputs.g);
29
+ const b = ctx.resolveInput(this._inputs.b);
30
+ return `vec3 ${ctx.outputVar(this, 'Color')} = vec3(${r}, ${g}, ${b});`;
31
+ }
32
+ }
33
+ CombineRGB.instanceSpecificDef = false;
@@ -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 CombineXYZInputs {
6
+ x?: OutputSocket | number;
7
+ y?: OutputSocket | number;
8
+ z?: OutputSocket | number;
9
+ }
10
+ /**
11
+ * Combine XYZ — Blender "Combine XYZ" node equivalent.
12
+ * Combines three floats into a vector.
13
+ *
14
+ * Inputs: X (float), Y (float), Z (float)
15
+ * Outputs: Vector (color/vec3)
16
+ */
17
+ export declare class CombineXYZ extends ProcessNode {
18
+ get nodeType(): string;
19
+ static instanceSpecificDef: boolean;
20
+ get metadata(): NodeMetadata;
21
+ private readonly _inputs;
22
+ private readonly _outputs;
23
+ constructor(inputs?: CombineXYZInputs);
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=CombineXYZ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CombineXYZ.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/CombineXYZ.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,gBAAgB;IAC/B,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACzB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACzB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,IAAI,QAAQ,WAA0B;IACtC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,gBAAqB;IAUzC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}
@@ -0,0 +1,33 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Combine XYZ — Blender "Combine XYZ" node equivalent.
4
+ * Combines three floats into a vector.
5
+ *
6
+ * Inputs: X (float), Y (float), Z (float)
7
+ * Outputs: Vector (color/vec3)
8
+ */
9
+ export class CombineXYZ extends ProcessNode {
10
+ get nodeType() { return 'CombineXYZ'; }
11
+ get metadata() {
12
+ return { label: 'Combine XYZ', category: 'Converter', color: '#4a3a6a', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('CombineXYZ');
16
+ this._inputs = this.createInputs(inputs, {
17
+ x: ['float', inputs.x ?? 0.0],
18
+ y: ['float', inputs.y ?? 0.0],
19
+ z: ['float', inputs.z ?? 0.0],
20
+ });
21
+ this._outputs = this.createOutputs({ Vector: 'color' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return ''; }
26
+ compileCall(ctx) {
27
+ const x = ctx.resolveInput(this._inputs.x);
28
+ const y = ctx.resolveInput(this._inputs.y);
29
+ const z = ctx.resolveInput(this._inputs.z);
30
+ return `vec3 ${ctx.outputVar(this, 'Vector')} = vec3(${x}, ${y}, ${z});`;
31
+ }
32
+ }
33
+ CombineXYZ.instanceSpecificDef = false;
@@ -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 DiffuseBSDFInputs {
6
+ color?: OutputSocket | string;
7
+ roughness?: OutputSocket | number;
8
+ normal?: OutputSocket;
9
+ }
10
+ /**
11
+ * Diffuse BSDF — Blender "Diffuse BSDF" node equivalent.
12
+ * Pure Lambertian diffuse surface — flat matte, no specular highlights.
13
+ *
14
+ * Inputs: color, roughness, normal
15
+ * Outputs: BSDF (shader)
16
+ */
17
+ export declare class DiffuseBSDF 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?: DiffuseBSDFInputs);
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=DiffuseBSDF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiffuseBSDF.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/DiffuseBSDF.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,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;IACjC,MAAM,CAAC,EAAI,YAAY,CAAA;CACxB;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,SAOnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,iBAAsB;IAU1C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAQzC"}
@@ -0,0 +1,43 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Diffuse BSDF — Blender "Diffuse BSDF" node equivalent.
4
+ * Pure Lambertian diffuse surface — flat matte, no specular highlights.
5
+ *
6
+ * Inputs: color, roughness, normal
7
+ * Outputs: BSDF (shader)
8
+ */
9
+ export class DiffuseBSDF extends ProcessNode {
10
+ get nodeType() { return 'DiffuseBSDF'; }
11
+ get metadata() {
12
+ return { label: 'Diffuse BSDF', category: 'Shader', color: '#336699', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('DiffuseBSDF');
16
+ this._inputs = this.createInputs(inputs, {
17
+ color: ['color', '#ffffff'],
18
+ roughness: ['float', inputs.roughness ?? 0.0],
19
+ normal: ['color', null],
20
+ });
21
+ this._outputs = this.createOutputs({ BSDF: 'shader' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return DiffuseBSDF.glslFunction; }
26
+ compileCall(ctx) {
27
+ const color = ctx.resolveInput(this._inputs.color);
28
+ const roughness = ctx.resolveInput(this._inputs.roughness);
29
+ const normal = this._inputs.normal.isConnected()
30
+ ? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name)
31
+ : 'normalize(vNormal)';
32
+ return `vec3 ${ctx.outputVar(this, 'BSDF')} = _st_diffuseBSDF(${color}, ${roughness}, ${normal});`;
33
+ }
34
+ }
35
+ DiffuseBSDF.instanceSpecificDef = false;
36
+ DiffuseBSDF.glslFunction = `
37
+ vec3 _st_diffuseBSDF(vec3 color, float roughness, vec3 N) {
38
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
39
+ float NdotL = max(dot(N, L), 0.0);
40
+ float diffuse = NdotL / 3.14159265;
41
+ vec3 ambient = color * 0.15;
42
+ return ambient + color * (diffuse * (1.0 - roughness * 0.5));
43
+ }`;
@@ -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 EmissionInputs {
6
+ color?: OutputSocket | string;
7
+ strength?: OutputSocket | number;
8
+ }
9
+ /**
10
+ * Emission — Blender "Emission" shader node equivalent.
11
+ * Produces a self-illuminating surface — unaffected by scene lighting.
12
+ * Use with MixShader to add glow on top of a surface material.
13
+ *
14
+ * Inputs: color (color), strength (float)
15
+ * Outputs: BSDF (shader)
16
+ */
17
+ export declare class Emission 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?: EmissionInputs);
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=Emission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Emission.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/Emission.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,cAAc;IAC7B,KAAK,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,qBAAa,QAAS,SAAQ,WAAW;IACvC,IAAI,QAAQ,WAAwB;IACpC,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,cAAmB;IASvC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAKzC"}
@@ -0,0 +1,36 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Emission — Blender "Emission" shader node equivalent.
4
+ * Produces a self-illuminating surface — unaffected by scene lighting.
5
+ * Use with MixShader to add glow on top of a surface material.
6
+ *
7
+ * Inputs: color (color), strength (float)
8
+ * Outputs: BSDF (shader)
9
+ */
10
+ export class Emission extends ProcessNode {
11
+ get nodeType() { return 'Emission'; }
12
+ get metadata() {
13
+ return { label: 'Emission', category: 'Shader', color: '#336699', cost: 'low' };
14
+ }
15
+ constructor(inputs = {}) {
16
+ super('Emission');
17
+ this._inputs = this.createInputs(inputs, {
18
+ color: ['color', '#ffffff'],
19
+ strength: ['float', inputs.strength ?? 1.0],
20
+ });
21
+ this._outputs = this.createOutputs({ BSDF: 'shader' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return Emission.glslFunction; }
26
+ compileCall(ctx) {
27
+ const color = ctx.resolveInput(this._inputs.color);
28
+ const strength = ctx.resolveInput(this._inputs.strength);
29
+ return `vec3 ${ctx.outputVar(this, 'BSDF')} = _st_emission(${color}, ${strength});`;
30
+ }
31
+ }
32
+ Emission.instanceSpecificDef = false;
33
+ Emission.glslFunction = `
34
+ vec3 _st_emission(vec3 color, float strength) {
35
+ return color * strength;
36
+ }`;
@@ -0,0 +1,41 @@
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 EnvironmentTextureInputs {
6
+ /** Output socket providing a direction vector (color type = vec3). Defaults to reflected view direction. */
7
+ vector?: OutputSocket;
8
+ /** Name of the samplerCube uniform on the ShaderMaterial. */
9
+ uniformName: string;
10
+ /** Mip level to sample (0 = sharpest, higher = blurrier/rougher). Default 0. */
11
+ roughness?: number | OutputSocket;
12
+ }
13
+ /**
14
+ * Environment Texture — Blender "Environment Texture" node equivalent.
15
+ * Samples a cubemap (THREE.CubeTexture or THREE.WebGLCubeRenderTarget) via a samplerCube uniform.
16
+ *
17
+ * Usage:
18
+ * const node = new EnvironmentTexture({ uniformName: 'uEnv' })
19
+ * // After mat.compile():
20
+ * mat.material.uniforms.uEnv = { value: new THREE.CubeTextureLoader().load([...]) }
21
+ *
22
+ * Default vector: reflected view direction — perfect for reflections.
23
+ * Connect a Normal node output for environment-mapped normals.
24
+ *
25
+ * Inputs: vector (direction, color), roughness (float), uniformName (string)
26
+ * Outputs: Color (color)
27
+ */
28
+ export declare class EnvironmentTexture extends ProcessNode {
29
+ get nodeType(): string;
30
+ static instanceSpecificDef: boolean;
31
+ get metadata(): NodeMetadata;
32
+ private readonly _uniformName;
33
+ private readonly _inputs;
34
+ private readonly _outputs;
35
+ constructor(inputs: EnvironmentTextureInputs);
36
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
37
+ getOutputSockets(): Record<string, OutputSocket>;
38
+ compileDefs(): string;
39
+ compileCall(ctx: CompileContext): string;
40
+ }
41
+ //# sourceMappingURL=EnvironmentTexture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentTexture.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/EnvironmentTexture.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,WAAW,wBAAwB;IACvC,4GAA4G;IAC5G,MAAM,CAAC,EAAO,YAAY,CAAA;IAC1B,6DAA6D;IAC7D,WAAW,EAAG,MAAM,CAAA;IACpB,gFAAgF;IAChF,SAAS,CAAC,EAAI,MAAM,GAAG,YAAY,CAAA;CACpC;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,IAAI,QAAQ,WAAkC;IAC9C,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,EAAE,wBAAwB;IAoB5C,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAIrB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAmBzC"}
@@ -0,0 +1,65 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import { ShaderNodeError } from '../../core/ShaderNodeError.js';
3
+ import { ShaderConfig } from '../../core/ShaderConfig.js';
4
+ /**
5
+ * Environment Texture — Blender "Environment Texture" node equivalent.
6
+ * Samples a cubemap (THREE.CubeTexture or THREE.WebGLCubeRenderTarget) via a samplerCube uniform.
7
+ *
8
+ * Usage:
9
+ * const node = new EnvironmentTexture({ uniformName: 'uEnv' })
10
+ * // After mat.compile():
11
+ * mat.material.uniforms.uEnv = { value: new THREE.CubeTextureLoader().load([...]) }
12
+ *
13
+ * Default vector: reflected view direction — perfect for reflections.
14
+ * Connect a Normal node output for environment-mapped normals.
15
+ *
16
+ * Inputs: vector (direction, color), roughness (float), uniformName (string)
17
+ * Outputs: Color (color)
18
+ */
19
+ export class EnvironmentTexture extends ProcessNode {
20
+ get nodeType() { return 'EnvironmentTexture'; }
21
+ get metadata() {
22
+ return { label: 'Environment Texture', category: 'Texture', color: '#3a5a6b', cost: 'medium' };
23
+ }
24
+ constructor(inputs) {
25
+ super('EnvironmentTexture');
26
+ if (ShaderConfig.errorLevel !== 'off' && !inputs.uniformName) {
27
+ ShaderNodeError.throw({
28
+ nodeType: 'EnvironmentTexture',
29
+ nodeId: this.id,
30
+ problem: 'uniformName is required.',
31
+ fix: 'new EnvironmentTexture({ uniformName: "uEnv" })\n After compile(): mat.material.uniforms.uEnv = { value: cubeTexture }',
32
+ });
33
+ }
34
+ this._uniformName = inputs.uniformName;
35
+ this._inputs = this.createInputs(inputs, {
36
+ vector: ['color', null],
37
+ roughness: ['float', 0.0],
38
+ });
39
+ this._outputs = this.createOutputs({ Color: 'color' });
40
+ }
41
+ getInputSockets() { return this._inputs; }
42
+ getOutputSockets() { return this._outputs; }
43
+ compileDefs() {
44
+ return `uniform samplerCube ${this._uniformName};`;
45
+ }
46
+ compileCall(ctx) {
47
+ const roughness = ctx.resolveInput(this._inputs.roughness);
48
+ const cv = ctx.outputVar(this, 'Color');
49
+ // If a direction vector is connected, use it; otherwise use the reflected view direction
50
+ let dir;
51
+ if (this._inputs.vector.isConnected()) {
52
+ dir = ctx.resolveInput(this._inputs.vector);
53
+ }
54
+ else {
55
+ // Compute reflected view direction in world space
56
+ dir = `reflect(normalize(vPosition - cameraPosition), vNormal)`;
57
+ }
58
+ return [
59
+ `vec3 _env_dir_${this.id} = ${dir};`,
60
+ `vec4 _env_samp_${this.id} = textureCube(${this._uniformName}, _env_dir_${this.id}, ${roughness} * 8.0);`,
61
+ `vec3 ${cv} = _env_samp_${this.id}.rgb;`,
62
+ ].join('\n ');
63
+ }
64
+ }
65
+ EnvironmentTexture.instanceSpecificDef = true;
@@ -0,0 +1,34 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import type { NodeMetadata } from '../../core/ShaderNode.js';
3
+ import type { CompileContext } from '../../core/CompileContext.js';
4
+ import type { OutputSocket } from '../../core/OutputSocket.js';
5
+ /** A control point: [x, y] both in [0,1] */
6
+ type CurvePoint = [number, number];
7
+ export interface FloatCurveInputs {
8
+ value?: OutputSocket | number;
9
+ fac?: OutputSocket | number;
10
+ /** Array of [x, y] control points — at least 2, sorted by x. */
11
+ points?: CurvePoint[];
12
+ }
13
+ /**
14
+ * Float Curve — Blender "Float Curve" converter node equivalent.
15
+ * Remaps a float value using a custom piecewise-linear curve.
16
+ *
17
+ * Inputs: value [0-1], fac [0-1], points (control points)
18
+ * Outputs: Value (float)
19
+ */
20
+ export declare class FloatCurve extends ProcessNode {
21
+ get nodeType(): string;
22
+ static instanceSpecificDef: boolean;
23
+ get metadata(): NodeMetadata;
24
+ private readonly points;
25
+ private readonly _inputs;
26
+ private readonly _outputs;
27
+ constructor(inputs?: FloatCurveInputs);
28
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
29
+ getOutputSockets(): Record<string, OutputSocket>;
30
+ compileDefs(): string;
31
+ compileCall(ctx: CompileContext): string;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=FloatCurve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FloatCurve.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/FloatCurve.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,4CAA4C;AAC5C,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAElC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAC9B,GAAG,CAAC,EAAK,YAAY,GAAG,MAAM,CAAA;IAC9B,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,IAAI,QAAQ,WAA0B;IACtC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,gBAAqB;IAUzC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAsBzC"}
@@ -0,0 +1,46 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Float Curve — Blender "Float Curve" converter node equivalent.
4
+ * Remaps a float value using a custom piecewise-linear curve.
5
+ *
6
+ * Inputs: value [0-1], fac [0-1], points (control points)
7
+ * Outputs: Value (float)
8
+ */
9
+ export class FloatCurve extends ProcessNode {
10
+ get nodeType() { return 'FloatCurve'; }
11
+ get metadata() {
12
+ return { label: 'Float Curve', category: 'Converter', color: '#4a3a6a', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('FloatCurve');
16
+ this.points = inputs.points ?? [[0, 0], [1, 1]];
17
+ this._inputs = this.createInputs(inputs, {
18
+ value: ['float', inputs.value ?? 0.5],
19
+ fac: ['float', inputs.fac ?? 1.0],
20
+ });
21
+ this._outputs = this.createOutputs({ Value: 'float' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return ''; }
26
+ compileCall(ctx) {
27
+ const val = ctx.resolveInput(this._inputs.value);
28
+ const fac = ctx.resolveInput(this._inputs.fac);
29
+ const n = this.points.length;
30
+ const out = ctx.outputVar(this, 'Value');
31
+ // Build piecewise linear lookup from control points
32
+ const lines = [
33
+ `float _fc_v_${this.id} = clamp(${val}, 0.0, 1.0);`,
34
+ `float _fc_r_${this.id} = ${this.points[n - 1][1].toFixed(4)};`,
35
+ ];
36
+ for (let i = 0; i < n - 1; i++) {
37
+ const [x0, y0] = this.points[i];
38
+ const [x1, y1] = this.points[i + 1];
39
+ const t = `clamp((_fc_v_${this.id} - ${x0.toFixed(4)}) / max(${(x1 - x0).toFixed(4)}, 0.0001), 0.0, 1.0)`;
40
+ lines.push(`if (_fc_v_${this.id} <= ${x1.toFixed(4)}) _fc_r_${this.id} = mix(${y0.toFixed(4)}, ${y1.toFixed(4)}, ${t});`);
41
+ }
42
+ lines.push(`float ${out} = mix(_fc_v_${this.id}, _fc_r_${this.id}, clamp(${fac}, 0.0, 1.0));`);
43
+ return lines.join('\n ');
44
+ }
45
+ }
46
+ FloatCurve.instanceSpecificDef = true;