Spaces:
Runtime error
Runtime error
/** | |
* Copyright (c) Meta Platforms, Inc. and affiliates. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import {Tracklet} from '@/common/tracker/Tracker'; | |
/** | |
* util funtion to generate a WebGL texture using a look up table. | |
* @param {WebGL2RenderingContext} gl - The WebGL2 rendering context. | |
* @param {number} lutSize - The size of the LUT in each dimension. | |
* @param {Uint8Array} lutData - The LUT data as an array of unsigned 8-bit integers. | |
* @returns {WebGLTexture} - The WebGL texture object representing the loaded LUT. | |
*/ | |
export function load3DLUT( | |
gl: WebGL2RenderingContext, | |
lutSize: number, | |
lutData: Uint8Array, | |
) { | |
const texture = gl.createTexture(); | |
gl.bindTexture(gl.TEXTURE_3D, texture); | |
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); | |
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); | |
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); | |
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); | |
gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE); | |
// Pixel storage modes must be set to default for 3D textures | |
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); | |
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); | |
gl.texImage3D( | |
gl.TEXTURE_3D, | |
0, | |
gl.RGBA, | |
lutSize, | |
lutSize, | |
lutSize, | |
0, | |
gl.RGBA, | |
gl.UNSIGNED_BYTE, | |
lutData, | |
); | |
gl.bindTexture(gl.TEXTURE_3D, null); | |
return texture; | |
} | |
/** | |
* Generates a 3D lookup table (LUT) data with random RGBA values. | |
* @param {number} lutSize - The size of the LUT in each dimension. | |
* @returns {Uint8Array} - The LUT data as an array of unsigned 8-bit integers. | |
*/ | |
export function generateLUTDATA(lutSize: number) { | |
const totalEntries = lutSize * lutSize * lutSize; // 3D LUT nodes | |
const lutData = new Uint8Array(totalEntries * 4); // Each entry has an RGBA value | |
for (let i = 0; i < totalEntries; i++) { | |
lutData[i * 4 + 0] = Math.floor(Math.random() * 256); // Random red value | |
lutData[i * 4 + 1] = Math.floor(Math.random() * 256); // Random green value | |
lutData[i * 4 + 2] = Math.floor(Math.random() * 256); // Random blue value | |
lutData[i * 4 + 3] = 1; // alpha value | |
} | |
return lutData; | |
} | |
/** | |
* Normalizes the bounds of a rectangle defined by two points (A and B) within a given width and height. | |
* @param {number[]} pointA - The coordinates of the first point defining the rectangle. | |
* @param {number[]} pointB - The coordinates of the second point defining the rectangle. | |
* @param {number} width - The width of the canvas or container where the rectangle is drawn. | |
* @param {number} height - The height of the canvas or container where the rectangle is drawn. | |
* @returns {number[]} - An array containing the normalized x and y coordinates of the rectangle's corners. | |
*/ | |
export function normalizeBounds( | |
pointA: number[], | |
pointB: number[], | |
width: number, | |
height: number, | |
) { | |
return [ | |
pointA[0] / width, | |
pointA[1] / height, | |
pointB[0] / width, | |
pointB[1] / height, | |
]; | |
} | |
/** | |
* Pre-allocates a specified number of 2D textures for use in WebGL2 rendering. | |
* @param {WebGL2RenderingContext} gl - The WebGL2 rendering context. | |
* @param {number} numTextures - The number of textures to be pre-allocated. | |
* @returns {WebGLTexture[]} - An array of WebGL textures, each pre-allocated and ready for use. | |
*/ | |
export function preAllocateTextures( | |
gl: WebGL2RenderingContext, | |
numTextures: number, | |
) { | |
const maskTextures = []; | |
for (let i = 0; i < numTextures; i++) { | |
const maskTexture = gl.createTexture(); | |
gl.bindTexture(gl.TEXTURE_2D, maskTexture); | |
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); | |
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); | |
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); | |
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); | |
maskTextures.push(maskTexture); | |
} | |
return maskTextures as WebGLTexture[]; | |
} | |
/** | |
* Finds the index of a Tracklet object within an array based on its unique identifier. | |
* @param objects - The array of Tracklet objects to search within. | |
* @param id - The unique identifier of the Tracklet object to find. | |
* @returns The index of the `Tracklet` object with the specified `id` in the `objects` array. | |
*/ | |
export function findIndexByTrackletId(id: number, objects: Tracklet[]): number { | |
return objects.findIndex(obj => obj.id === id); | |
} | |