UNPKG

pixi-stats

Version:

WebGL stats for pixi.js or/and three.js

75 lines (57 loc) 2.06 kB
/* eslint-disable @typescript-eslint/no-explicit-any */ export default class TextureHook { public createdTextures: Array<any> = new Array<any>(); public maxTexturesCount: number = 0; public isInit: boolean = false; private realGLCreateTexture: (...args: any[]) => void = function () {}; private realGLDeleteTexture: (...args: any[]) => void = function () {}; private gl: any; constructor(_gl?: any) { if (!_gl) { console.warn("[TextureHook] GL can't be NULL"); } else if (_gl.__proto__.createTexture) { this.gl = _gl; this.realGLCreateTexture = this.gl.__proto__.createTexture; this.realGLDeleteTexture = this.gl.__proto__.deleteTexture; // replace with new function this.gl.__proto__.createTexture = this.fakeGLCreateTexture.bind(this); this.gl.__proto__.deleteTexture = this.fakeGLDeleteTexture.bind(this); this.isInit = true; console.info('[TextureHook] GL was Hooked!'); } } public get currentTextureCount(): number { return this.createdTextures.length; } public registerTexture(texture: any): void { this.createdTextures.push(texture); // ++; this.maxTexturesCount = Math.max( this.createdTextures.length, this.maxTexturesCount ); } private fakeGLCreateTexture(): any { const texture = this.realGLCreateTexture.call(this.gl); this.registerTexture(texture); return texture; } private fakeGLDeleteTexture(texture: any): void { const index: number = this.createdTextures.indexOf(texture); if (index > -1) { this.createdTextures.splice(index, 1); } this.realGLDeleteTexture.call(this.gl, texture); } public reset(): void { this.createdTextures = new Array<any>(); this.maxTexturesCount = 0; } public release(): void { if (this.isInit) { this.gl.__proto__.createTexture = this.realGLCreateTexture; this.gl.__proto__.deleteTexture = this.realGLDeleteTexture; console.info('[TextureHook] Hook was removed!'); } this.isInit = false; } }