blockTools.ts 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. import { DiscardBlock } from 'babylonjs/Materials/Node/Blocks/Fragment/discardBlock';
  2. import { BonesBlock } from 'babylonjs/Materials/Node/Blocks/Vertex/bonesBlock';
  3. import { InstancesBlock } from 'babylonjs/Materials/Node/Blocks/Vertex/instancesBlock';
  4. import { MorphTargetsBlock } from 'babylonjs/Materials/Node/Blocks/Vertex/morphTargetsBlock';
  5. import { ImageProcessingBlock } from 'babylonjs/Materials/Node/Blocks/Fragment/imageProcessingBlock';
  6. import { ColorMergerBlock } from 'babylonjs/Materials/Node/Blocks/colorMergerBlock';
  7. import { VectorMergerBlock } from 'babylonjs/Materials/Node/Blocks/vectorMergerBlock';
  8. import { ColorSplitterBlock } from 'babylonjs/Materials/Node/Blocks/colorSplitterBlock';
  9. import { VectorSplitterBlock } from 'babylonjs/Materials/Node/Blocks/vectorSplitterBlock';
  10. import { RemapBlock } from 'babylonjs/Materials/Node/Blocks/remapBlock';
  11. import { TextureBlock } from 'babylonjs/Materials/Node/Blocks/Dual/textureBlock';
  12. import { ReflectionTextureBlock } from 'babylonjs/Materials/Node/Blocks/Dual/reflectionTextureBlock';
  13. import { LightBlock } from 'babylonjs/Materials/Node/Blocks/Dual/lightBlock';
  14. import { FogBlock } from 'babylonjs/Materials/Node/Blocks/Dual/fogBlock';
  15. import { VertexOutputBlock } from 'babylonjs/Materials/Node/Blocks/Vertex/vertexOutputBlock';
  16. import { FragmentOutputBlock } from 'babylonjs/Materials/Node/Blocks/Fragment/fragmentOutputBlock';
  17. import { NormalizeBlock } from 'babylonjs/Materials/Node/Blocks/normalizeBlock';
  18. import { AddBlock } from 'babylonjs/Materials/Node/Blocks/addBlock';
  19. import { ScaleBlock } from 'babylonjs/Materials/Node/Blocks/scaleBlock';
  20. import { TrigonometryBlock, TrigonometryBlockOperations } from 'babylonjs/Materials/Node/Blocks/trigonometryBlock';
  21. import { ClampBlock } from 'babylonjs/Materials/Node/Blocks/clampBlock';
  22. import { CrossBlock } from 'babylonjs/Materials/Node/Blocks/crossBlock';
  23. import { DotBlock } from 'babylonjs/Materials/Node/Blocks/dotBlock';
  24. import { MultiplyBlock } from 'babylonjs/Materials/Node/Blocks/multiplyBlock';
  25. import { TransformBlock } from 'babylonjs/Materials/Node/Blocks/transformBlock';
  26. import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes';
  27. import { FresnelBlock } from 'babylonjs/Materials/Node/Blocks/fresnelBlock';
  28. import { LerpBlock } from 'babylonjs/Materials/Node/Blocks/lerpBlock';
  29. import { NLerpBlock } from 'babylonjs/Materials/Node/Blocks/nLerpBlock';
  30. import { DivideBlock } from 'babylonjs/Materials/Node/Blocks/divideBlock';
  31. import { SubtractBlock } from 'babylonjs/Materials/Node/Blocks/subtractBlock';
  32. import { StepBlock } from 'babylonjs/Materials/Node/Blocks/stepBlock';
  33. import { SmoothStepBlock } from 'babylonjs/Materials/Node/Blocks/smoothStepBlock';
  34. import { InputBlock } from 'babylonjs/Materials/Node/Blocks/Input/inputBlock';
  35. import { NodeMaterialSystemValues } from 'babylonjs/Materials/Node/Enums/nodeMaterialSystemValues';
  36. import { AnimatedInputBlockTypes } from 'babylonjs/Materials/Node/Blocks/Input/animatedInputBlockTypes';
  37. import { OneMinusBlock } from 'babylonjs/Materials/Node/Blocks/oneMinusBlock';
  38. import { ViewDirectionBlock } from 'babylonjs/Materials/Node/Blocks/viewDirectionBlock';
  39. import { LightInformationBlock } from 'babylonjs/Materials/Node/Blocks/Vertex/lightInformationBlock';
  40. import { MaxBlock } from 'babylonjs/Materials/Node/Blocks/maxBlock';
  41. import { MinBlock } from 'babylonjs/Materials/Node/Blocks/minBlock';
  42. import { PerturbNormalBlock } from 'babylonjs/Materials/Node/Blocks/Fragment/perturbNormalBlock';
  43. import { LengthBlock } from 'babylonjs/Materials/Node/Blocks/lengthBlock';
  44. import { DistanceBlock } from 'babylonjs/Materials/Node/Blocks/distanceBlock';
  45. import { NegateBlock } from 'babylonjs/Materials/Node/Blocks/negateBlock';
  46. import { PowBlock } from 'babylonjs/Materials/Node/Blocks/powBlock';
  47. import { Scene } from 'babylonjs/scene';
  48. import { RandomNumberBlock } from 'babylonjs/Materials/Node/Blocks/randomNumberBlock';
  49. import { ReplaceColorBlock } from 'babylonjs/Materials/Node/Blocks/replaceColorBlock';
  50. import { PosterizeBlock } from 'babylonjs/Materials/Node/Blocks/posterizeBlock';
  51. import { ArcTan2Block } from 'babylonjs/Materials/Node/Blocks/arcTan2Block';
  52. import { ReciprocalBlock } from 'babylonjs/Materials/Node/Blocks/reciprocalBlock';
  53. import { GradientBlock } from 'babylonjs/Materials/Node/Blocks/gradientBlock';
  54. import { WaveBlock, WaveBlockKind } from 'babylonjs/Materials/Node/Blocks/waveBlock';
  55. import { NodeMaterial } from 'babylonjs/Materials/Node/nodeMaterial';
  56. export class BlockTools {
  57. public static GetBlockFromString(data: string, scene: Scene, nodeMaterial: NodeMaterial) {
  58. switch (data) {
  59. case "BonesBlock":
  60. return new BonesBlock("Bones");
  61. case "InstancesBlock":
  62. return new InstancesBlock("Instances");
  63. case "MorphTargetsBlock":
  64. return new MorphTargetsBlock("MorphTargets");
  65. case "DiscardBlock":
  66. return new DiscardBlock("Discard");
  67. case "ImageProcessingBlock":
  68. return new ImageProcessingBlock("ImageProcessing");
  69. case "ColorMergerBlock":
  70. return new ColorMergerBlock("ColorMerger");
  71. case "VectorMergerBlock":
  72. return new VectorMergerBlock("VectorMerger");
  73. case "ColorSplitterBlock":
  74. return new ColorSplitterBlock("ColorSplitter");
  75. case "VectorSplitterBlock":
  76. return new VectorSplitterBlock("VectorSplitter");
  77. case "TextureBlock":
  78. return new TextureBlock("Texture");
  79. case "ReflectionTextureBlock":
  80. return new ReflectionTextureBlock("Reflection texture");
  81. case "LightBlock":
  82. return new LightBlock("Lights");
  83. case "FogBlock":
  84. return new FogBlock("Fog");
  85. case "VertexOutputBlock":
  86. return new VertexOutputBlock("VertexOutput");
  87. case "FragmentOutputBlock":
  88. return new FragmentOutputBlock("FragmentOutput");
  89. case "AddBlock":
  90. return new AddBlock("Add");
  91. case "ClampBlock":
  92. return new ClampBlock("Clamp");
  93. case "ScaleBlock":
  94. return new ScaleBlock("Scale");
  95. case "CrossBlock":
  96. return new CrossBlock("Cross");
  97. case "DotBlock":
  98. return new DotBlock("Dot");
  99. case "PowBlock":
  100. return new PowBlock("Pow");
  101. case "MultiplyBlock":
  102. return new MultiplyBlock("Multiply");
  103. case "TransformBlock":
  104. return new TransformBlock("Transform");
  105. case "TrigonometryBlock":
  106. return new TrigonometryBlock("Trigonometry");
  107. case "RemapBlock":
  108. return new RemapBlock("Remap");
  109. case "NormalizeBlock":
  110. return new NormalizeBlock("Normalize");
  111. case "FresnelBlock":
  112. return new FresnelBlock("Fresnel");
  113. case "LerpBlock":
  114. return new LerpBlock("Lerp");
  115. case "NLerpBlock":
  116. return new NLerpBlock("NLerp");
  117. case "DivideBlock":
  118. return new DivideBlock("Divide");
  119. case "SubtractBlock":
  120. return new SubtractBlock("Subtract");
  121. case "StepBlock":
  122. return new StepBlock("Step");
  123. case "SmoothStepBlock":
  124. return new SmoothStepBlock("Smooth step");
  125. case "OneMinusBlock":
  126. return new OneMinusBlock("One minus");
  127. case "ReciprocalBlock":
  128. return new ReciprocalBlock("Reciprocal");
  129. case "ViewDirectionBlock":
  130. return new ViewDirectionBlock("View direction");
  131. case "LightInformationBlock":
  132. let lightInformationBlock = new LightInformationBlock("Light information");
  133. lightInformationBlock.light = scene.lights.length ? scene.lights[0] : null;
  134. return lightInformationBlock;
  135. case "MaxBlock":
  136. return new MaxBlock("Max");
  137. case "MinBlock":
  138. return new MinBlock("Min");
  139. case "LengthBlock":
  140. return new LengthBlock("Length");
  141. case "DistanceBlock":
  142. return new DistanceBlock("Distance");
  143. case "NegateBlock":
  144. return new NegateBlock("Negate");
  145. case "PerturbNormalBlock":
  146. return new PerturbNormalBlock("Perturb normal");
  147. case "RandomNumberBlock":
  148. return new RandomNumberBlock("Random number");
  149. case "ReplaceColorBlock":
  150. return new ReplaceColorBlock("Replace color");
  151. case "PosterizeBlock":
  152. return new PosterizeBlock("Posterize");
  153. case "ArcTan2Block":
  154. return new ArcTan2Block("ArcTan2");
  155. case "GradientBlock":
  156. return new GradientBlock("Gradient");
  157. case "CosBlock": {
  158. let cosBlock = new TrigonometryBlock("Cos");
  159. cosBlock.operation = TrigonometryBlockOperations.Cos;
  160. return cosBlock;
  161. }
  162. case "SinBlock": {
  163. let sinBlock = new TrigonometryBlock("Sin");
  164. sinBlock.operation = TrigonometryBlockOperations.Sin;
  165. return sinBlock;
  166. }
  167. case "AbsBlock": {
  168. let absBlock = new TrigonometryBlock("Abs");
  169. absBlock.operation = TrigonometryBlockOperations.Abs;
  170. return absBlock;
  171. }
  172. case "SqrtBlock": {
  173. let sqrtBlock = new TrigonometryBlock("Sqrt");
  174. sqrtBlock.operation = TrigonometryBlockOperations.Sqrt;
  175. return sqrtBlock;
  176. }
  177. case "ArcCosBlock": {
  178. let acosBlock = new TrigonometryBlock("ArcCos");
  179. acosBlock.operation = TrigonometryBlockOperations.ArcCos;
  180. return acosBlock;
  181. }
  182. case "ArcSinBlock": {
  183. let asinBlock = new TrigonometryBlock("ArcSin");
  184. asinBlock.operation = TrigonometryBlockOperations.ArcSin;
  185. return asinBlock;
  186. }
  187. case "TanBlock": {
  188. let tanBlock = new TrigonometryBlock("Tan");
  189. tanBlock.operation = TrigonometryBlockOperations.Tan;
  190. return tanBlock;
  191. }
  192. case "ArcTanBlock": {
  193. let atanBlock = new TrigonometryBlock("ArcTan");
  194. atanBlock.operation = TrigonometryBlockOperations.ArcTan;
  195. return atanBlock;
  196. }
  197. case "FractBlock": {
  198. let fractBlock = new TrigonometryBlock("Fract");
  199. fractBlock.operation = TrigonometryBlockOperations.Fract;
  200. return fractBlock;
  201. }
  202. case "SignBlock": {
  203. let signBlock = new TrigonometryBlock("Sign");
  204. signBlock.operation = TrigonometryBlockOperations.Sign;
  205. return signBlock;
  206. }
  207. case "LogBlock": {
  208. let logBlock = new TrigonometryBlock("Log");
  209. logBlock.operation = TrigonometryBlockOperations.Log;
  210. return logBlock;
  211. }
  212. case "ExpBlock": {
  213. let expBlock = new TrigonometryBlock("Exp");
  214. expBlock.operation = TrigonometryBlockOperations.Exp;
  215. return expBlock;
  216. }
  217. case "Exp2Block": {
  218. let exp2Block = new TrigonometryBlock("Exp2");
  219. exp2Block.operation = TrigonometryBlockOperations.Exp2;
  220. return exp2Block;
  221. }
  222. case "DegreesToRadiansBlock": {
  223. let degreesToRadiansBlock = new TrigonometryBlock("Degrees to radians");
  224. degreesToRadiansBlock.operation = TrigonometryBlockOperations.Radians;
  225. return degreesToRadiansBlock;
  226. }
  227. case "RadiansToDegreesBlock": {
  228. let radiansToDegreesBlock = new TrigonometryBlock("Radians to degrees");
  229. radiansToDegreesBlock.operation = TrigonometryBlockOperations.Degrees;
  230. return radiansToDegreesBlock;
  231. }
  232. case "RoundBlock": {
  233. let roundBlock = new TrigonometryBlock("Round");
  234. roundBlock.operation = TrigonometryBlockOperations.Round;
  235. return roundBlock;
  236. }
  237. case "CeilingBlock": {
  238. let ceilingBlock = new TrigonometryBlock("Ceiling");
  239. ceilingBlock.operation = TrigonometryBlockOperations.Ceiling;
  240. return ceilingBlock;
  241. }
  242. case "FloorBlock": {
  243. let floorBlock = new TrigonometryBlock("Floor");
  244. floorBlock.operation = TrigonometryBlockOperations.Floor;
  245. return floorBlock;
  246. }
  247. case "SawToothWaveBlock": {
  248. let sawToothWaveBlock = new WaveBlock("SawTooth wave");
  249. sawToothWaveBlock.kind = WaveBlockKind.SawTooth;
  250. return sawToothWaveBlock;
  251. }
  252. case "SquareWaveBlock": {
  253. let squareWaveBlock = new WaveBlock("Square wave");
  254. squareWaveBlock.kind = WaveBlockKind.Square;
  255. return squareWaveBlock;
  256. }
  257. case "TriangleWaveBlock": {
  258. let triangleWaveBlock = new WaveBlock("Triangle wave");
  259. triangleWaveBlock.kind = WaveBlockKind.Triangle;
  260. return triangleWaveBlock;
  261. }
  262. case "WorldMatrixBlock": {
  263. let worldMatrixBlock = new InputBlock("World");
  264. worldMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.World);
  265. return worldMatrixBlock;
  266. }
  267. case "WorldViewMatrixBlock": {
  268. let worldViewMatrixBlock = new InputBlock("World x View");
  269. worldViewMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.WorldView);
  270. return worldViewMatrixBlock;
  271. }
  272. case "WorldViewProjectionMatrixBlock": {
  273. let worldViewProjectionMatrixBlock = new InputBlock("World x View x Projection");
  274. worldViewProjectionMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.WorldViewProjection);
  275. return worldViewProjectionMatrixBlock;
  276. }
  277. case "ViewMatrixBlock": {
  278. let viewMatrixBlock = new InputBlock("View");
  279. viewMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.View);
  280. return viewMatrixBlock;
  281. }
  282. case "ViewProjectionMatrixBlock": {
  283. let viewProjectionMatrixBlock = new InputBlock("View x Projection");
  284. viewProjectionMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.ViewProjection);
  285. return viewProjectionMatrixBlock;
  286. }
  287. case "ProjectionMatrixBlock": {
  288. let projectionMatrixBlock = new InputBlock("Projection");
  289. projectionMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.Projection);
  290. return projectionMatrixBlock;
  291. }
  292. case "CameraPositionBlock": {
  293. let cameraPosition = new InputBlock("Camera position");
  294. cameraPosition.setAsSystemValue(NodeMaterialSystemValues.CameraPosition);
  295. return cameraPosition;
  296. }
  297. case "FogColorBlock": {
  298. let FogColor = new InputBlock("Fog color");
  299. FogColor.setAsSystemValue(NodeMaterialSystemValues.FogColor);
  300. return FogColor;
  301. }
  302. case "PositionBlock": {
  303. let meshPosition = new InputBlock("position");
  304. meshPosition.setAsAttribute("position");
  305. return meshPosition;
  306. }
  307. case "UVBlock": {
  308. let meshUV = new InputBlock("uv");
  309. meshUV.setAsAttribute("uv");
  310. return meshUV;
  311. }
  312. case "ColorBlock": {
  313. let meshColor = new InputBlock("color");
  314. meshColor.setAsAttribute("color");
  315. return meshColor;
  316. }
  317. case "NormalBlock": {
  318. let meshNormal = new InputBlock("normal");
  319. meshNormal.setAsAttribute("normal");
  320. return meshNormal;
  321. }
  322. case "TangentBlock": {
  323. let meshTangent = new InputBlock("tangent");
  324. meshTangent.setAsAttribute("tangent");
  325. return meshTangent;
  326. }
  327. case "MatrixIndicesBlock": {
  328. let meshMatrixIndices = new InputBlock("matricesIndices");
  329. meshMatrixIndices.setAsAttribute("matricesIndices");
  330. return meshMatrixIndices;
  331. }
  332. case "MatrixWeightsBlock": {
  333. let meshMatrixWeights = new InputBlock("matricesWeights");
  334. meshMatrixWeights.setAsAttribute("matricesWeights");
  335. return meshMatrixWeights;
  336. }
  337. case "TimeBlock": {
  338. let timeBlock = new InputBlock("Time", undefined, NodeMaterialBlockConnectionPointTypes.Float);
  339. timeBlock.animationType = AnimatedInputBlockTypes.Time;
  340. return timeBlock;
  341. }
  342. case "DeltaTimeBlock": {
  343. let deltaTimeBlock = new InputBlock("Delta time");
  344. deltaTimeBlock.setAsSystemValue(NodeMaterialSystemValues.DeltaTime);
  345. return deltaTimeBlock;
  346. }
  347. case "WorldPositionBlock": {
  348. let worldPositionBlock = nodeMaterial.getInputBlockByPredicate(b => b.isAttribute && b.name === "position");
  349. if (!worldPositionBlock) {
  350. worldPositionBlock = new InputBlock("position");
  351. worldPositionBlock.setAsAttribute("position");
  352. }
  353. let worldMatrixBlock = nodeMaterial.getInputBlockByPredicate(b => b.isSystemValue && b.systemValue === NodeMaterialSystemValues.World);
  354. if (!worldMatrixBlock) {
  355. worldMatrixBlock = new InputBlock("World");
  356. worldMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.World);
  357. }
  358. let transformBlock = new TransformBlock("World position");
  359. worldPositionBlock.connectTo(transformBlock);
  360. worldMatrixBlock.connectTo(transformBlock);
  361. return transformBlock;
  362. }
  363. case "WorldNormalBlock": {
  364. let worldNormalBlock = nodeMaterial.getInputBlockByPredicate(b => b.isAttribute && b.name === "normal");
  365. if (!worldNormalBlock) {
  366. worldNormalBlock = new InputBlock("normal");
  367. worldNormalBlock.setAsAttribute("normal");
  368. }
  369. let worldMatrixBlock = nodeMaterial.getInputBlockByPredicate(b => b.isSystemValue && b.systemValue === NodeMaterialSystemValues.World);
  370. if (!worldMatrixBlock) {
  371. worldMatrixBlock = new InputBlock("World");
  372. worldMatrixBlock.setAsSystemValue(NodeMaterialSystemValues.World);
  373. }
  374. let transformBlock = new TransformBlock("World normal");
  375. worldNormalBlock.connectTo(transformBlock);
  376. worldMatrixBlock.connectTo(transformBlock);
  377. return transformBlock;
  378. }
  379. }
  380. return null;
  381. }
  382. public static GetColorFromConnectionNodeType(type: NodeMaterialBlockConnectionPointTypes) {
  383. let color = "Red";
  384. switch (type) {
  385. case NodeMaterialBlockConnectionPointTypes.Float:
  386. color = "#cb9e27";
  387. break;
  388. case NodeMaterialBlockConnectionPointTypes.Vector2:
  389. color = "#16bcb1";
  390. break;
  391. case NodeMaterialBlockConnectionPointTypes.Vector3:
  392. case NodeMaterialBlockConnectionPointTypes.Color3:
  393. color = "#b786cb";
  394. break;
  395. case NodeMaterialBlockConnectionPointTypes.Vector4:
  396. case NodeMaterialBlockConnectionPointTypes.Color4:
  397. color = "#be5126";
  398. break;
  399. case NodeMaterialBlockConnectionPointTypes.Matrix:
  400. color = "#591990";
  401. break;
  402. }
  403. return color;
  404. }
  405. public static GetConnectionNodeTypeFromString(type: string) {
  406. switch (type) {
  407. case "Float":
  408. return NodeMaterialBlockConnectionPointTypes.Float;
  409. case "Vector2":
  410. return NodeMaterialBlockConnectionPointTypes.Vector2;
  411. case "Vector3":
  412. return NodeMaterialBlockConnectionPointTypes.Vector3;
  413. case "Vector4":
  414. return NodeMaterialBlockConnectionPointTypes.Vector4;
  415. case "Matrix":
  416. return NodeMaterialBlockConnectionPointTypes.Matrix;
  417. case "Color3":
  418. return NodeMaterialBlockConnectionPointTypes.Color3;
  419. case "Color4":
  420. return NodeMaterialBlockConnectionPointTypes.Color4;
  421. }
  422. return NodeMaterialBlockConnectionPointTypes.AutoDetect;
  423. }
  424. public static GetStringFromConnectionNodeType(type: NodeMaterialBlockConnectionPointTypes) {
  425. switch (type){
  426. case NodeMaterialBlockConnectionPointTypes.Float:
  427. return "Float";
  428. case NodeMaterialBlockConnectionPointTypes.Vector2:
  429. return "Vector2";
  430. case NodeMaterialBlockConnectionPointTypes.Vector3:
  431. return "Vector3";
  432. case NodeMaterialBlockConnectionPointTypes.Vector4:
  433. return "Vector4";
  434. case NodeMaterialBlockConnectionPointTypes.Color3:
  435. return "Color3";
  436. case NodeMaterialBlockConnectionPointTypes.Color4:
  437. return "Color4";
  438. case NodeMaterialBlockConnectionPointTypes.Matrix:
  439. return "Matrix";
  440. }
  441. return "";
  442. }
  443. }