Spaces:
Paused
Paused
| /** | |
| * 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); | |
| } | |