Browse Source

Create copyTools.ts

aWeirdo 4 years ago
parent
commit
beb7afcf27
1 changed files with 82 additions and 0 deletions
  1. 82 0
      src/Misc/copyTools.ts

+ 82 - 0
src/Misc/copyTools.ts

@@ -0,0 +1,82 @@
+import { Nullable } from "../types";
+
+/**
+ * Class used to host copy specific utilities
+ */
+export class copyTools {
+    /**
+     * Reads the pixels stored in the webgl texture and returns them as a base64 string
+     * @param texture defines the texture to read pixels from
+     * @param faceIndex defines the face of the texture to read (in case of cube texture)
+     * @param level defines the LOD level of the texture to read (in case of Mip Maps)
+     * @returns The base64 encoded string or null
+     */
+    public static GenerateBase64StringFromTexture(texture: Any, faceIndex = 0, level = 0): Nullable<string> {
+        if (!texture) {
+            return null;
+        }
+        var internalTexture = texture.getInternalTexture();
+        if (!internalTexture || internalTexture.isCube) {
+            return null;
+        }
+
+        var pixels = texture.readPixels(faceIndex, level);
+        if (!pixels) {
+            return null;
+        }
+
+        var size = texture.getSize();
+        var width = size.width;
+        var height = size.height;
+
+        if (pixels instanceof Float32Array) {
+            var len = pixels.byteLength / pixels.BYTES_PER_ELEMENT;
+            var npixels = new Uint8Array(len);
+
+            while (--len >= 0) {
+                var val = pixels[len];
+                if (val < 0) {
+                    val = 0;
+                } else if (val > 1) {
+                    val = 1;
+                }
+                npixels[len] = val * 255;
+            }
+
+            pixels = npixels;
+        }
+
+        var canvas = document.createElement('canvas');
+        canvas.width = width;
+        canvas.height = height;
+
+        var ctx = canvas.getContext('2d');
+        if (!ctx) {
+            return null;
+        }
+
+        var imageData = ctx.createImageData(width, height);
+        var castData = <any>imageData.data;
+        castData.set(pixels);
+        ctx.putImageData(imageData, 0, 0);
+
+        if (internalTexture.invertY) {
+            var canvas2 = document.createElement('canvas');
+            canvas2.width = width;
+            canvas2.height = height;
+
+            var ctx2 = canvas2.getContext('2d');
+            if (!ctx2) {
+                return null;
+            }
+
+            ctx2.translate(0, height);
+            ctx2.scale(1, -1);
+            ctx2.drawImage(canvas, 0, 0);
+
+            return canvas2.toDataURL('image/png');
+        }
+
+        return canvas.toDataURL('image/png');
+    }
+}