{"version":3,"file":"transition-renderer.cjs","sources":["../../../src/utils/transition-renderer.js"],"sourcesContent":["/**\r\n * 转场渲染器 - 使用 gl-transitions 渲染转场效果\r\n * 参考 FKVideo 的实现\r\n */\r\nimport GL from 'gl';\r\nimport createBuffer from 'gl-buffer';\r\nimport createTexture from 'gl-texture2d';\r\nimport glTransition from 'gl-transition';\r\nimport glTransitions from 'gl-transitions';\r\nimport ndarray from 'ndarray';\r\nimport * as easings from './easings.js';\r\n\r\nconst { default: createTransition } = glTransition;\r\n\r\n// 转场别名\r\nconst TransitionAliases = {\r\n  // 方向性过渡效果\r\n  'directional-left': { name: 'directional', easing: 'easeOutExpo', params: { direction: [1, 0] } },\r\n  'directional-right': { name: 'directional', easing: 'easeOutExpo', params: { direction: [-1, 0] } },\r\n  'directional-down': { name: 'directional', easing: 'easeOutExpo', params: { direction: [0, 1] } },\r\n  'directional-up': { name: 'directional', easing: 'easeOutExpo', params: { direction: [0, -1] } },\r\n};\r\n\r\nexport const AllTransitions = [\r\n  ...glTransitions.map((t) => t.name),\r\n  ...Object.keys(TransitionAliases)\r\n];\r\n\r\n\r\nexport const transactions=[\r\n  'Bounce',                'BowTieHorizontal',  'BowTieVertical',\r\n  'ButterflyWaveScrawler', 'CircleCrop',        'ColourDistance',\r\n  'CrazyParametricFun',    'CrossZoom',         'Directional',\r\n  'DoomScreenTransition',  'Dreamy',            'DreamyZoom',\r\n  'GlitchDisplace',        'GlitchMemories',    'GridFlip',\r\n  'InvertedPageCurl',      'LinearBlur',        'Mosaic',\r\n  'PolkaDotsCurtain',      'Radial',            'SimpleZoom',\r\n  'StereoViewer',          'Swirl',             'WaterDrop',\r\n  'ZoomInCircles',         'angular',           'burn',\r\n  'cannabisleaf',          'circle',            'circleopen',\r\n  'colorphase',            'crosshatch',        'crosswarp',\r\n  'cube',                  'directionalwarp',   'directionalwipe',\r\n  'displacement',          'doorway',           'fade',\r\n  'fadecolor',             'fadegrayscale',     'flyeye',\r\n  'heart',                 'hexagonalize',      'kaleidoscope',\r\n  'luma',                  'luminance_melt',    'morph',\r\n  'multiply_blend',        'perlin',            'pinwheel',\r\n  'pixelize',              'polar_function',    'randomsquares',\r\n  'ripple',                'rotate_scale_fade', 'squareswire',\r\n  'squeeze',               'swap',              'undulatingBurnOut',\r\n  'wind',                  'windowblinds',      'windowslice',\r\n  'wipeDown',              'wipeLeft',          'wipeRight',\r\n  'wipeUp',                'directional-left',  'directional-right',\r\n  'directional-down',      'directional-up'\r\n]\r\n\r\n\r\n\r\n/**\r\n * 转场渲染器类\r\n */\r\nexport class TransitionRenderer {\r\n  constructor(options = {}) {\r\n    if (!options || options.duration === 0) {\r\n      options = { duration: 0 };\r\n    }\r\n\r\n    if (typeof options !== 'object') {\r\n      throw new Error('Transition must be an object');\r\n    }\r\n    if (options.duration !== 0 && !options.name) {\r\n      throw new Error('Please specify transition name or set duration to 0');\r\n    }\r\n\r\n    if (options.name === 'random') {\r\n      // 为 random 过渡使用真正的随机选择\r\n      const randomIndex = Math.floor(Math.random() * AllTransitions.length);\r\n      options.name = AllTransitions[randomIndex];\r\n    }\r\n\r\n    const aliasedTransition = options.name && TransitionAliases[options.name];\r\n    if (aliasedTransition) {\r\n      Object.assign(options, aliasedTransition);\r\n    }\r\n\r\n    this.duration = options.duration ?? 0;\r\n    this.name = options.name;\r\n    this.params = options.params;\r\n    this.easingFunction =\r\n      options.easing && easings[options.easing]\r\n        ? easings[options.easing]\r\n        : easings.linear;\r\n\r\n    // A dummy transition can be used to have an audio transition without a video transition\r\n    // (Note: You will lose a portion from both clips due to overlap)\r\n    if (this.name && this.name !== 'dummy') {\r\n      this.source = glTransitions.find(\r\n        ({ name }) => name.toLowerCase() === this.name?.toLowerCase()\r\n      );\r\n      if (!this.source) {\r\n        throw new Error(`Transition not found: ${this.name}`);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 创建转场渲染函数\r\n   * @param {Object} config - 配置 { width, height, channels }\r\n   * @returns {Function} 渲染函数 ({ fromFrame, toFrame, progress }) => Buffer\r\n   */\r\n  create({ width, height, channels = 4 }) {\r\n    const gl = GL(width, height);\r\n    const resizeMode = 'stretch';\r\n\r\n    if (!gl) {\r\n      throw new Error(\r\n        'gl returned null, this probably means that some dependencies are not installed. See README.'\r\n      );\r\n    }\r\n\r\n    function convertFrame(buf) {\r\n      // @see https://github.com/stackgl/gl-texture2d/issues/16\r\n      return ndarray(buf, [width, height, channels], [channels, width * channels, 1]);\r\n    }\r\n\r\n    // 为需要位移贴图的转场创建默认位移贴图\r\n    function createDisplacementMap(w, h) {\r\n      const data = Buffer.allocUnsafe(w * h * 4);\r\n      for (let i = 0; i < w * h * 4; i += 4) {\r\n        const x = ((i / 4) % w) / w;\r\n        const y = Math.floor((i / 4) / w) / h;\r\n        // 使用 Perlin 噪声的简单替代：噪声图案\r\n        const noise = Math.sin(x * 10) * Math.cos(y * 10) * 0.5 + 0.5;\r\n        data[i] = Math.floor(noise * 255);     // R\r\n        data[i + 1] = Math.floor(noise * 255); // G\r\n        data[i + 2] = Math.floor(noise * 255); // B\r\n        data[i + 3] = 255;                     // A\r\n      }\r\n      return ndarray(data, [w, h, 4], [4, w * 4, 1]);\r\n    }\r\n\r\n    // 预先创建并缓存可重用的资源（避免每帧都创建和销毁）\r\n    const buffer = createBuffer(gl, [-1, -1, -1, 4, 4, -1], gl.ARRAY_BUFFER, gl.STATIC_DRAW);\r\n    let transition;\r\n    let displacementMapTexture = null;\r\n    \r\n    if (this.source) {\r\n      transition = createTransition(gl, this.source, { resizeMode });\r\n      \r\n      // 如果转场需要位移贴图，预先创建\r\n      if (this.source.uniforms && this.source.uniforms.displacementMap) {\r\n        const dispMapNdArray = createDisplacementMap(width, height);\r\n        displacementMapTexture = createTexture(gl, dispMapNdArray);\r\n        displacementMapTexture.minFilter = gl.LINEAR;\r\n        displacementMapTexture.magFilter = gl.LINEAR;\r\n        displacementMapTexture.wrap = gl.REPEAT;\r\n      }\r\n    }\r\n\r\n    return ({ fromFrame, toFrame, progress }) => {\r\n      if (!this.source) {\r\n        // No transition found, just switch frames half way through the transition.\r\n        return this.easingFunction(progress) > 0.5 ? toFrame : fromFrame;\r\n      }\r\n\r\n      try {\r\n        gl.clear(gl.COLOR_BUFFER_BIT);\r\n\r\n        // 创建纹理（每帧都需要新的纹理，因为输入不同）\r\n        const fromFrameNdArray = convertFrame(fromFrame);\r\n        const textureFrom = createTexture(gl, fromFrameNdArray);\r\n        textureFrom.minFilter = gl.LINEAR;\r\n        textureFrom.magFilter = gl.LINEAR;\r\n\r\n        const toFrameNdArray = convertFrame(toFrame);\r\n        const textureTo = createTexture(gl, toFrameNdArray);\r\n        textureTo.minFilter = gl.LINEAR;\r\n        textureTo.magFilter = gl.LINEAR;\r\n\r\n        // 重用预创建的 buffer 和 transition\r\n        buffer.bind();\r\n        \r\n        // 准备转场参数\r\n        const transitionParams = { ...this.params };\r\n        if (displacementMapTexture) {\r\n          transitionParams.displacementMap = displacementMapTexture;\r\n        }\r\n        \r\n        transition.draw(\r\n          this.easingFunction(progress),\r\n          textureFrom,\r\n          textureTo,\r\n          gl.drawingBufferWidth,\r\n          gl.drawingBufferHeight,\r\n          transitionParams\r\n        );\r\n\r\n        // 立即释放纹理（避免内存泄漏）\r\n        textureFrom.dispose();\r\n        textureTo.dispose();\r\n\r\n        // 读取像素到新分配的缓冲区（每次返回新的 Buffer，避免引用共享）\r\n        const outArray = Buffer.allocUnsafe(width * height * 4);\r\n        gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, outArray);\r\n\r\n        return outArray;\r\n      } catch (error) {\r\n        console.error('转场渲染错误:', error);\r\n        // 如果出错，返回简单的混合结果\r\n        return this.easingFunction(progress) > 0.5 ? toFrame : fromFrame;\r\n      }\r\n    };\r\n    \r\n    // 在函数返回后，需要在某个时刻清理 gl context 和 displacementMapTexture\r\n    // 但由于这是个长期存活的对象，我们保持资源直到对象被销毁\r\n  }\r\n}\r\n\r\n"],"names":["easings","easings.linear"],"mappings":"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"}