@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,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 TranslucentBSDFInputs {
6
+ color?: OutputSocket | string;
7
+ normal?: OutputSocket;
8
+ }
9
+ /**
10
+ * Translucent BSDF — Blender "Translucent BSDF" node equivalent.
11
+ * Allows light silhouettes through the back of thin objects — leaves, paper, fabric.
12
+ *
13
+ * Inputs: color, normal
14
+ * Outputs: BSDF (shader)
15
+ */
16
+ export declare class TranslucentBSDF 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?: TranslucentBSDFInputs);
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=TranslucentBSDF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslucentBSDF.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/TranslucentBSDF.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,qBAAqB;IACpC,KAAK,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,QAAQ,WAA+B;IAC3C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAKnB;IAEA,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,qBAA0B;IAS9C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAOzC"}
@@ -0,0 +1,39 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Translucent BSDF — Blender "Translucent BSDF" node equivalent.
4
+ * Allows light silhouettes through the back of thin objects — leaves, paper, fabric.
5
+ *
6
+ * Inputs: color, normal
7
+ * Outputs: BSDF (shader)
8
+ */
9
+ export class TranslucentBSDF extends ProcessNode {
10
+ get nodeType() { return 'TranslucentBSDF'; }
11
+ get metadata() {
12
+ return { label: 'Translucent BSDF', category: 'Shader', color: '#336699', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('TranslucentBSDF');
16
+ this._inputs = this.createInputs(inputs, {
17
+ color: ['color', '#ffffff'],
18
+ normal: ['color', null],
19
+ });
20
+ this._outputs = this.createOutputs({ BSDF: 'shader' });
21
+ }
22
+ getInputSockets() { return this._inputs; }
23
+ getOutputSockets() { return this._outputs; }
24
+ compileDefs() { return TranslucentBSDF.glslFunction; }
25
+ compileCall(ctx) {
26
+ const color = ctx.resolveInput(this._inputs.color);
27
+ const normal = this._inputs.normal.isConnected()
28
+ ? ctx.outputVar(this._inputs.normal.connection.node, this._inputs.normal.connection.name)
29
+ : 'normalize(vNormal)';
30
+ return `vec3 ${ctx.outputVar(this, 'BSDF')} = _st_translucentBSDF(${color}, ${normal});`;
31
+ }
32
+ }
33
+ TranslucentBSDF.instanceSpecificDef = false;
34
+ TranslucentBSDF.glslFunction = `
35
+ vec3 _st_translucentBSDF(vec3 color, vec3 N) {
36
+ vec3 L = normalize(vec3(1.0, 2.0, 1.0));
37
+ float backDot = max(dot(-N, L), 0.0);
38
+ return color * backDot / 3.14159265 + color * 0.02;
39
+ }`;
@@ -0,0 +1,42 @@
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 curve point [x, y]. */
6
+ export type VectorCurvePoint = [number, number];
7
+ export interface VectorCurvesInputs {
8
+ vector?: OutputSocket;
9
+ fac?: OutputSocket | number;
10
+ /**
11
+ * Per-axis piecewise linear curve as [[x,y], ...] control points.
12
+ * Default = identity [[−1,−1],[1,1]] (maps full float range through unchanged).
13
+ */
14
+ xPoints?: VectorCurvePoint[];
15
+ yPoints?: VectorCurvePoint[];
16
+ zPoints?: VectorCurvePoint[];
17
+ }
18
+ /**
19
+ * Vector Curves — Blender "Vector Curves" node equivalent.
20
+ * Full piecewise linear curve per axis (X, Y, Z).
21
+ * Matches Blender's Vector Curves node exactly — arbitrary control points,
22
+ * piecewise linear interpolation. Input range is typically [−1, 1] for vectors.
23
+ *
24
+ * Inputs: vector, fac
25
+ * Outputs: Vector (color/vec3)
26
+ */
27
+ export declare class VectorCurves extends ProcessNode {
28
+ get nodeType(): string;
29
+ static instanceSpecificDef: boolean;
30
+ get metadata(): NodeMetadata;
31
+ private readonly xPts;
32
+ private readonly yPts;
33
+ private readonly zPts;
34
+ private readonly _inputs;
35
+ private readonly _outputs;
36
+ constructor(inputs?: VectorCurvesInputs);
37
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
38
+ getOutputSockets(): Record<string, OutputSocket>;
39
+ compileDefs(): string;
40
+ compileCall(ctx: CompileContext): string;
41
+ }
42
+ //# sourceMappingURL=VectorCurves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorCurves.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VectorCurves.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,4BAA4B;AAC5B,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE/C,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAG,YAAY,CAAA;IACtB,GAAG,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IAC/B;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,QAAQ,WAA4B;IACxC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,kBAAuB;IAc3C,eAAe;IACf,gBAAgB;IAEhB,WAAW,IAAI,MAAM;IAQrB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAWzC"}
@@ -0,0 +1,71 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Vector Curves — Blender "Vector Curves" node equivalent.
4
+ * Full piecewise linear curve per axis (X, Y, Z).
5
+ * Matches Blender's Vector Curves node exactly — arbitrary control points,
6
+ * piecewise linear interpolation. Input range is typically [−1, 1] for vectors.
7
+ *
8
+ * Inputs: vector, fac
9
+ * Outputs: Vector (color/vec3)
10
+ */
11
+ export class VectorCurves extends ProcessNode {
12
+ get nodeType() { return 'VectorCurves'; }
13
+ get metadata() {
14
+ return { label: 'Vector Curves', category: 'Vector', color: '#4a3a8a', cost: 'low' };
15
+ }
16
+ constructor(inputs = {}) {
17
+ super('VectorCurves');
18
+ // Default identity spans [−1, 1] to match Blender's vector curve range
19
+ const identity = [[-1, -1], [1, 1]];
20
+ this.xPts = sortPoints(inputs.xPoints ?? identity);
21
+ this.yPts = sortPoints(inputs.yPoints ?? identity);
22
+ this.zPts = sortPoints(inputs.zPoints ?? identity);
23
+ this._inputs = this.createInputs(inputs, {
24
+ vector: ['color', null],
25
+ fac: ['float', inputs.fac ?? 1.0],
26
+ });
27
+ this._outputs = this.createOutputs({ Vector: 'color' });
28
+ }
29
+ getInputSockets() { return this._inputs; }
30
+ getOutputSockets() { return this._outputs; }
31
+ compileDefs() {
32
+ return [
33
+ buildCurveFn(`_vc_x_${this.id}`, this.xPts),
34
+ buildCurveFn(`_vc_y_${this.id}`, this.yPts),
35
+ buildCurveFn(`_vc_z_${this.id}`, this.zPts),
36
+ ].join('\n');
37
+ }
38
+ compileCall(ctx) {
39
+ const vec = ctx.resolveInput(this._inputs.vector);
40
+ const fac = ctx.resolveInput(this._inputs.fac);
41
+ const id = this.id;
42
+ const out = ctx.outputVar(this, 'Vector');
43
+ return [
44
+ `vec3 _vc_${id} = ${vec};`,
45
+ `vec3 _vc_${id}_r = vec3(_vc_x_${id}(_vc_${id}.x), _vc_y_${id}(_vc_${id}.y), _vc_z_${id}(_vc_${id}.z));`,
46
+ `vec3 ${out} = mix(${vec}, _vc_${id}_r, clamp(${fac}, 0.0, 1.0));`,
47
+ ].join('\n ');
48
+ }
49
+ }
50
+ VectorCurves.instanceSpecificDef = true;
51
+ // ── helpers ───────────────────────────────────────────────────────────────────
52
+ function sortPoints(pts) {
53
+ return [...pts].sort((a, b) => a[0] - b[0]);
54
+ }
55
+ function buildCurveFn(name, pts) {
56
+ // No array initializers — GLSL ES 1.00 doesn't support float[n](...) syntax.
57
+ const f = (n) => n.toFixed(5);
58
+ const clamps = `
59
+ if (t <= ${f(pts[0][0])}) return ${f(pts[0][1])};
60
+ if (t >= ${f(pts[pts.length - 1][0])}) return ${f(pts[pts.length - 1][1])};`;
61
+ const segments = pts.slice(0, -1).map((p, i) => {
62
+ const x0 = f(p[0]), y0 = f(p[1]);
63
+ const x1 = f(pts[i + 1][0]), y1 = f(pts[i + 1][1]);
64
+ return ` if (t <= ${x1}) return mix(${y0}, ${y1}, (t - ${x0}) / (${x1} - ${x0}));`;
65
+ }).join('\n');
66
+ return `
67
+ float ${name}(float t) {${clamps}
68
+ ${segments}
69
+ return ${f(pts[pts.length - 1][1])};
70
+ }`;
71
+ }
@@ -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 VectorMathMode = 'ADD' | 'SUBTRACT' | 'MULTIPLY' | 'DIVIDE' | 'SCALE' | 'LENGTH' | 'NORMALIZE' | 'DOT_PRODUCT' | 'CROSS_PRODUCT' | 'REFLECT' | 'REFRACT' | 'ABSOLUTE' | 'MINIMUM' | 'MAXIMUM' | 'FLOOR' | 'CEIL' | 'FRACTION' | 'MODULO' | 'SNAP' | 'SINE' | 'COSINE' | 'TANGENT' | 'DISTANCE';
6
+ export interface VectorMathInputs {
7
+ mode: VectorMathMode;
8
+ vector?: OutputSocket | [number, number, number];
9
+ vectorB?: OutputSocket | [number, number, number];
10
+ scale?: OutputSocket | number;
11
+ }
12
+ /**
13
+ * Vector Math — Blender "Vector Math" node equivalent.
14
+ * Operates on vec3 values with a mode selector.
15
+ *
16
+ * Inputs: vector, vectorB, scale
17
+ * Outputs: Vector (vector/color), Value (float — for scalar results)
18
+ *
19
+ * @example
20
+ * new VectorMath({ mode: 'NORMALIZE', vector: normal.output('Normal') })
21
+ * new VectorMath({ mode: 'DOT_PRODUCT', vector: a.output('Normal'), vectorB: b.output('Normal') })
22
+ */
23
+ export declare class VectorMath extends ProcessNode {
24
+ get nodeType(): string;
25
+ static instanceSpecificDef: boolean;
26
+ get metadata(): NodeMetadata;
27
+ private readonly mode;
28
+ private readonly _inputs;
29
+ private readonly _outputs;
30
+ constructor(inputs: VectorMathInputs);
31
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
32
+ getOutputSockets(): Record<string, OutputSocket>;
33
+ compileDefs(): string;
34
+ compileCall(ctx: CompileContext): string;
35
+ private buildVector;
36
+ private buildScalar;
37
+ }
38
+ //# sourceMappingURL=VectorMath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorMath.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VectorMath.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,cAAc,GACtB,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAC1C,OAAO,GAAG,QAAQ,GAAG,WAAW,GAChC,aAAa,GAAG,eAAe,GAC/B,SAAS,GAAG,SAAS,GACrB,UAAU,GAAG,SAAS,GAAG,SAAS,GAClC,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GACjD,MAAM,GAAG,QAAQ,GAAG,SAAS,GAC7B,UAAU,CAAA;AAEd,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAK,cAAc,CAAA;IACvB,MAAM,CAAC,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChD,OAAO,CAAC,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,KAAK,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;CAC/B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,SAAQ,WAAW;IACzC,IAAI,QAAQ,WAA0B;IACtC,MAAM,CAAC,mBAAmB,UAAO;IAEjC,IAAI,QAAQ,IAAI,YAAY,CAO3B;IAED,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,EAAE,gBAAgB;IA6BpC,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;IAuBxC,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,105 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import { ShaderNodeError } from '../../core/ShaderNodeError.js';
3
+ import { ShaderConfig } from '../../core/ShaderConfig.js';
4
+ /**
5
+ * Vector Math — Blender "Vector Math" node equivalent.
6
+ * Operates on vec3 values with a mode selector.
7
+ *
8
+ * Inputs: vector, vectorB, scale
9
+ * Outputs: Vector (vector/color), Value (float — for scalar results)
10
+ *
11
+ * @example
12
+ * new VectorMath({ mode: 'NORMALIZE', vector: normal.output('Normal') })
13
+ * new VectorMath({ mode: 'DOT_PRODUCT', vector: a.output('Normal'), vectorB: b.output('Normal') })
14
+ */
15
+ export class VectorMath extends ProcessNode {
16
+ get nodeType() { return 'VectorMath'; }
17
+ get metadata() {
18
+ return {
19
+ label: 'Vector Math',
20
+ category: 'Converter',
21
+ color: '#4a3a6a',
22
+ cost: 'low',
23
+ };
24
+ }
25
+ constructor(inputs) {
26
+ super('VectorMath');
27
+ if (ShaderConfig.errorLevel !== 'off' && !inputs.mode) {
28
+ ShaderNodeError.throw({
29
+ nodeType: 'VectorMath',
30
+ nodeId: this.id,
31
+ problem: 'mode is required.',
32
+ fix: 'new VectorMath({ mode: "NORMALIZE", vector: ... })',
33
+ });
34
+ }
35
+ this.mode = inputs.mode;
36
+ const vecDefault = inputs.vector instanceof Array ? inputs.vector : [0, 0, 0];
37
+ const vecBDefault = inputs.vectorB instanceof Array ? inputs.vectorB : [0, 0, 0];
38
+ this._inputs = this.createInputs(inputs, {
39
+ vector: ['color', vecDefault],
40
+ vectorB: ['color', vecBDefault],
41
+ scale: ['float', inputs.scale ?? 1.0],
42
+ });
43
+ if (inputs.vector && !(inputs.vector instanceof Array))
44
+ this._inputs.vector.connection = inputs.vector;
45
+ if (inputs.vectorB && !(inputs.vectorB instanceof Array))
46
+ this._inputs.vectorB.connection = inputs.vectorB;
47
+ this._outputs = this.createOutputs({ Vector: 'color', Value: 'float' });
48
+ }
49
+ getInputSockets() { return this._inputs; }
50
+ getOutputSockets() { return this._outputs; }
51
+ compileDefs() { return ''; }
52
+ compileCall(ctx) {
53
+ const v = ctx.resolveInput(this._inputs.vector);
54
+ const vb = ctx.resolveInput(this._inputs.vectorB);
55
+ const s = ctx.resolveInput(this._inputs.scale);
56
+ const vOut = ctx.outputVar(this, 'Vector');
57
+ const fOut = ctx.outputVar(this, 'Value');
58
+ const scalarModes = ['DOT_PRODUCT', 'LENGTH', 'DISTANCE'];
59
+ const isScalar = scalarModes.includes(this.mode);
60
+ const lines = [];
61
+ if (isScalar) {
62
+ lines.push(`float ${fOut} = ${this.buildScalar(v, vb, s)};`);
63
+ lines.push(`vec3 ${vOut} = vec3(${fOut});`);
64
+ }
65
+ else {
66
+ lines.push(`vec3 ${vOut} = ${this.buildVector(v, vb, s)};`);
67
+ lines.push(`float ${fOut} = length(${vOut});`);
68
+ }
69
+ return lines.join('\n ');
70
+ }
71
+ buildVector(v, vb, s) {
72
+ switch (this.mode) {
73
+ case 'ADD': return `(${v} + ${vb})`;
74
+ case 'SUBTRACT': return `(${v} - ${vb})`;
75
+ case 'MULTIPLY': return `(${v} * ${vb})`;
76
+ case 'DIVIDE': return `(vec3(${vb}.x != 0.0 ? ${v}.x / ${vb}.x : 0.0, ${vb}.y != 0.0 ? ${v}.y / ${vb}.y : 0.0, ${vb}.z != 0.0 ? ${v}.z / ${vb}.z : 0.0))`;
77
+ case 'SCALE': return `(${v} * ${s})`;
78
+ case 'NORMALIZE': return `normalize(${v})`;
79
+ case 'REFLECT': return `reflect(${v}, normalize(${vb}))`;
80
+ case 'REFRACT': return `refract(normalize(${v}), normalize(${vb}), ${s})`;
81
+ case 'CROSS_PRODUCT': return `cross(${v}, ${vb})`;
82
+ case 'ABSOLUTE': return `abs(${v})`;
83
+ case 'MINIMUM': return `min(${v}, ${vb})`;
84
+ case 'MAXIMUM': return `max(${v}, ${vb})`;
85
+ case 'FLOOR': return `floor(${v})`;
86
+ case 'CEIL': return `ceil(${v})`;
87
+ case 'FRACTION': return `fract(${v})`;
88
+ case 'MODULO': return `mod(${v}, ${vb})`;
89
+ case 'SNAP': return `(floor(${v} / ${vb}) * ${vb})`;
90
+ case 'SINE': return `sin(${v})`;
91
+ case 'COSINE': return `cos(${v})`;
92
+ case 'TANGENT': return `tan(${v})`;
93
+ default: return v;
94
+ }
95
+ }
96
+ buildScalar(v, vb, _s) {
97
+ switch (this.mode) {
98
+ case 'DOT_PRODUCT': return `dot(${v}, ${vb})`;
99
+ case 'LENGTH': return `length(${v})`;
100
+ case 'DISTANCE': return `distance(${v}, ${vb})`;
101
+ default: return '0.0';
102
+ }
103
+ }
104
+ }
105
+ VectorMath.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 VectorRotateMode = 'AXIS_ANGLE' | 'X_AXIS' | 'Y_AXIS' | 'Z_AXIS' | 'EULER_XYZ';
6
+ export interface VectorRotateInputs {
7
+ vector?: OutputSocket;
8
+ center?: OutputSocket | [number, number, number];
9
+ axis?: OutputSocket | [number, number, number];
10
+ angle?: OutputSocket | number;
11
+ mode?: VectorRotateMode;
12
+ }
13
+ /**
14
+ * Vector Rotate — Blender "Vector Rotate" node equivalent.
15
+ * Rotates a vector around an axis or by Euler angles.
16
+ *
17
+ * Inputs: vector, center, axis, angle (radians)
18
+ * Outputs: Vector (color/vec3)
19
+ */
20
+ export declare class VectorRotate 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?: VectorRotateInputs);
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=VectorRotate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorRotate.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VectorRotate.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,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAA;AAE1F,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,MAAM,CAAC,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChD,IAAI,CAAC,EAAI,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChD,KAAK,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;IAC9B,IAAI,CAAC,EAAI,gBAAgB,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,QAAQ,WAA4B;IACxC,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAKnB;IAEA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2E;IACnG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,GAAE,kBAAuB;IAY3C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAkBzC"}
@@ -0,0 +1,52 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Vector Rotate — Blender "Vector Rotate" node equivalent.
4
+ * Rotates a vector around an axis or by Euler angles.
5
+ *
6
+ * Inputs: vector, center, axis, angle (radians)
7
+ * Outputs: Vector (color/vec3)
8
+ */
9
+ export class VectorRotate extends ProcessNode {
10
+ get nodeType() { return 'VectorRotate'; }
11
+ get metadata() {
12
+ return { label: 'Vector Rotate', category: 'Vector', color: '#4a3a8a', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('VectorRotate');
16
+ this.mode = inputs.mode ?? 'AXIS_ANGLE';
17
+ this._inputs = this.createInputs(inputs, {
18
+ vector: ['color', null],
19
+ center: ['color', null],
20
+ axis: ['color', null],
21
+ angle: ['float', inputs.angle ?? 0.0],
22
+ });
23
+ this._outputs = this.createOutputs({ Vector: 'color' });
24
+ }
25
+ getInputSockets() { return this._inputs; }
26
+ getOutputSockets() { return this._outputs; }
27
+ compileDefs() { return VectorRotate.glslFunction; }
28
+ compileCall(ctx) {
29
+ const vec = ctx.resolveInput(this._inputs.vector);
30
+ const angle = ctx.resolveInput(this._inputs.angle);
31
+ const out = ctx.outputVar(this, 'Vector');
32
+ switch (this.mode) {
33
+ case 'X_AXIS':
34
+ return `vec3 ${out} = _st_rotateAxisAngle(${vec}, vec3(1,0,0), ${angle});`;
35
+ case 'Y_AXIS':
36
+ return `vec3 ${out} = _st_rotateAxisAngle(${vec}, vec3(0,1,0), ${angle});`;
37
+ case 'Z_AXIS':
38
+ return `vec3 ${out} = _st_rotateAxisAngle(${vec}, vec3(0,0,1), ${angle});`;
39
+ default: {
40
+ const axis = ctx.resolveInput(this._inputs.axis);
41
+ return `vec3 ${out} = _st_rotateAxisAngle(${vec}, ${axis}, ${angle});`;
42
+ }
43
+ }
44
+ }
45
+ }
46
+ VectorRotate.instanceSpecificDef = false;
47
+ VectorRotate.glslFunction = `
48
+ vec3 _st_rotateAxisAngle(vec3 v, vec3 axis, float angle) {
49
+ float c = cos(angle), s = sin(angle);
50
+ axis = normalize(axis);
51
+ return v * c + cross(axis, v) * s + axis * dot(axis, v) * (1.0 - c);
52
+ }`;
@@ -0,0 +1,36 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import type { NodeMetadata } from '../../core/ShaderNode.js';
3
+ import type { CompileContext } from '../../core/CompileContext.js';
4
+ import type { OutputSocket } from '../../core/OutputSocket.js';
5
+ export type VectorTransformSpace = 'WORLD' | 'OBJECT' | 'CAMERA';
6
+ export type VectorTransformType = 'VECTOR' | 'POINT' | 'NORMAL';
7
+ export interface VectorTransformInputs {
8
+ vector?: OutputSocket;
9
+ fromSpace?: VectorTransformSpace;
10
+ toSpace?: VectorTransformSpace;
11
+ type?: VectorTransformType;
12
+ }
13
+ /**
14
+ * Vector Transform — Blender "Vector Transform" node equivalent.
15
+ * Transforms coordinates between World, Object, and Camera spaces.
16
+ *
17
+ * Inputs: vector, fromSpace, toSpace, type
18
+ * Outputs: Vector (color/vec3)
19
+ */
20
+ export declare class VectorTransform extends ProcessNode {
21
+ get nodeType(): string;
22
+ static instanceSpecificDef: boolean;
23
+ get metadata(): NodeMetadata;
24
+ static glslFunction: string;
25
+ private readonly fromSpace;
26
+ private readonly toSpace;
27
+ private readonly vtype;
28
+ private readonly _inputs;
29
+ private readonly _outputs;
30
+ constructor(inputs?: VectorTransformInputs);
31
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
32
+ getOutputSockets(): Record<string, OutputSocket>;
33
+ compileDefs(): string;
34
+ compileCall(ctx: CompileContext): string;
35
+ }
36
+ //# sourceMappingURL=VectorTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorTransform.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VectorTransform.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,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAChE,MAAM,MAAM,mBAAmB,GAAI,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAI,YAAY,CAAA;IACvB,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,OAAO,CAAC,EAAI,oBAAoB,CAAA;IAChC,IAAI,CAAC,EAAO,mBAAmB,CAAA;CAChC;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,QAAQ,WAA+B;IAC3C,MAAM,CAAC,mBAAmB,UAAQ;IAElC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,MAAM,CAAC,YAAY,SAenB;IAEA,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4E;IACpG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoE;gBAEjF,MAAM,GAAE,qBAA0B;IAS9C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}
@@ -0,0 +1,48 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ /**
3
+ * Vector Transform — Blender "Vector Transform" node equivalent.
4
+ * Transforms coordinates between World, Object, and Camera spaces.
5
+ *
6
+ * Inputs: vector, fromSpace, toSpace, type
7
+ * Outputs: Vector (color/vec3)
8
+ */
9
+ export class VectorTransform extends ProcessNode {
10
+ get nodeType() { return 'VectorTransform'; }
11
+ get metadata() {
12
+ return { label: 'Vector Transform', category: 'Vector', color: '#4a3a8a', cost: 'low' };
13
+ }
14
+ constructor(inputs = {}) {
15
+ super('VectorTransform');
16
+ this.fromSpace = inputs.fromSpace ?? 'WORLD';
17
+ this.toSpace = inputs.toSpace ?? 'OBJECT';
18
+ this.vtype = inputs.type ?? 'VECTOR';
19
+ this._inputs = this.createInputs(inputs, { vector: ['color', null] });
20
+ this._outputs = this.createOutputs({ Vector: 'color' });
21
+ }
22
+ getInputSockets() { return this._inputs; }
23
+ getOutputSockets() { return this._outputs; }
24
+ compileDefs() { return VectorTransform.glslFunction; }
25
+ compileCall(ctx) {
26
+ const spaceMap = { WORLD: 0, OBJECT: 1, CAMERA: 2 };
27
+ const typeMap = { VECTOR: 0, POINT: 1, NORMAL: 2 };
28
+ const vec = ctx.resolveInput(this._inputs.vector);
29
+ return `vec3 ${ctx.outputVar(this, 'Vector')} = _st_vectorTransform(${vec}, ${spaceMap[this.fromSpace]}, ${spaceMap[this.toSpace]}, ${typeMap[this.vtype]});`;
30
+ }
31
+ }
32
+ VectorTransform.instanceSpecificDef = false;
33
+ VectorTransform.glslFunction = `
34
+ vec3 _st_vectorTransform(vec3 v, int fromSpace, int toSpace, int vtype) {
35
+ vec3 result = v;
36
+ // World to Object: multiply by inverse model matrix (approximated)
37
+ if (fromSpace == 0 && toSpace == 1) {
38
+ result = (vec4(v, 0.0) * modelMatrix).xyz;
39
+ } else if (fromSpace == 1 && toSpace == 0) {
40
+ result = (modelMatrix * vec4(v, 0.0)).xyz;
41
+ } else if (toSpace == 2) {
42
+ result = (viewMatrix * vec4(result, 0.0)).xyz;
43
+ } else if (fromSpace == 2) {
44
+ result = (inverse(viewMatrix) * vec4(v, 0.0)).xyz;
45
+ }
46
+ if (vtype == 2) result = normalize(result);
47
+ return result;
48
+ }`;
@@ -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 VolumeAbsorptionInputs {
6
+ color?: OutputSocket | string;
7
+ density?: OutputSocket | number;
8
+ }
9
+ /**
10
+ * Volume Absorption — Blender "Volume Absorption" shader node.
11
+ * Absorbs light as it passes through the volume.
12
+ * Connect to MaterialOutput.volume.
13
+ *
14
+ * Inputs: color (color), density (float)
15
+ * Outputs: Volume (shader)
16
+ */
17
+ export declare class VolumeAbsorption 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?: VolumeAbsorptionInputs);
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=VolumeAbsorption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeAbsorption.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VolumeAbsorption.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,sBAAsB;IACrC,KAAK,CAAC,EAAI,YAAY,GAAG,MAAM,CAAA;IAC/B,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAA;CAChC;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,IAAI,QAAQ,WAAgC;IAC5C,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,sBAA2B;IAS/C,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
+ * Volume Absorption — Blender "Volume Absorption" shader node.
4
+ * Absorbs light as it passes through the volume.
5
+ * Connect to MaterialOutput.volume.
6
+ *
7
+ * Inputs: color (color), density (float)
8
+ * Outputs: Volume (shader)
9
+ */
10
+ export class VolumeAbsorption extends ProcessNode {
11
+ get nodeType() { return 'VolumeAbsorption'; }
12
+ get metadata() {
13
+ return { label: 'Volume Absorption', category: 'Shader', color: '#2255aa', cost: 'low' };
14
+ }
15
+ constructor(inputs = {}) {
16
+ super('VolumeAbsorption');
17
+ this._inputs = this.createInputs(inputs, {
18
+ color: ['color', '#000000'],
19
+ density: ['float', inputs.density ?? 1.0],
20
+ });
21
+ this._outputs = this.createOutputs({ Volume: 'shader' });
22
+ }
23
+ getInputSockets() { return this._inputs; }
24
+ getOutputSockets() { return this._outputs; }
25
+ compileDefs() { return VolumeAbsorption.glslFunction; }
26
+ compileCall(ctx) {
27
+ const color = ctx.resolveInput(this._inputs.color);
28
+ const density = ctx.resolveInput(this._inputs.density);
29
+ return `vec3 ${ctx.outputVar(this, 'Volume')} = _st_volumeAbsorption(${color}, ${density});`;
30
+ }
31
+ }
32
+ VolumeAbsorption.instanceSpecificDef = false;
33
+ VolumeAbsorption.glslFunction = `
34
+ vec3 _st_volumeAbsorption(vec3 color, float density) {
35
+ return color * density;
36
+ }`;
@@ -0,0 +1,31 @@
1
+ import { ProcessNode } from '../../core/ProcessNode.js';
2
+ import type { NodeMetadata } from '../../core/ShaderNode.js';
3
+ import type { CompileContext } from '../../core/CompileContext.js';
4
+ import type { OutputSocket } from '../../core/OutputSocket.js';
5
+ export interface VolumeScatterInputs {
6
+ color?: OutputSocket | string;
7
+ density?: OutputSocket | number;
8
+ anisotropy?: OutputSocket | number;
9
+ }
10
+ /**
11
+ * Volume Scatter — Blender "Volume Scatter" shader node.
12
+ * Scatters light inside the volume with Henyey-Greenstein phase function.
13
+ * Connect to MaterialOutput.volume.
14
+ *
15
+ * Inputs: color (color), density (float), anisotropy (float, -1..1)
16
+ * Outputs: Volume (shader)
17
+ */
18
+ export declare class VolumeScatter extends ProcessNode {
19
+ get nodeType(): string;
20
+ static instanceSpecificDef: boolean;
21
+ get metadata(): NodeMetadata;
22
+ static glslFunction: string;
23
+ private readonly _inputs;
24
+ private readonly _outputs;
25
+ constructor(inputs?: VolumeScatterInputs);
26
+ getInputSockets(): Record<string, import("../../core/InputSocket.js").InputSocket<unknown>>;
27
+ getOutputSockets(): Record<string, OutputSocket>;
28
+ compileDefs(): string;
29
+ compileCall(ctx: CompileContext): string;
30
+ }
31
+ //# sourceMappingURL=VolumeScatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeScatter.d.ts","sourceRoot":"","sources":["../../../src/nodes/process/VolumeScatter.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,mBAAmB;IAClC,KAAK,CAAC,EAAQ,YAAY,GAAG,MAAM,CAAA;IACnC,OAAO,CAAC,EAAM,YAAY,GAAG,MAAM,CAAA;IACnC,UAAU,CAAC,EAAG,YAAY,GAAG,MAAM,CAAA;CACpC;AAED;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,IAAI,QAAQ,WAA6B;IACzC,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,mBAAwB;IAU5C,eAAe;IACf,gBAAgB;IAChB,WAAW;IAEX,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAMzC"}