( entry: ColorGradingEntry, src: string, lut: CubeLut3D, )
| 475 | } |
| 476 | |
| 477 | function uploadEntryLut( |
| 478 | entry: ColorGradingEntry, |
| 479 | src: string, |
| 480 | lut: CubeLut3D, |
| 481 | ): RuntimeLutTexture | null { |
| 482 | if (entry.lut?.src === src) return entry.lut; |
| 483 | const packed = packCubeLutToRgba8(lut); |
| 484 | const { gl, program } = entry; |
| 485 | try { |
| 486 | gl.activeTexture(gl.TEXTURE1); |
| 487 | gl.bindTexture(gl.TEXTURE_2D, program.lutTexture); |
| 488 | gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); |
| 489 | gl.texImage2D( |
| 490 | gl.TEXTURE_2D, |
| 491 | 0, |
| 492 | gl.RGBA, |
| 493 | packed.width, |
| 494 | packed.height, |
| 495 | 0, |
| 496 | gl.RGBA, |
| 497 | gl.UNSIGNED_BYTE, |
| 498 | packed.data, |
| 499 | ); |
| 500 | entry.lut = { |
| 501 | src, |
| 502 | title: lut.title, |
| 503 | size: lut.size, |
| 504 | domainMin: lut.domainMin, |
| 505 | domainMax: lut.domainMax, |
| 506 | textureWidth: packed.width, |
| 507 | textureHeight: packed.height, |
| 508 | }; |
| 509 | entry.lutError = null; |
| 510 | entry.lutLoadingSrc = null; |
| 511 | return entry.lut; |
| 512 | } catch (err) { |
| 513 | entry.lut = null; |
| 514 | entry.lutError = errorMessage(err); |
| 515 | entry.lutLoadingSrc = null; |
| 516 | swallow("runtime.colorGrading.uploadLut", err); |
| 517 | return null; |
| 518 | } |
| 519 | } |
| 520 | |
| 521 | // fallow-ignore-next-line complexity |
| 522 | function ensureEntryLut(entry: ColorGradingEntry): RuntimeLutTexture | null { |
no test coverage detected