blockTools.ts 21 KB

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