inputDisplayManager.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { IDisplayManager } from './displayManager';
  2. import { NodeMaterialBlock } from 'babylonjs/Materials/Node/nodeMaterialBlock';
  3. import { InputBlock } from 'babylonjs/Materials/Node/Blocks/Input/inputBlock';
  4. import { NodeMaterialSystemValues } from 'babylonjs/Materials/Node/Enums/nodeMaterialSystemValues';
  5. import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes';
  6. import { AnimatedInputBlockTypes } from 'babylonjs/Materials/Node/Blocks/Input/animatedInputBlockTypes';
  7. import { Vector2, Vector3, Vector4 } from 'babylonjs/Maths/math.vector';
  8. import { Color3 } from 'babylonjs/Maths/math.color';
  9. import { BlockTools } from '../../blockTools';
  10. import { StringTools } from '../../stringTools';
  11. const inputNameToAttributeValue: { [name: string] : string } = {
  12. "position2d" : "position",
  13. "particle_uv" : "uv",
  14. "particle_color" : "color",
  15. "particle_texturemask": "textureMask",
  16. "particle_positionw" : "positionW",
  17. };
  18. const inputNameToAttributeName: { [name: string] : string } = {
  19. "position2d" : "postprocess",
  20. "particle_uv" : "particle",
  21. "particle_color" : "particle",
  22. "particle_texturemask": "particle",
  23. "particle_positionw": "particle",
  24. };
  25. export class InputDisplayManager implements IDisplayManager {
  26. public getHeaderClass(block: NodeMaterialBlock) {
  27. let inputBlock = block as InputBlock;
  28. if (inputBlock.isConstant) {
  29. return "constant";
  30. }
  31. if (inputBlock.visibleInInspector) {
  32. return "inspector";
  33. }
  34. return "";
  35. }
  36. public shouldDisplayPortLabels(block: NodeMaterialBlock): boolean {
  37. return false;
  38. }
  39. public getHeaderText(block: NodeMaterialBlock): string {
  40. let inputBlock = block as InputBlock;
  41. let name = `${inputBlock.name} (${StringTools.GetBaseType(inputBlock.output.type)})`;
  42. if (inputBlock.isAttribute) {
  43. name = StringTools.GetBaseType(inputBlock.output.type);
  44. }
  45. return name;
  46. }
  47. public getBackgroundColor(block: NodeMaterialBlock): string {
  48. let color = "";
  49. let inputBlock = block as InputBlock;
  50. switch (inputBlock.type) {
  51. case NodeMaterialBlockConnectionPointTypes.Color3:
  52. case NodeMaterialBlockConnectionPointTypes.Color4: {
  53. if (inputBlock.value) {
  54. color = (inputBlock.value as Color3).toHexString();
  55. break;
  56. }
  57. }
  58. default:
  59. color = BlockTools.GetColorFromConnectionNodeType(inputBlock.type);
  60. break;
  61. }
  62. return color;
  63. }
  64. public updatePreviewContent(block: NodeMaterialBlock, contentArea: HTMLDivElement): void {
  65. let value = "";
  66. let inputBlock = block as InputBlock;
  67. if (inputBlock.isAttribute) {
  68. const attrVal = inputNameToAttributeValue[inputBlock.name] ?? inputBlock.name;
  69. const attrName = inputNameToAttributeName[inputBlock.name] ?? 'mesh';
  70. value = attrName + "." + attrVal;
  71. } else if (inputBlock.isSystemValue) {
  72. switch (inputBlock.systemValue) {
  73. case NodeMaterialSystemValues.World:
  74. value = "World";
  75. break;
  76. case NodeMaterialSystemValues.WorldView:
  77. value = "World x View";
  78. break;
  79. case NodeMaterialSystemValues.WorldViewProjection:
  80. value = "World x View x Projection";
  81. break;
  82. case NodeMaterialSystemValues.View:
  83. value = "View";
  84. break;
  85. case NodeMaterialSystemValues.ViewProjection:
  86. value = "View x Projection";
  87. break;
  88. case NodeMaterialSystemValues.Projection:
  89. value = "Projection";
  90. break;
  91. case NodeMaterialSystemValues.CameraPosition:
  92. value = "Camera position";
  93. break;
  94. case NodeMaterialSystemValues.FogColor:
  95. value = "Fog color";
  96. break;
  97. case NodeMaterialSystemValues.DeltaTime:
  98. value = "Delta time";
  99. break;
  100. }
  101. } else {
  102. switch (inputBlock.type) {
  103. case NodeMaterialBlockConnectionPointTypes.Float:
  104. if (inputBlock.animationType !== AnimatedInputBlockTypes.None) {
  105. value = AnimatedInputBlockTypes[inputBlock.animationType];
  106. } else {
  107. value = inputBlock.value.toFixed(2);
  108. }
  109. break;
  110. case NodeMaterialBlockConnectionPointTypes.Vector2:
  111. let vec2Value = inputBlock.value as Vector2;
  112. value = `(${vec2Value.x.toFixed(2)}, ${vec2Value.y.toFixed(2)})`;
  113. break;
  114. case NodeMaterialBlockConnectionPointTypes.Vector3:
  115. let vec3Value = inputBlock.value as Vector3;
  116. value = `(${vec3Value.x.toFixed(2)}, ${vec3Value.y.toFixed(2)}, ${vec3Value.z.toFixed(2)})`;
  117. break;
  118. case NodeMaterialBlockConnectionPointTypes.Vector4:
  119. let vec4Value = inputBlock.value as Vector4;
  120. value = `(${vec4Value.x.toFixed(2)}, ${vec4Value.y.toFixed(2)}, ${vec4Value.z.toFixed(2)}, ${vec4Value.w.toFixed(2)})`;
  121. break;
  122. }
  123. }
  124. contentArea.innerHTML = value;
  125. contentArea.classList.add("input-block");
  126. }
  127. }