engine.readTexture.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { ThinEngine } from "../../Engines/thinEngine";
  2. import { InternalTexture } from '../../Materials/Textures/internalTexture';
  3. import { Nullable } from '../../types';
  4. declare module "../../Engines/thinEngine" {
  5. export interface ThinEngine {
  6. /** @hidden */
  7. _readTexturePixels(texture: InternalTexture, width: number, height: number, faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>): ArrayBufferView;
  8. }
  9. }
  10. ThinEngine.prototype._readTexturePixels = function(texture: InternalTexture, width: number, height: number, faceIndex = -1, level = 0, buffer: Nullable<ArrayBufferView> = null): ArrayBufferView {
  11. let gl = this._gl;
  12. if (!gl) {
  13. throw new Error ("Engine does not have gl rendering context.");
  14. }
  15. if (!this._dummyFramebuffer) {
  16. let dummy = gl.createFramebuffer();
  17. if (!dummy) {
  18. throw new Error("Unable to create dummy framebuffer");
  19. }
  20. this._dummyFramebuffer = dummy;
  21. }
  22. gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);
  23. if (faceIndex > -1) {
  24. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._webGLTexture, level);
  25. } else {
  26. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._webGLTexture, level);
  27. }
  28. let readType = (texture.type !== undefined) ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;
  29. switch (readType) {
  30. case gl.UNSIGNED_BYTE:
  31. if (!buffer) {
  32. buffer = new Uint8Array(4 * width * height);
  33. }
  34. readType = gl.UNSIGNED_BYTE;
  35. break;
  36. default:
  37. if (!buffer) {
  38. buffer = new Float32Array(4 * width * height);
  39. }
  40. readType = gl.FLOAT;
  41. break;
  42. }
  43. gl.readPixels(0, 0, width, height, gl.RGBA, readType, <DataView>buffer);
  44. gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);
  45. return buffer;
  46. };