From 624db78cadf049b9b957ca3391de76ebda59b95d Mon Sep 17 00:00:00 2001 From: Hardy--Lee Date: Mon, 26 Jan 2026 04:09:41 +0800 Subject: [PATCH] feat: add blend mode argument --- .../controller/stage/pixi/PixiController.ts | 6 ++++ .../stage/pixi/WebGALPixiContainer.ts | 35 +++++++++++++++++++ .../src/Core/gameScripts/changeFigure.ts | 6 ++++ .../src/Stage/MainStage/useSetFigure.ts | 9 +++-- packages/webgal/src/store/stageInterface.ts | 1 + 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/packages/webgal/src/Core/controller/stage/pixi/PixiController.ts b/packages/webgal/src/Core/controller/stage/pixi/PixiController.ts index 98bbc7151..e361db81f 100644 --- a/packages/webgal/src/Core/controller/stage/pixi/PixiController.ts +++ b/packages/webgal/src/Core/controller/stage/pixi/PixiController.ts @@ -568,6 +568,9 @@ export default class PixiStage { if (metadata.zIndex) { thisFigureContainer.zIndex = metadata.zIndex; } + if (metadata.blendMode) { + thisFigureContainer.blendMode = metadata.blendMode; + } } // 挂载 this.figureContainer.addChild(thisFigureContainer); @@ -664,6 +667,9 @@ export default class PixiStage { if (metadata.zIndex) { thisFigureContainer.zIndex = metadata.zIndex; } + if (metadata.blendMode) { + thisFigureContainer.blendMode = metadata.blendMode; + } } // 挂载 this.figureContainer.addChild(thisFigureContainer); diff --git a/packages/webgal/src/Core/controller/stage/pixi/WebGALPixiContainer.ts b/packages/webgal/src/Core/controller/stage/pixi/WebGALPixiContainer.ts index c755f81c4..fc2fc6f14 100644 --- a/packages/webgal/src/Core/controller/stage/pixi/WebGALPixiContainer.ts +++ b/packages/webgal/src/Core/controller/stage/pixi/WebGALPixiContainer.ts @@ -9,6 +9,7 @@ import { BevelFilter } from '@/Core/controller/stage/pixi/shaders/BevelFilter'; import * as PIXI from 'pixi.js'; import { BlurFilter } from '@pixi/filter-blur'; import { INIT_RAD, RadiusAlphaFilter } from '@/Core/controller/stage/pixi/shaders/RadiusAlphaFilter'; +import { logger } from '@/Core/util/logger'; /** * Filter configuration for creation and default state detection. @@ -347,6 +348,40 @@ export class WebGALPixiContainer extends PIXI.Container { this.alphaFilter.alpha = v; } + public get blendMode(): string { + switch (this.alphaFilter.blendMode) { + case PIXI.BLEND_MODES.NORMAL: + return 'normal'; + case PIXI.BLEND_MODES.ADD: + return 'add'; + case PIXI.BLEND_MODES.MULTIPLY: + return 'multiply'; + case PIXI.BLEND_MODES.SCREEN: + return 'screen'; + default: + logger.warn(`Unknown blend mode: ${this.alphaFilter.blendMode}, returning normal.`); + return 'normal'; + } + } + public set blendMode(v: string) { + switch (v) { + case 'normal': + this.alphaFilter.blendMode = PIXI.BLEND_MODES.NORMAL; + break; + case 'add': + this.alphaFilter.blendMode = PIXI.BLEND_MODES.ADD; + break; + case 'multiply': + this.alphaFilter.blendMode = PIXI.BLEND_MODES.MULTIPLY; + break; + case 'screen': + this.alphaFilter.blendMode = PIXI.BLEND_MODES.SCREEN; + break; + default: + logger.warn(`Unknown blend mode: ${v}, setting to normal.`); + this.alphaFilter.blendMode = PIXI.BLEND_MODES.NORMAL; + } + } public removeFilterByName(filterName: string) { const filter = this.containerFilters.get(filterName); if (!filter || !this.filters) return; diff --git a/packages/webgal/src/Core/gameScripts/changeFigure.ts b/packages/webgal/src/Core/gameScripts/changeFigure.ts index 10a8c8891..702fce3a5 100644 --- a/packages/webgal/src/Core/gameScripts/changeFigure.ts +++ b/packages/webgal/src/Core/gameScripts/changeFigure.ts @@ -91,6 +91,7 @@ export function changeFigure(sentence: ISentence): IPerform { const enterAnimation = getStringArgByKey(sentence, 'enter'); const exitAnimation = getStringArgByKey(sentence, 'exit'); let zIndex = getNumberArgByKey(sentence, 'zIndex') ?? -1; + let blendMode = getStringArgByKey(sentence, 'blendMode'); const enterDuration = getNumberArgByKey(sentence, 'enterDuration') ?? duration; duration = enterDuration; const exitDuration = getNumberArgByKey(sentence, 'exitDuration') ?? DEFAULT_FIG_OUT_DURATION; @@ -232,11 +233,13 @@ export function changeFigure(sentence: ISentence): IPerform { blink = blink ?? cloneDeep(baseBlinkParam); focus = focus ?? cloneDeep(baseFocusParam); zIndex = Math.max(zIndex, 0); + blendMode = blendMode ?? 'normal'; dispatch(stageActions.setLive2dMotion({ target: key, motion, overrideBounds: bounds })); dispatch(stageActions.setLive2dExpression({ target: key, expression })); dispatch(stageActions.setLive2dBlink({ target: key, blink })); dispatch(stageActions.setLive2dFocus({ target: key, focus })); dispatch(stageActions.setFigureMetaData([key, 'zIndex', zIndex, false])); + dispatch(stageActions.setFigureMetaData([key, 'blendMode', blendMode, false])); } else { // 当 url 没有发生变化时,即没有新立绘替换 // 应当保留旧立绘的状态,仅在需要时更新 @@ -255,6 +258,9 @@ export function changeFigure(sentence: ISentence): IPerform { if (zIndex >= 0) { dispatch(stageActions.setFigureMetaData([key, 'zIndex', zIndex, false])); } + if (blendMode) { + dispatch(stageActions.setFigureMetaData([key, 'blendMode', blendMode, false])); + } } } diff --git a/packages/webgal/src/Stage/MainStage/useSetFigure.ts b/packages/webgal/src/Stage/MainStage/useSetFigure.ts index 951bee319..311e93556 100644 --- a/packages/webgal/src/Stage/MainStage/useSetFigure.ts +++ b/packages/webgal/src/Stage/MainStage/useSetFigure.ts @@ -63,8 +63,13 @@ export function useSetFigure(stageState: IStageState) { useEffect(() => { Object.entries(figureMetaData).forEach(([key, value]) => { const figureObject = WebGAL.gameplay.pixiStage?.getStageObjByKey(key); - if (figureObject && !figureObject.isExiting && value?.zIndex !== undefined && figureObject.pixiContainer) { - figureObject.pixiContainer.zIndex = value.zIndex; + if (figureObject && !figureObject.isExiting && figureObject.pixiContainer) { + if (value.zIndex !== undefined) { + figureObject.pixiContainer.zIndex = value.zIndex; + } + if (value.blendMode !== undefined) { + figureObject.pixiContainer.blendMode = value.blendMode; + } } }); }, [figureMetaData]); diff --git a/packages/webgal/src/store/stageInterface.ts b/packages/webgal/src/store/stageInterface.ts index 5494635d2..907df19be 100644 --- a/packages/webgal/src/store/stageInterface.ts +++ b/packages/webgal/src/store/stageInterface.ts @@ -185,6 +185,7 @@ export interface ILive2DFocus { export interface IFigureMetadata { zIndex?: number; + blendMode?: string; } type figureMetaData = Record;