mesh.js 21 KB

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