Source: mesh/webgl/MeshRenderer.js

mesh/webgl/MeshRenderer.js

  1. import * as core from '../../core';
  2. // 修改依赖库应对小程序环境
  3. import glCore from '../../dependencies/pixi-gl-core/';
  4. // import glCore from 'pixi-gl-core';
  5. import { default as Mesh } from '../Mesh';
  6. import { readFileSync } from 'fs';
  7. import { join } from 'path';
  8. const matrixIdentity = core.Matrix.IDENTITY;
  9. /**
  10. * WebGL renderer plugin for tiling sprites
  11. *
  12. * @class
  13. * @memberof PIXI
  14. * @extends PIXI.ObjectRenderer
  15. */
  16. export default class MeshRenderer extends core.ObjectRenderer
  17. {
  18. /**
  19. * constructor for renderer
  20. *
  21. * @param {WebGLRenderer} renderer The renderer this tiling awesomeness works for.
  22. */
  23. constructor(renderer)
  24. {
  25. super(renderer);
  26. this.shader = null;
  27. }
  28. /**
  29. * Sets up the renderer context and necessary buffers.
  30. *
  31. * @private
  32. */
  33. onContextChange()
  34. {
  35. const gl = this.renderer.gl;
  36. this.shader = new core.Shader(gl,
  37. readFileSync(join(__dirname, './mesh.vert'), 'utf8'),
  38. readFileSync(join(__dirname, './mesh.frag'), 'utf8'));
  39. }
  40. /**
  41. * renders mesh
  42. *
  43. * @param {PIXI.mesh.Mesh} mesh mesh instance
  44. */
  45. render(mesh)
  46. {
  47. const renderer = this.renderer;
  48. const gl = renderer.gl;
  49. const texture = mesh._texture;
  50. if (!texture.valid)
  51. {
  52. return;
  53. }
  54. let glData = mesh._glDatas[renderer.CONTEXT_UID];
  55. if (!glData)
  56. {
  57. renderer.bindVao(null);
  58. glData = {
  59. shader: this.shader,
  60. vertexBuffer: glCore.GLBuffer.createVertexBuffer(gl, mesh.vertices, gl.STREAM_DRAW),
  61. uvBuffer: glCore.GLBuffer.createVertexBuffer(gl, mesh.uvs, gl.STREAM_DRAW),
  62. indexBuffer: glCore.GLBuffer.createIndexBuffer(gl, mesh.indices, gl.STATIC_DRAW),
  63. // build the vao object that will render..
  64. vao: null,
  65. dirty: mesh.dirty,
  66. indexDirty: mesh.indexDirty,
  67. vertexDirty: mesh.vertexDirty,
  68. };
  69. // build the vao object that will render..
  70. glData.vao = new glCore.VertexArrayObject(gl)
  71. .addIndex(glData.indexBuffer)
  72. .addAttribute(glData.vertexBuffer, glData.shader.attributes.aVertexPosition, gl.FLOAT, false, 2 * 4, 0)
  73. .addAttribute(glData.uvBuffer, glData.shader.attributes.aTextureCoord, gl.FLOAT, false, 2 * 4, 0);
  74. mesh._glDatas[renderer.CONTEXT_UID] = glData;
  75. }
  76. renderer.bindVao(glData.vao);
  77. if (mesh.dirty !== glData.dirty)
  78. {
  79. glData.dirty = mesh.dirty;
  80. glData.uvBuffer.upload(mesh.uvs);
  81. }
  82. if (mesh.indexDirty !== glData.indexDirty)
  83. {
  84. glData.indexDirty = mesh.indexDirty;
  85. glData.indexBuffer.upload(mesh.indices);
  86. }
  87. if (mesh.vertexDirty !== glData.vertexDirty)
  88. {
  89. glData.vertexDirty = mesh.vertexDirty;
  90. glData.vertexBuffer.upload(mesh.vertices);
  91. }
  92. renderer.bindShader(glData.shader);
  93. glData.shader.uniforms.uSampler = renderer.bindTexture(texture);
  94. renderer.state.setBlendMode(core.utils.correctBlendMode(mesh.blendMode, texture.baseTexture.premultipliedAlpha));
  95. if (glData.shader.uniforms.uTransform)
  96. {
  97. if (mesh.uploadUvTransform)
  98. {
  99. glData.shader.uniforms.uTransform = mesh._uvTransform.mapCoord.toArray(true);
  100. }
  101. else
  102. {
  103. glData.shader.uniforms.uTransform = matrixIdentity.toArray(true);
  104. }
  105. }
  106. glData.shader.uniforms.translationMatrix = mesh.worldTransform.toArray(true);
  107. glData.shader.uniforms.uColor = core.utils.premultiplyRgba(mesh.tintRgb,
  108. mesh.worldAlpha, glData.shader.uniforms.uColor, texture.baseTexture.premultipliedAlpha);
  109. const drawMode = mesh.drawMode === Mesh.DRAW_MODES.TRIANGLE_MESH ? gl.TRIANGLE_STRIP : gl.TRIANGLES;
  110. glData.vao.draw(drawMode, mesh.indices.length, 0);
  111. }
  112. }
  113. core.WebGLRenderer.registerPlugin('mesh', MeshRenderer);