meshDebugPluginMaterial.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. import { __decorate } from "../tslib.es6.js";
  2. /* eslint-disable @typescript-eslint/naming-convention */
  3. import { MaterialPluginBase } from "./materialPluginBase.js";
  4. import { MaterialDefines } from "./materialDefines.js";
  5. import { RegisterClass } from "../Misc/typeStore.js";
  6. import { Color3 } from "../Maths/math.js";
  7. import { Logger } from "../Misc/logger.js";
  8. import { expandToProperty, serialize, serializeAsColor3 } from "../Misc/decorators.js";
  9. const vertexDefinitions = `#if defined(DBG_ENABLED)
  10. attribute float dbg_initialPass;
  11. varying vec3 dbg_vBarycentric;
  12. flat varying vec3 dbg_vVertexWorldPos;
  13. flat varying float dbg_vPass;
  14. #endif`;
  15. const vertexMainEnd = `#if defined(DBG_ENABLED)
  16. float dbg_vertexIndex = mod(float(gl_VertexID), 3.);
  17. if (dbg_vertexIndex == 0.0) {
  18. dbg_vBarycentric = vec3(1.,0.,0.);
  19. }
  20. else if (dbg_vertexIndex == 1.0) {
  21. dbg_vBarycentric = vec3(0.,1.,0.);
  22. }
  23. else {
  24. dbg_vBarycentric = vec3(0.,0.,1.);
  25. }
  26. dbg_vVertexWorldPos = vPositionW;
  27. dbg_vPass = dbg_initialPass;
  28. #endif`;
  29. const fragmentUniforms = `#if defined(DBG_ENABLED)
  30. uniform vec3 dbg_shadedDiffuseColor;
  31. uniform vec4 dbg_shadedSpecularColorPower;
  32. uniform vec3 dbg_thicknessRadiusScale;
  33. #if DBG_MODE == 2 || DBG_MODE == 3
  34. uniform vec3 dbg_vertexColor;
  35. #endif
  36. #if DBG_MODE == 1
  37. uniform vec3 dbg_wireframeTrianglesColor;
  38. #elif DBG_MODE == 3
  39. uniform vec3 dbg_wireframeVerticesColor;
  40. #elif DBG_MODE == 4 || DBG_MODE == 5
  41. uniform vec3 dbg_uvPrimaryColor;
  42. uniform vec3 dbg_uvSecondaryColor;
  43. #elif DBG_MODE == 7
  44. uniform vec3 dbg_materialColor;
  45. #endif
  46. #endif`;
  47. const fragmentDefinitions = `#if defined(DBG_ENABLED)
  48. varying vec3 dbg_vBarycentric;
  49. flat varying vec3 dbg_vVertexWorldPos;
  50. flat varying float dbg_vPass;
  51. #if !defined(DBG_MULTIPLY)
  52. vec3 dbg_applyShading(vec3 color) {
  53. vec3 N = vNormalW.xyz;
  54. vec3 L = normalize(vEyePosition.xyz - vPositionW.xyz);
  55. vec3 H = normalize(L + L);
  56. float LdotN = clamp(dot(L,N), 0., 1.);
  57. float HdotN = clamp(dot(H,N), 0., 1.);
  58. float specTerm = pow(HdotN, dbg_shadedSpecularColorPower.w);
  59. color *= (LdotN / PI);
  60. color += dbg_shadedSpecularColorPower.rgb * (specTerm / PI);
  61. return color;
  62. }
  63. #endif
  64. #if DBG_MODE == 1 || DBG_MODE == 3
  65. float dbg_edgeFactor() {
  66. vec3 d = fwidth(dbg_vBarycentric);
  67. vec3 a3 = smoothstep(vec3(0.), d * dbg_thicknessRadiusScale.x, dbg_vBarycentric);
  68. return min(min(a3.x, a3.y), a3.z);
  69. }
  70. #endif
  71. #if DBG_MODE == 2 || DBG_MODE == 3
  72. float dbg_cornerFactor() {
  73. vec3 worldPos = vPositionW;
  74. float dist = length(worldPos - dbg_vVertexWorldPos);
  75. float camDist = length(worldPos - vEyePosition.xyz);
  76. float d = sqrt(camDist) * .001;
  77. return smoothstep((dbg_thicknessRadiusScale.y * d), ((dbg_thicknessRadiusScale.y * 1.01) * d), dist);
  78. }
  79. #endif
  80. #if (DBG_MODE == 4 && defined(UV1)) || (DBG_MODE == 5 && defined(UV2))
  81. float dbg_checkerboardFactor(vec2 uv) {
  82. vec2 f = fract(uv * dbg_thicknessRadiusScale.z);
  83. f -= .5;
  84. return (f.x * f.y) > 0. ? 1. : 0.;
  85. }
  86. #endif
  87. #endif`;
  88. const fragmentMainEnd = `#if defined(DBG_ENABLED)
  89. vec3 dbg_color = vec3(1.);
  90. #if DBG_MODE == 1
  91. dbg_color = mix(dbg_wireframeTrianglesColor, vec3(1.), dbg_edgeFactor());
  92. #elif DBG_MODE == 2 || DBG_MODE == 3
  93. float dbg_cornerFactor = dbg_cornerFactor();
  94. if (dbg_vPass == 0. && dbg_cornerFactor == 1.) discard;
  95. dbg_color = mix(dbg_vertexColor, vec3(1.), dbg_cornerFactor);
  96. #if DBG_MODE == 3
  97. dbg_color *= mix(dbg_wireframeVerticesColor, vec3(1.), dbg_edgeFactor());
  98. #endif
  99. #elif DBG_MODE == 4 && defined(UV1)
  100. dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV1));
  101. #elif DBG_MODE == 5 && defined(UV2)
  102. dbg_color = mix(dbg_uvPrimaryColor, dbg_uvSecondaryColor, dbg_checkerboardFactor(vMainUV2));
  103. #elif DBG_MODE == 6 && defined(VERTEXCOLOR)
  104. dbg_color = vColor.rgb;
  105. #elif DBG_MODE == 7
  106. dbg_color = dbg_materialColor;
  107. #endif
  108. #if defined(DBG_MULTIPLY)
  109. gl_FragColor *= vec4(dbg_color, 1.);
  110. #else
  111. #if DBG_MODE != 6
  112. gl_FragColor = vec4(dbg_applyShading(dbg_shadedDiffuseColor) * dbg_color, 1.);
  113. #else
  114. gl_FragColor = vec4(dbg_color, 1.);
  115. #endif
  116. #endif
  117. #endif`;
  118. const defaultMaterialColors = [
  119. new Color3(0.98, 0.26, 0.38),
  120. new Color3(0.47, 0.75, 0.3),
  121. new Color3(0, 0.26, 0.77),
  122. new Color3(0.97, 0.6, 0.76),
  123. new Color3(0.19, 0.63, 0.78),
  124. new Color3(0.98, 0.8, 0.6),
  125. new Color3(0.65, 0.43, 0.15),
  126. new Color3(0.15, 0.47, 0.22),
  127. new Color3(0.67, 0.71, 0.86),
  128. new Color3(0.09, 0.46, 0.56),
  129. new Color3(0.8, 0.98, 0.02),
  130. new Color3(0.39, 0.29, 0.13),
  131. new Color3(0.53, 0.63, 0.06),
  132. new Color3(0.95, 0.96, 0.41),
  133. new Color3(1, 0.72, 0.94),
  134. new Color3(0.63, 0.08, 0.31),
  135. new Color3(0.66, 0.96, 0.95),
  136. new Color3(0.22, 0.14, 0.19),
  137. new Color3(0.14, 0.65, 0.59),
  138. new Color3(0.93, 1, 0.68),
  139. new Color3(0.93, 0.14, 0.44),
  140. new Color3(0.47, 0.86, 0.67),
  141. new Color3(0.85, 0.07, 0.78),
  142. new Color3(0.53, 0.64, 0.98),
  143. new Color3(0.43, 0.37, 0.56),
  144. new Color3(0.71, 0.65, 0.25),
  145. new Color3(0.66, 0.19, 0.01),
  146. new Color3(0.94, 0.53, 0.12),
  147. new Color3(0.41, 0.44, 0.44),
  148. new Color3(0.24, 0.71, 0.96),
  149. new Color3(0.57, 0.28, 0.56),
  150. new Color3(0.44, 0.98, 0.42),
  151. ];
  152. /**
  153. * Supported visualizations of MeshDebugPluginMaterial
  154. */
  155. export var MeshDebugMode;
  156. (function (MeshDebugMode) {
  157. /**
  158. * Material without any mesh debug visualization
  159. */
  160. MeshDebugMode[MeshDebugMode["NONE"] = 0] = "NONE";
  161. /**
  162. * A wireframe of the mesh
  163. * NOTE: For this mode to work correctly, convertToUnIndexedMesh() or MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
  164. */
  165. MeshDebugMode[MeshDebugMode["TRIANGLES"] = 1] = "TRIANGLES";
  166. /**
  167. * Points drawn over vertices of mesh
  168. * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
  169. */
  170. MeshDebugMode[MeshDebugMode["VERTICES"] = 2] = "VERTICES";
  171. /**
  172. * A wireframe of the mesh, with points drawn over vertices
  173. * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
  174. */
  175. MeshDebugMode[MeshDebugMode["TRIANGLES_VERTICES"] = 3] = "TRIANGLES_VERTICES";
  176. /**
  177. * A checkerboard grid of the mesh's UV set 0
  178. */
  179. MeshDebugMode[MeshDebugMode["UV0"] = 4] = "UV0";
  180. /**
  181. * A checkerboard grid of the mesh's UV set 1
  182. */
  183. MeshDebugMode[MeshDebugMode["UV1"] = 5] = "UV1";
  184. /**
  185. * The mesh's vertex colors displayed as the primary texture
  186. */
  187. MeshDebugMode[MeshDebugMode["VERTEXCOLORS"] = 6] = "VERTEXCOLORS";
  188. /**
  189. * An arbitrary, distinguishable color to identify the material
  190. */
  191. MeshDebugMode[MeshDebugMode["MATERIALIDS"] = 7] = "MATERIALIDS";
  192. })(MeshDebugMode || (MeshDebugMode = {}));
  193. /** @internal */
  194. class MeshDebugDefines extends MaterialDefines {
  195. constructor() {
  196. super(...arguments);
  197. /**
  198. * Current mesh debug visualization.
  199. * Defaults to NONE.
  200. */
  201. this.DBG_MODE = MeshDebugMode.NONE;
  202. /**
  203. * Whether the mesh debug visualization multiplies with colors underneath.
  204. * Defaults to true.
  205. */
  206. this.DBG_MULTIPLY = true;
  207. /**
  208. * Whether the mesh debug plugin is enabled in the material.
  209. * Defaults to true.
  210. */
  211. this.DBG_ENABLED = true;
  212. }
  213. }
  214. /**
  215. * Plugin that implements various mesh debug visualizations,
  216. * List of available visualizations can be found in MeshDebugMode enum.
  217. */
  218. export class MeshDebugPluginMaterial extends MaterialPluginBase {
  219. /** @internal */
  220. _markAllDefinesAsDirty() {
  221. this._enable(this._isEnabled);
  222. this.markAllDefinesAsDirty();
  223. }
  224. /**
  225. * Creates a new MeshDebugPluginMaterial
  226. * @param material Material to attach the mesh debug plugin to
  227. * @param options Options for the mesh debug plugin
  228. */
  229. constructor(material, options = {}) {
  230. const defines = new MeshDebugDefines();
  231. defines.DBG_MODE = options.mode ?? defines.DBG_MODE;
  232. defines.DBG_MULTIPLY = options.multiply ?? defines.DBG_MULTIPLY;
  233. super(material, "MeshDebug", 200, defines, true, true);
  234. this._mode = defines.DBG_MODE;
  235. this._multiply = defines.DBG_MULTIPLY;
  236. this.shadedDiffuseColor = options.shadedDiffuseColor ?? new Color3(1, 1, 1);
  237. this.shadedSpecularColor = options.shadedSpecularColor ?? new Color3(0.8, 0.8, 0.8);
  238. this.shadedSpecularPower = options.shadedSpecularPower ?? 10;
  239. this.wireframeThickness = options.wireframeThickness ?? 0.7;
  240. this.wireframeTrianglesColor = options.wireframeTrianglesColor ?? new Color3(0, 0, 0);
  241. this.wireframeVerticesColor = options.wireframeVerticesColor ?? new Color3(0.8, 0.8, 0.8);
  242. this.vertexColor = options.vertexColor ?? new Color3(0, 0, 0);
  243. this.vertexRadius = options.vertexRadius ?? 1.2;
  244. this.uvScale = options.uvScale ?? 20;
  245. this.uvPrimaryColor = options.uvPrimaryColor ?? new Color3(1, 1, 1);
  246. this.uvSecondaryColor = options.uvSecondaryColor ?? new Color3(0.5, 0.5, 0.5);
  247. this._materialColor = MeshDebugPluginMaterial.MaterialColors[MeshDebugPluginMaterial._PluginCount++ % MeshDebugPluginMaterial.MaterialColors.length];
  248. this.isEnabled = true;
  249. }
  250. /**
  251. * Get the class name
  252. * @returns Class name
  253. */
  254. getClassName() {
  255. return "MeshDebugPluginMaterial";
  256. }
  257. /**
  258. * Gets whether the mesh debug plugin is enabled in the material.
  259. */
  260. get isEnabled() {
  261. return this._isEnabled;
  262. }
  263. /**
  264. * Sets whether the mesh debug plugin is enabled in the material.
  265. * @param value enabled
  266. */
  267. set isEnabled(value) {
  268. if (this._isEnabled === value) {
  269. return;
  270. }
  271. if (!this._material.getScene().getEngine().isWebGPU && this._material.getScene().getEngine().version == 1) {
  272. Logger.Error("MeshDebugPluginMaterial is not supported on WebGL 1.0.");
  273. this._isEnabled = false;
  274. return;
  275. }
  276. this._isEnabled = value;
  277. this._markAllDefinesAsDirty();
  278. }
  279. /**
  280. * Prepare the defines
  281. * @param defines Mesh debug defines
  282. * @param scene Scene
  283. * @param mesh Mesh associated with material
  284. */
  285. prepareDefines(defines, scene, mesh) {
  286. if ((this._mode == MeshDebugMode.VERTICES || this._mode == MeshDebugMode.TRIANGLES || this._mode == MeshDebugMode.TRIANGLES_VERTICES) &&
  287. !mesh.isVerticesDataPresent("dbg_initialPass")) {
  288. Logger.Warn("For best results with TRIANGLES, TRIANGLES_VERTICES, or VERTICES modes, please use MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() on mesh.", 1);
  289. }
  290. defines.DBG_MODE = this._mode;
  291. defines.DBG_MULTIPLY = this._multiply;
  292. defines.DBG_ENABLED = this._isEnabled;
  293. }
  294. /**
  295. * Get the shader attributes
  296. * @param attributes Array of attributes
  297. */
  298. getAttributes(attributes) {
  299. attributes.push("dbg_initialPass");
  300. }
  301. /**
  302. * Get the shader uniforms
  303. * @returns Uniforms
  304. */
  305. getUniforms() {
  306. return {
  307. ubo: [
  308. { name: "dbg_shadedDiffuseColor", size: 3, type: "vec3" },
  309. { name: "dbg_shadedSpecularColorPower", size: 4, type: "vec4" },
  310. { name: "dbg_thicknessRadiusScale", size: 3, type: "vec3" },
  311. { name: "dbg_wireframeTrianglesColor", size: 3, type: "vec3" },
  312. { name: "dbg_wireframeVerticesColor", size: 3, type: "vec3" },
  313. { name: "dbg_vertexColor", size: 3, type: "vec3" },
  314. { name: "dbg_uvPrimaryColor", size: 3, type: "vec3" },
  315. { name: "dbg_uvSecondaryColor", size: 3, type: "vec3" },
  316. { name: "dbg_materialColor", size: 3, type: "vec3" },
  317. ],
  318. fragment: fragmentUniforms,
  319. };
  320. }
  321. /**
  322. * Bind the uniform buffer
  323. * @param uniformBuffer Uniform buffer
  324. */
  325. bindForSubMesh(uniformBuffer) {
  326. if (!this._isEnabled) {
  327. return;
  328. }
  329. uniformBuffer.updateFloat3("dbg_shadedDiffuseColor", this.shadedDiffuseColor.r, this.shadedDiffuseColor.g, this.shadedDiffuseColor.b);
  330. uniformBuffer.updateFloat4("dbg_shadedSpecularColorPower", this.shadedSpecularColor.r, this.shadedSpecularColor.g, this.shadedSpecularColor.b, this.shadedSpecularPower);
  331. uniformBuffer.updateFloat3("dbg_thicknessRadiusScale", this.wireframeThickness, this.vertexRadius, this.uvScale);
  332. uniformBuffer.updateColor3("dbg_wireframeTrianglesColor", this.wireframeTrianglesColor);
  333. uniformBuffer.updateColor3("dbg_wireframeVerticesColor", this.wireframeVerticesColor);
  334. uniformBuffer.updateColor3("dbg_vertexColor", this.vertexColor);
  335. uniformBuffer.updateColor3("dbg_uvPrimaryColor", this.uvPrimaryColor);
  336. uniformBuffer.updateColor3("dbg_uvSecondaryColor", this.uvSecondaryColor);
  337. uniformBuffer.updateColor3("dbg_materialColor", this._materialColor);
  338. }
  339. /**
  340. * Get shader code
  341. * @param shaderType "vertex" or "fragment"
  342. * @returns Shader code
  343. */
  344. getCustomCode(shaderType) {
  345. return shaderType === "vertex"
  346. ? {
  347. CUSTOM_VERTEX_DEFINITIONS: vertexDefinitions,
  348. CUSTOM_VERTEX_MAIN_END: vertexMainEnd,
  349. }
  350. : {
  351. CUSTOM_FRAGMENT_DEFINITIONS: fragmentDefinitions,
  352. CUSTOM_FRAGMENT_MAIN_END: fragmentMainEnd,
  353. };
  354. }
  355. /**
  356. * Resets static variables of the plugin to their original state
  357. */
  358. static Reset() {
  359. this._PluginCount = 0;
  360. this.MaterialColors = defaultMaterialColors;
  361. }
  362. /**
  363. * Renders triangles in a mesh 3 times by tripling the indices in the index buffer.
  364. * Used to prepare a mesh to be rendered in `TRIANGLES`, `VERTICES`, or `TRIANGLES_VERTICES` modes.
  365. * NOTE: This is a destructive operation. The mesh's index buffer and vertex buffers are modified, and a new vertex buffer is allocated.
  366. * If you'd like the ability to revert these changes, toggle the optional `returnRollback` flag.
  367. * @param mesh the mesh to target
  368. * @param returnRollback whether or not to return a function that reverts mesh to its initial state. Default: false.
  369. * @returns a rollback function if `returnRollback` is true, otherwise an empty function.
  370. */
  371. static PrepareMeshForTrianglesAndVerticesMode(mesh, returnRollback = false) {
  372. let rollback = () => { };
  373. if (mesh.getTotalIndices() == 0)
  374. return rollback;
  375. if (returnRollback) {
  376. const kinds = mesh.getVerticesDataKinds();
  377. const indices = mesh.getIndices();
  378. const data = {};
  379. for (const kind of kinds) {
  380. data[kind] = mesh.getVerticesData(kind);
  381. }
  382. rollback = function () {
  383. mesh.setIndices(indices);
  384. for (const kind of kinds) {
  385. const stride = mesh.getVertexBuffer(kind).getStrideSize();
  386. mesh.setVerticesData(kind, data[kind], undefined, stride);
  387. }
  388. mesh.removeVerticesData("dbg_initialPass");
  389. };
  390. }
  391. let indices = Array.from(mesh.getIndices());
  392. const newIndices1 = [];
  393. for (let i = 0; i < indices.length; i += 3) {
  394. newIndices1.push(indices[i + 1], indices[i + 2], indices[i + 0]);
  395. }
  396. mesh.setIndices(indices.concat(newIndices1));
  397. mesh.convertToUnIndexedMesh();
  398. mesh.isUnIndexed = false;
  399. indices = Array.from(mesh.getIndices());
  400. const newIndices2 = [];
  401. for (let i = indices.length / 2; i < indices.length; i += 3) {
  402. newIndices2.push(indices[i + 1], indices[i + 2], indices[i + 0]);
  403. }
  404. mesh.setIndices(indices.concat(newIndices2));
  405. const num = mesh.getTotalVertices();
  406. const mid = num / 2;
  407. const pass = new Array(num).fill(1, 0, mid).fill(0, mid, num);
  408. mesh.setVerticesData("dbg_initialPass", pass, false, 1);
  409. return rollback;
  410. }
  411. }
  412. /**
  413. * Total number of instances of the plugin.
  414. * Starts at 0.
  415. */
  416. MeshDebugPluginMaterial._PluginCount = 0;
  417. /**
  418. * Color palette used for MATERIALIDS mode.
  419. * Defaults to `defaultMaterialColors`
  420. */
  421. MeshDebugPluginMaterial.MaterialColors = defaultMaterialColors;
  422. __decorate([
  423. serializeAsColor3()
  424. ], MeshDebugPluginMaterial.prototype, "_materialColor", void 0);
  425. __decorate([
  426. serialize()
  427. ], MeshDebugPluginMaterial.prototype, "_isEnabled", void 0);
  428. __decorate([
  429. serialize(),
  430. expandToProperty("_markAllDefinesAsDirty")
  431. ], MeshDebugPluginMaterial.prototype, "mode", void 0);
  432. __decorate([
  433. serialize(),
  434. expandToProperty("_markAllDefinesAsDirty")
  435. ], MeshDebugPluginMaterial.prototype, "multiply", void 0);
  436. __decorate([
  437. serializeAsColor3()
  438. ], MeshDebugPluginMaterial.prototype, "shadedDiffuseColor", void 0);
  439. __decorate([
  440. serializeAsColor3()
  441. ], MeshDebugPluginMaterial.prototype, "shadedSpecularColor", void 0);
  442. __decorate([
  443. serialize()
  444. ], MeshDebugPluginMaterial.prototype, "shadedSpecularPower", void 0);
  445. __decorate([
  446. serialize()
  447. ], MeshDebugPluginMaterial.prototype, "wireframeThickness", void 0);
  448. __decorate([
  449. serializeAsColor3()
  450. ], MeshDebugPluginMaterial.prototype, "wireframeTrianglesColor", void 0);
  451. __decorate([
  452. serializeAsColor3()
  453. ], MeshDebugPluginMaterial.prototype, "wireframeVerticesColor", void 0);
  454. __decorate([
  455. serializeAsColor3()
  456. ], MeshDebugPluginMaterial.prototype, "vertexColor", void 0);
  457. __decorate([
  458. serialize()
  459. ], MeshDebugPluginMaterial.prototype, "vertexRadius", void 0);
  460. __decorate([
  461. serialize()
  462. ], MeshDebugPluginMaterial.prototype, "uvScale", void 0);
  463. __decorate([
  464. serializeAsColor3()
  465. ], MeshDebugPluginMaterial.prototype, "uvPrimaryColor", void 0);
  466. __decorate([
  467. serializeAsColor3()
  468. ], MeshDebugPluginMaterial.prototype, "uvSecondaryColor", void 0);
  469. RegisterClass("BABYLON.MeshDebugPluginMaterial", MeshDebugPluginMaterial);
  470. //# sourceMappingURL=meshDebugPluginMaterial.js.map