Download demo/frontend/src/common/components/video/effects/GradientEffect.ts from YuqianFu/sam2: direct link, hf CLI and curl.
- Browser
- Download file 3.23 kB
-
https://huggingface.co/YuqianFu/sam2/resolve/main/demo/frontend/src/common/components/video/effects/GradientEffect.ts
- Command line
-
hf download hf://YuqianFu/sam2/demo/frontend/src/common/components/video/effects/GradientEffect.ts
-
curl -L -o GradientEffect.ts https://huggingface.co/YuqianFu/sam2/resolve/main/demo/frontend/src/common/components/video/effects/GradientEffect.ts
3.23 kB
| /** | |
| * 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 BaseGLEffect from '@/common/components/video/effects/BaseGLEffect'; | |
| import { | |
| EffectFrameContext, | |
| EffectInit, | |
| } from '@/common/components/video/effects/Effect'; | |
| import vertexShaderSource from '@/common/components/video/effects/shaders/DefaultVert.vert?raw'; | |
| import fragmentShaderSource from '@/common/components/video/effects/shaders/Gradient.frag?raw'; | |
| import {Tracklet} from '@/common/tracker/Tracker'; | |
| import {generateLUTDATA, load3DLUT} from '@/common/utils/ShaderUtils'; | |
| import invariant from 'invariant'; | |
| import {CanvasForm} from 'pts'; | |
| export default class GradientEffect extends BaseGLEffect { | |
| private lutSize: number = 2; | |
| private _lutTextures: WebGLTexture[] = []; | |
| // Must be 1, main background texture takes 0. | |
| private _extraTextureUnit: number = 1; | |
| constructor() { | |
| super(3); | |
| this.vertexShaderSource = vertexShaderSource; | |
| this.fragmentShaderSource = fragmentShaderSource; | |
| } | |
| protected setupUniforms( | |
| gl: WebGL2RenderingContext, | |
| program: WebGLProgram, | |
| init: EffectInit, | |
| ): void { | |
| super.setupUniforms(gl, program, init); | |
| gl.uniform1i( | |
| gl.getUniformLocation(program, 'uColorGradeLUT'), | |
| this._extraTextureUnit, | |
| ); | |
| this._lutTextures = []; // clear any previous pool of textures | |
| for (let i = 0; i < this.numVariants; i++) { | |
| const _lutData = generateLUTDATA(this.lutSize); | |
| const _extraTexture = load3DLUT(gl, this.lutSize, _lutData); | |
| this._lutTextures.push(_extraTexture as WebGLTexture); | |
| } | |
| } | |
| apply(form: CanvasForm, context: EffectFrameContext, _tracklets: Tracklet[]) { | |
| const gl = this._gl; | |
| const program = this._program; | |
| if (!program) { | |
| return; | |
| } | |
| invariant(gl !== null, 'WebGL2 context is required'); | |
| gl.clearColor(0.0, 0.0, 0.0, 1.0); | |
| gl.clear(gl.COLOR_BUFFER_BIT); | |
| // Bind the LUT texture to texture unit 1 | |
| const lutTexture = this._lutTextures[this.variant]; | |
| gl.activeTexture(gl.TEXTURE1); | |
| gl.bindTexture(gl.TEXTURE_3D, lutTexture); | |
| gl.activeTexture(gl.TEXTURE0); | |
| gl.bindTexture(gl.TEXTURE_2D, this._frameTexture); | |
| gl.texImage2D( | |
| gl.TEXTURE_2D, | |
| 0, | |
| gl.RGBA, | |
| context.width, | |
| context.height, | |
| 0, | |
| gl.RGBA, | |
| gl.UNSIGNED_BYTE, | |
| context.frame, | |
| ); | |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); | |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); | |
| gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); | |
| const ctx = form.ctx; | |
| invariant(this._canvas !== null, 'canvas is required'); | |
| ctx.drawImage(this._canvas, 0, 0); | |
| } | |
| } | |