engine.readTexture.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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 (!this._dummyFramebuffer) {
  13. let dummy = gl.createFramebuffer();
  14. if (!dummy) {
  15. throw new Error("Unable to create dummy framebuffer");
  16. }
  17. this._dummyFramebuffer = dummy;
  18. }
  19. gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);
  20. if (faceIndex > -1) {
  21. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._webGLTexture, level);
  22. } else {
  23. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._webGLTexture, level);
  24. }
  25. let readType = (texture.type !== undefined) ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;
  26. switch (readType) {
  27. case gl.UNSIGNED_BYTE:
  28. if (!buffer) {
  29. buffer = new Uint8Array(4 * width * height);
  30. }
  31. readType = gl.UNSIGNED_BYTE;
  32. break;
  33. default:
  34. if (!buffer) {
  35. buffer = new Float32Array(4 * width * height);
  36. }
  37. readType = gl.FLOAT;
  38. break;
  39. }
  40. gl.readPixels(0, 0, width, height, gl.RGBA, readType, <DataView>buffer);
  41. gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);
  42. return buffer;
  43. };