@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
68 lines • 5.04 kB
JavaScript
import { isNumber } from "./../types/guards.js";
/**
* drawElements() can be used with 8, 16 or 32 unsinged ints arrays.
* But the function does not know what type was passed as argument.
* You need to specify the type: UNSIGNED_BYTE, UNSIGNED_SHORT or
* UNSIGNED_INT.
*
* This helper function gives you the type of the array passed as argument.
*/
export function webglElementTypeFromTypedArray(typedArray) {
if (typedArray instanceof Uint8Array)
return WebGL2RenderingContext.UNSIGNED_BYTE;
if (typedArray instanceof Uint16Array)
return WebGL2RenderingContext.UNSIGNED_SHORT;
if (typedArray instanceof Uint32Array)
return WebGL2RenderingContext.UNSIGNED_INT;
throw new Error("[webglElementTypeFromDataView] drawElements() and drawElementsInstanced() can only be fed with Uint8Array, Uint16Array or Uint32Array!");
}
/**
* @returns A type array that uses the less possible space in memory.
*
* For instance, if `arr` has no value above 255, we can return `Uint8Array`
* because a byte will suffice to store each value.
*/
export function webglElementTypeArrayFromNumberArray(arr) {
let max = 0;
for (const val of arr)
max = Math.max(max, val);
if (max <= 0xff)
return new Uint8Array(arr);
if (max <= 0xffff)
return new Uint16Array(arr);
return new Uint32Array(arr);
}
export function webglTypedArrayFromBufferSource(bufferSource, type) {
const buffer = bufferSource instanceof ArrayBuffer ? bufferSource : bufferSource.buffer;
switch (type) {
case 5120: // BYTE
return new Int8Array(buffer);
case 5121: // UNSIGNED_BYTE
return new Uint8Array(buffer);
case 5122: // SHORT
return new Int16Array(buffer);
case 5123: // UNSIGNED_SHORT
return new Uint16Array(buffer);
case 5125: // UNSIGNED_INT
return new Uint32Array(buffer);
case 5126: // FLOAT
return new Float32Array(buffer);
default:
throw new Error(`Don't know how to create a TypedArray for type "${webglLookup(type)}"!`);
}
}
export function webglLookup(type) {
if (!isNumber(type))
return type;
if (gl) {
for (const key in gl) {
const value = gl[key];
if (value === type)
return key;
}
}
return `${type}`;
}
const canvas = globalThis.document.createElement("canvas");
const gl = canvas.getContext("webgl2");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZ2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd2ViZ2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRTVDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsOEJBQThCLENBQUMsVUFBbUM7SUFDOUUsSUFBSSxVQUFVLFlBQVksVUFBVTtRQUFFLE9BQU8sc0JBQXNCLENBQUMsYUFBYSxDQUFBO0lBQ2pGLElBQUksVUFBVSxZQUFZLFdBQVc7UUFBRSxPQUFPLHNCQUFzQixDQUFDLGNBQWMsQ0FBQTtJQUNuRixJQUFJLFVBQVUsWUFBWSxXQUFXO1FBQUUsT0FBTyxzQkFBc0IsQ0FBQyxZQUFZLENBQUE7SUFFakYsTUFBTSxJQUFJLEtBQUssQ0FDWCx3SUFBd0ksQ0FDM0ksQ0FBQTtBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FBQyxHQUFhO0lBQzlELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUNYLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRztRQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUMvQyxJQUFJLEdBQUcsSUFBSSxJQUFJO1FBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMzQyxJQUFJLEdBQUcsSUFBSSxNQUFNO1FBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM5QyxPQUFPLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQy9CLENBQUM7QUFFRCxNQUFNLFVBQVUsK0JBQStCLENBQUMsWUFBMEIsRUFBRSxJQUFZO0lBQ3BGLE1BQU0sTUFBTSxHQUFHLFlBQVksWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQTtJQUN2RixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ1gsS0FBSyxJQUFJLEVBQUUsT0FBTztZQUNkLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDaEMsS0FBSyxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3ZCLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakMsS0FBSyxJQUFJLEVBQUUsUUFBUTtZQUNmLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakMsS0FBSyxJQUFJLEVBQUUsaUJBQWlCO1lBQ3hCLE9BQU8sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEMsS0FBSyxJQUFJLEVBQUUsZUFBZTtZQUN0QixPQUFPLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLEtBQUssSUFBSSxFQUFFLFFBQVE7WUFDZixPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ25DO1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqRyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBMkM7SUFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQW9DLENBQUE7SUFFaEUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUNMLEtBQUssTUFBTSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQW1DLENBQUMsQ0FBQTtZQUNyRCxJQUFJLEtBQUssS0FBSyxJQUFJO2dCQUFFLE9BQU8sR0FBbUMsQ0FBQTtRQUNsRSxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEVBQWtDLENBQUE7QUFDcEQsQ0FBQztBQUVELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQzFELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUEifQ==