mesh.mjs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. /*!
  2. * @pixi/mesh - v6.5.10
  3. * Compiled Thu, 06 Jul 2023 15:25:11 UTC
  4. *
  5. * @pixi/mesh is licensed under the MIT License.
  6. * http://www.opensource.org/licenses/mit-license
  7. */
  8. import { State, Program, TextureMatrix, Shader, Buffer, Geometry } from '@pixi/core';
  9. import { Point, Polygon, Matrix } from '@pixi/math';
  10. import { DRAW_MODES, TYPES } from '@pixi/constants';
  11. import { Container } from '@pixi/display';
  12. import { settings } from '@pixi/settings';
  13. import { premultiplyTintToRgba } from '@pixi/utils';
  14. /*! *****************************************************************************
  15. Copyright (c) Microsoft Corporation.
  16. Permission to use, copy, modify, and/or distribute this software for any
  17. purpose with or without fee is hereby granted.
  18. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  19. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  20. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  21. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  22. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  23. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  24. PERFORMANCE OF THIS SOFTWARE.
  25. ***************************************************************************** */
  26. /* global Reflect, Promise */
  27. var extendStatics = function(d, b) {
  28. extendStatics = Object.setPrototypeOf ||
  29. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  30. function (d, b) { for (var p in b) { if (b.hasOwnProperty(p)) { d[p] = b[p]; } } };
  31. return extendStatics(d, b);
  32. };
  33. function __extends(d, b) {
  34. extendStatics(d, b);
  35. function __() { this.constructor = d; }
  36. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  37. }
  38. /**
  39. * Class controls cache for UV mapping from Texture normal space to BaseTexture normal space.
  40. * @memberof PIXI
  41. */
  42. var MeshBatchUvs = /** @class */ (function () {
  43. /**
  44. * @param uvBuffer - Buffer with normalized uv's
  45. * @param uvMatrix - Material UV matrix
  46. */
  47. function MeshBatchUvs(uvBuffer, uvMatrix) {
  48. this.uvBuffer = uvBuffer;
  49. this.uvMatrix = uvMatrix;
  50. this.data = null;
  51. this._bufferUpdateId = -1;
  52. this._textureUpdateId = -1;
  53. this._updateID = 0;
  54. }
  55. /**
  56. * Updates
  57. * @param forceUpdate - force the update
  58. */
  59. MeshBatchUvs.prototype.update = function (forceUpdate) {
  60. if (!forceUpdate
  61. && this._bufferUpdateId === this.uvBuffer._updateID
  62. && this._textureUpdateId === this.uvMatrix._updateID) {
  63. return;
  64. }
  65. this._bufferUpdateId = this.uvBuffer._updateID;
  66. this._textureUpdateId = this.uvMatrix._updateID;
  67. var data = this.uvBuffer.data;
  68. if (!this.data || this.data.length !== data.length) {
  69. this.data = new Float32Array(data.length);
  70. }
  71. this.uvMatrix.multiplyUvs(data, this.data);
  72. this._updateID++;
  73. };
  74. return MeshBatchUvs;
  75. }());
  76. var tempPoint = new Point();
  77. var tempPolygon = new Polygon();
  78. /**
  79. * Base mesh class.
  80. *
  81. * This class empowers you to have maximum flexibility to render any kind of WebGL visuals you can think of.
  82. * This class assumes a certain level of WebGL knowledge.
  83. * If you know a bit this should abstract enough away to make your life easier!
  84. *
  85. * Pretty much ALL WebGL can be broken down into the following:
  86. * - Geometry - The structure and data for the mesh. This can include anything from positions, uvs, normals, colors etc..
  87. * - Shader - This is the shader that PixiJS will render the geometry with (attributes in the shader must match the geometry)
  88. * - State - This is the state of WebGL required to render the mesh.
  89. *
  90. * Through a combination of the above elements you can render anything you want, 2D or 3D!
  91. * @memberof PIXI
  92. */
  93. var Mesh = /** @class */ (function (_super) {
  94. __extends(Mesh, _super);
  95. /**
  96. * @param geometry - The geometry the mesh will use.
  97. * @param {PIXI.MeshMaterial} shader - The shader the mesh will use.
  98. * @param state - The state that the WebGL context is required to be in to render the mesh
  99. * if no state is provided, uses {@link PIXI.State.for2d} to create a 2D state for PixiJS.
  100. * @param drawMode - The drawMode, can be any of the {@link PIXI.DRAW_MODES} constants.
  101. */
  102. function Mesh(geometry, shader, state, drawMode) {
  103. if (drawMode === void 0) { drawMode = DRAW_MODES.TRIANGLES; }
  104. var _this = _super.call(this) || this;
  105. _this.geometry = geometry;
  106. _this.shader = shader;
  107. _this.state = state || State.for2d();
  108. _this.drawMode = drawMode;
  109. _this.start = 0;
  110. _this.size = 0;
  111. _this.uvs = null;
  112. _this.indices = null;
  113. _this.vertexData = new Float32Array(1);
  114. _this.vertexDirty = -1;
  115. _this._transformID = -1;
  116. _this._roundPixels = settings.ROUND_PIXELS;
  117. _this.batchUvs = null;
  118. return _this;
  119. }
  120. Object.defineProperty(Mesh.prototype, "geometry", {
  121. /**
  122. * Includes vertex positions, face indices, normals, colors, UVs, and
  123. * custom attributes within buffers, reducing the cost of passing all
  124. * this data to the GPU. Can be shared between multiple Mesh objects.
  125. */
  126. get: function () {
  127. return this._geometry;
  128. },
  129. set: function (value) {
  130. if (this._geometry === value) {
  131. return;
  132. }
  133. if (this._geometry) {
  134. this._geometry.refCount--;
  135. if (this._geometry.refCount === 0) {
  136. this._geometry.dispose();
  137. }
  138. }
  139. this._geometry = value;
  140. if (this._geometry) {
  141. this._geometry.refCount++;
  142. }
  143. this.vertexDirty = -1;
  144. },
  145. enumerable: false,
  146. configurable: true
  147. });
  148. Object.defineProperty(Mesh.prototype, "uvBuffer", {
  149. /**
  150. * To change mesh uv's, change its uvBuffer data and increment its _updateID.
  151. * @readonly
  152. */
  153. get: function () {
  154. return this.geometry.buffers[1];
  155. },
  156. enumerable: false,
  157. configurable: true
  158. });
  159. Object.defineProperty(Mesh.prototype, "verticesBuffer", {
  160. /**
  161. * To change mesh vertices, change its uvBuffer data and increment its _updateID.
  162. * Incrementing _updateID is optional because most of Mesh objects do it anyway.
  163. * @readonly
  164. */
  165. get: function () {
  166. return this.geometry.buffers[0];
  167. },
  168. enumerable: false,
  169. configurable: true
  170. });
  171. Object.defineProperty(Mesh.prototype, "material", {
  172. get: function () {
  173. return this.shader;
  174. },
  175. /** Alias for {@link PIXI.Mesh#shader}. */
  176. set: function (value) {
  177. this.shader = value;
  178. },
  179. enumerable: false,
  180. configurable: true
  181. });
  182. Object.defineProperty(Mesh.prototype, "blendMode", {
  183. get: function () {
  184. return this.state.blendMode;
  185. },
  186. /**
  187. * The blend mode to be applied to the Mesh. Apply a value of
  188. * `PIXI.BLEND_MODES.NORMAL` to reset the blend mode.
  189. * @default PIXI.BLEND_MODES.NORMAL;
  190. */
  191. set: function (value) {
  192. this.state.blendMode = value;
  193. },
  194. enumerable: false,
  195. configurable: true
  196. });
  197. Object.defineProperty(Mesh.prototype, "roundPixels", {
  198. get: function () {
  199. return this._roundPixels;
  200. },
  201. /**
  202. * If true PixiJS will Math.floor() x/y values when rendering, stopping pixel interpolation.
  203. * Advantages can include sharper image quality (like text) and faster rendering on canvas.
  204. * The main disadvantage is movement of objects may appear less smooth.
  205. * To set the global default, change {@link PIXI.settings.ROUND_PIXELS}
  206. * @default false
  207. */
  208. set: function (value) {
  209. if (this._roundPixels !== value) {
  210. this._transformID = -1;
  211. }
  212. this._roundPixels = value;
  213. },
  214. enumerable: false,
  215. configurable: true
  216. });
  217. Object.defineProperty(Mesh.prototype, "tint", {
  218. /**
  219. * The multiply tint applied to the Mesh. This is a hex value. A value of
  220. * `0xFFFFFF` will remove any tint effect.
  221. *
  222. * Null for non-MeshMaterial shaders
  223. * @default 0xFFFFFF
  224. */
  225. get: function () {
  226. return 'tint' in this.shader ? this.shader.tint : null;
  227. },
  228. set: function (value) {
  229. this.shader.tint = value;
  230. },
  231. enumerable: false,
  232. configurable: true
  233. });
  234. Object.defineProperty(Mesh.prototype, "texture", {
  235. /** The texture that the Mesh uses. Null for non-MeshMaterial shaders */
  236. get: function () {
  237. return 'texture' in this.shader ? this.shader.texture : null;
  238. },
  239. set: function (value) {
  240. this.shader.texture = value;
  241. },
  242. enumerable: false,
  243. configurable: true
  244. });
  245. /**
  246. * Standard renderer draw.
  247. * @param renderer - Instance to renderer.
  248. */
  249. Mesh.prototype._render = function (renderer) {
  250. // set properties for batching..
  251. // TODO could use a different way to grab verts?
  252. var vertices = this.geometry.buffers[0].data;
  253. var shader = this.shader;
  254. // TODO benchmark check for attribute size..
  255. if (shader.batchable
  256. && this.drawMode === DRAW_MODES.TRIANGLES
  257. && vertices.length < Mesh.BATCHABLE_SIZE * 2) {
  258. this._renderToBatch(renderer);
  259. }
  260. else {
  261. this._renderDefault(renderer);
  262. }
  263. };
  264. /**
  265. * Standard non-batching way of rendering.
  266. * @param renderer - Instance to renderer.
  267. */
  268. Mesh.prototype._renderDefault = function (renderer) {
  269. var shader = this.shader;
  270. shader.alpha = this.worldAlpha;
  271. if (shader.update) {
  272. shader.update();
  273. }
  274. renderer.batch.flush();
  275. // bind and sync uniforms..
  276. shader.uniforms.translationMatrix = this.transform.worldTransform.toArray(true);
  277. renderer.shader.bind(shader);
  278. // set state..
  279. renderer.state.set(this.state);
  280. // bind the geometry...
  281. renderer.geometry.bind(this.geometry, shader);
  282. // then render it
  283. renderer.geometry.draw(this.drawMode, this.size, this.start, this.geometry.instanceCount);
  284. };
  285. /**
  286. * Rendering by using the Batch system.
  287. * @param renderer - Instance to renderer.
  288. */
  289. Mesh.prototype._renderToBatch = function (renderer) {
  290. var geometry = this.geometry;
  291. var shader = this.shader;
  292. if (shader.uvMatrix) {
  293. shader.uvMatrix.update();
  294. this.calculateUvs();
  295. }
  296. // set properties for batching..
  297. this.calculateVertices();
  298. this.indices = geometry.indexBuffer.data;
  299. this._tintRGB = shader._tintRGB;
  300. this._texture = shader.texture;
  301. var pluginName = this.material.pluginName;
  302. renderer.batch.setObjectRenderer(renderer.plugins[pluginName]);
  303. renderer.plugins[pluginName].render(this);
  304. };
  305. /** Updates vertexData field based on transform and vertices. */
  306. Mesh.prototype.calculateVertices = function () {
  307. var geometry = this.geometry;
  308. var verticesBuffer = geometry.buffers[0];
  309. var vertices = verticesBuffer.data;
  310. var vertexDirtyId = verticesBuffer._updateID;
  311. if (vertexDirtyId === this.vertexDirty && this._transformID === this.transform._worldID) {
  312. return;
  313. }
  314. this._transformID = this.transform._worldID;
  315. if (this.vertexData.length !== vertices.length) {
  316. this.vertexData = new Float32Array(vertices.length);
  317. }
  318. var wt = this.transform.worldTransform;
  319. var a = wt.a;
  320. var b = wt.b;
  321. var c = wt.c;
  322. var d = wt.d;
  323. var tx = wt.tx;
  324. var ty = wt.ty;
  325. var vertexData = this.vertexData;
  326. for (var i = 0; i < vertexData.length / 2; i++) {
  327. var x = vertices[(i * 2)];
  328. var y = vertices[(i * 2) + 1];
  329. vertexData[(i * 2)] = (a * x) + (c * y) + tx;
  330. vertexData[(i * 2) + 1] = (b * x) + (d * y) + ty;
  331. }
  332. if (this._roundPixels) {
  333. var resolution = settings.RESOLUTION;
  334. for (var i = 0; i < vertexData.length; ++i) {
  335. vertexData[i] = Math.round((vertexData[i] * resolution | 0) / resolution);
  336. }
  337. }
  338. this.vertexDirty = vertexDirtyId;
  339. };
  340. /** Updates uv field based on from geometry uv's or batchUvs. */
  341. Mesh.prototype.calculateUvs = function () {
  342. var geomUvs = this.geometry.buffers[1];
  343. var shader = this.shader;
  344. if (!shader.uvMatrix.isSimple) {
  345. if (!this.batchUvs) {
  346. this.batchUvs = new MeshBatchUvs(geomUvs, shader.uvMatrix);
  347. }
  348. this.batchUvs.update();
  349. this.uvs = this.batchUvs.data;
  350. }
  351. else {
  352. this.uvs = geomUvs.data;
  353. }
  354. };
  355. /**
  356. * Updates the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account.
  357. * there must be a aVertexPosition attribute present in the geometry for bounds to be calculated correctly.
  358. */
  359. Mesh.prototype._calculateBounds = function () {
  360. this.calculateVertices();
  361. this._bounds.addVertexData(this.vertexData, 0, this.vertexData.length);
  362. };
  363. /**
  364. * Tests if a point is inside this mesh. Works only for PIXI.DRAW_MODES.TRIANGLES.
  365. * @param point - The point to test.
  366. * @returns - The result of the test.
  367. */
  368. Mesh.prototype.containsPoint = function (point) {
  369. if (!this.getBounds().contains(point.x, point.y)) {
  370. return false;
  371. }
  372. this.worldTransform.applyInverse(point, tempPoint);
  373. var vertices = this.geometry.getBuffer('aVertexPosition').data;
  374. var points = tempPolygon.points;
  375. var indices = this.geometry.getIndex().data;
  376. var len = indices.length;
  377. var step = this.drawMode === 4 ? 3 : 1;
  378. for (var i = 0; i + 2 < len; i += step) {
  379. var ind0 = indices[i] * 2;
  380. var ind1 = indices[i + 1] * 2;
  381. var ind2 = indices[i + 2] * 2;
  382. points[0] = vertices[ind0];
  383. points[1] = vertices[ind0 + 1];
  384. points[2] = vertices[ind1];
  385. points[3] = vertices[ind1 + 1];
  386. points[4] = vertices[ind2];
  387. points[5] = vertices[ind2 + 1];
  388. if (tempPolygon.contains(tempPoint.x, tempPoint.y)) {
  389. return true;
  390. }
  391. }
  392. return false;
  393. };
  394. Mesh.prototype.destroy = function (options) {
  395. _super.prototype.destroy.call(this, options);
  396. if (this._cachedTexture) {
  397. this._cachedTexture.destroy();
  398. this._cachedTexture = null;
  399. }
  400. this.geometry = null;
  401. this.shader = null;
  402. this.state = null;
  403. this.uvs = null;
  404. this.indices = null;
  405. this.vertexData = null;
  406. };
  407. /** The maximum number of vertices to consider batchable. Generally, the complexity of the geometry. */
  408. Mesh.BATCHABLE_SIZE = 100;
  409. return Mesh;
  410. }(Container));
  411. var fragment = "varying vec2 vTextureCoord;\nuniform vec4 uColor;\n\nuniform sampler2D uSampler;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uColor;\n}\n";
  412. var vertex = "attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTextureMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;\n}\n";
  413. /**
  414. * Slightly opinionated default shader for PixiJS 2D objects.
  415. * @memberof PIXI
  416. */
  417. var MeshMaterial = /** @class */ (function (_super) {
  418. __extends(MeshMaterial, _super);
  419. /**
  420. * @param uSampler - Texture that material uses to render.
  421. * @param options - Additional options
  422. * @param {number} [options.alpha=1] - Default alpha.
  423. * @param {number} [options.tint=0xFFFFFF] - Default tint.
  424. * @param {string} [options.pluginName='batch'] - Renderer plugin for batching.
  425. * @param {PIXI.Program} [options.program=0xFFFFFF] - Custom program.
  426. * @param {object} [options.uniforms] - Custom uniforms.
  427. */
  428. function MeshMaterial(uSampler, options) {
  429. var _this = this;
  430. var uniforms = {
  431. uSampler: uSampler,
  432. alpha: 1,
  433. uTextureMatrix: Matrix.IDENTITY,
  434. uColor: new Float32Array([1, 1, 1, 1]),
  435. };
  436. // Set defaults
  437. options = Object.assign({
  438. tint: 0xFFFFFF,
  439. alpha: 1,
  440. pluginName: 'batch',
  441. }, options);
  442. if (options.uniforms) {
  443. Object.assign(uniforms, options.uniforms);
  444. }
  445. _this = _super.call(this, options.program || Program.from(vertex, fragment), uniforms) || this;
  446. _this._colorDirty = false;
  447. _this.uvMatrix = new TextureMatrix(uSampler);
  448. _this.batchable = options.program === undefined;
  449. _this.pluginName = options.pluginName;
  450. _this.tint = options.tint;
  451. _this.alpha = options.alpha;
  452. return _this;
  453. }
  454. Object.defineProperty(MeshMaterial.prototype, "texture", {
  455. /** Reference to the texture being rendered. */
  456. get: function () {
  457. return this.uniforms.uSampler;
  458. },
  459. set: function (value) {
  460. if (this.uniforms.uSampler !== value) {
  461. if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode) {
  462. this._colorDirty = true;
  463. }
  464. this.uniforms.uSampler = value;
  465. this.uvMatrix.texture = value;
  466. }
  467. },
  468. enumerable: false,
  469. configurable: true
  470. });
  471. Object.defineProperty(MeshMaterial.prototype, "alpha", {
  472. get: function () {
  473. return this._alpha;
  474. },
  475. /**
  476. * This gets automatically set by the object using this.
  477. * @default 1
  478. */
  479. set: function (value) {
  480. if (value === this._alpha)
  481. { return; }
  482. this._alpha = value;
  483. this._colorDirty = true;
  484. },
  485. enumerable: false,
  486. configurable: true
  487. });
  488. Object.defineProperty(MeshMaterial.prototype, "tint", {
  489. get: function () {
  490. return this._tint;
  491. },
  492. /**
  493. * Multiply tint for the material.
  494. * @default 0xFFFFFF
  495. */
  496. set: function (value) {
  497. if (value === this._tint)
  498. { return; }
  499. this._tint = value;
  500. this._tintRGB = (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
  501. this._colorDirty = true;
  502. },
  503. enumerable: false,
  504. configurable: true
  505. });
  506. /** Gets called automatically by the Mesh. Intended to be overridden for custom {@link MeshMaterial} objects. */
  507. MeshMaterial.prototype.update = function () {
  508. if (this._colorDirty) {
  509. this._colorDirty = false;
  510. var baseTexture = this.texture.baseTexture;
  511. premultiplyTintToRgba(this._tint, this._alpha, this.uniforms.uColor, baseTexture.alphaMode);
  512. }
  513. if (this.uvMatrix.update()) {
  514. this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord;
  515. }
  516. };
  517. return MeshMaterial;
  518. }(Shader));
  519. /**
  520. * Standard 2D geometry used in PixiJS.
  521. *
  522. * Geometry can be defined without passing in a style or data if required.
  523. *
  524. * ```js
  525. * const geometry = new PIXI.Geometry();
  526. *
  527. * geometry.addAttribute('positions', [0, 0, 100, 0, 100, 100, 0, 100], 2);
  528. * geometry.addAttribute('uvs', [0,0,1,0,1,1,0,1], 2);
  529. * geometry.addIndex([0,1,2,1,3,2]);
  530. *
  531. * ```
  532. * @memberof PIXI
  533. */
  534. var MeshGeometry = /** @class */ (function (_super) {
  535. __extends(MeshGeometry, _super);
  536. /**
  537. * @param {Float32Array|number[]} [vertices] - Positional data on geometry.
  538. * @param {Float32Array|number[]} [uvs] - Texture UVs.
  539. * @param {Uint16Array|number[]} [index] - IndexBuffer
  540. */
  541. function MeshGeometry(vertices, uvs, index) {
  542. var _this = _super.call(this) || this;
  543. var verticesBuffer = new Buffer(vertices);
  544. var uvsBuffer = new Buffer(uvs, true);
  545. var indexBuffer = new Buffer(index, true, true);
  546. _this.addAttribute('aVertexPosition', verticesBuffer, 2, false, TYPES.FLOAT)
  547. .addAttribute('aTextureCoord', uvsBuffer, 2, false, TYPES.FLOAT)
  548. .addIndex(indexBuffer);
  549. _this._updateId = -1;
  550. return _this;
  551. }
  552. Object.defineProperty(MeshGeometry.prototype, "vertexDirtyId", {
  553. /**
  554. * If the vertex position is updated.
  555. * @readonly
  556. * @private
  557. */
  558. get: function () {
  559. return this.buffers[0]._updateID;
  560. },
  561. enumerable: false,
  562. configurable: true
  563. });
  564. return MeshGeometry;
  565. }(Geometry));
  566. export { Mesh, MeshBatchUvs, MeshGeometry, MeshMaterial };
  567. //# sourceMappingURL=mesh.mjs.map