diff --git a/src/engine/Debug/DebugFlags.ts b/src/engine/Debug/DebugFlags.ts index 7ca4a4d7..c2574da2 100644 --- a/src/engine/Debug/DebugFlags.ts +++ b/src/engine/Debug/DebugFlags.ts @@ -9,20 +9,43 @@ export interface DebugFlags { export class ColorBlindFlags { private _engine: Engine; + private _colorBlindPostProcessor: ColorBlindnessPostProcessor; constructor(engine: Engine) { this._engine = engine; + this._colorBlindPostProcessor = new ColorBlindnessPostProcessor(ColorBlindnessMode.Protanope); } + /** + * Correct colors for a specified color blindness + * @param colorBlindness + */ public correct(colorBlindness: ColorBlindnessMode) { if (this._engine.graphicsContext instanceof ExcaliburGraphicsContextWebGL) { - this._engine.graphicsContext.addPostProcessor(new ColorBlindnessPostProcessor(colorBlindness, false)); + this.clear(); + this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness; + this._colorBlindPostProcessor.simulate = false; + this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor); } } + /** + * Simulate colors for a specified color blindness + * @param colorBlindness + */ public simulate(colorBlindness: ColorBlindnessMode) { if (this._engine.graphicsContext instanceof ExcaliburGraphicsContextWebGL) { - this._engine.graphicsContext.addPostProcessor(new ColorBlindnessPostProcessor(colorBlindness, true)); + this.clear(); + this._colorBlindPostProcessor.colorBlindnessMode = colorBlindness; + this._colorBlindPostProcessor.simulate = true; + this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor); } } + + /** + * Remove color blindness post processor + */ + public clear() { + this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor); + } } diff --git a/src/engine/Graphics/PostProcessor/ColorBlindnessPostProcessor.ts b/src/engine/Graphics/PostProcessor/ColorBlindnessPostProcessor.ts index 4865d344..b7829df4 100644 --- a/src/engine/Graphics/PostProcessor/ColorBlindnessPostProcessor.ts +++ b/src/engine/Graphics/PostProcessor/ColorBlindnessPostProcessor.ts @@ -27,16 +27,18 @@ export class ColorBlindnessPostProcessor implements PostProcessor { } set colorBlindnessMode(colorBlindMode: ColorBlindnessMode) { - const shader = this._shader.getShader(); - shader.use(); - if (this._colorBlindnessMode === ColorBlindnessMode.Protanope) { - shader.setUniformInt('u_type', 0); - } else if (this._colorBlindnessMode === ColorBlindnessMode.Deuteranope) { - shader.setUniformInt('u_type', 1); - } else if (this._colorBlindnessMode === ColorBlindnessMode.Tritanope) { - shader.setUniformInt('u_type', 2); - } this._colorBlindnessMode = colorBlindMode; + if (this._shader) { + const shader = this._shader.getShader(); + shader.use(); + if (this._colorBlindnessMode === ColorBlindnessMode.Protanope) { + shader.setUniformInt('u_type', 0); + } else if (this._colorBlindnessMode === ColorBlindnessMode.Deuteranope) { + shader.setUniformInt('u_type', 1); + } else if (this._colorBlindnessMode === ColorBlindnessMode.Tritanope) { + shader.setUniformInt('u_type', 2); + } + } } get colorBlindnessMode(): ColorBlindnessMode { @@ -44,10 +46,13 @@ export class ColorBlindnessPostProcessor implements PostProcessor { } set simulate(value: boolean) { - const shader = this._shader.getShader(); - shader.use(); this._simulate = value; - shader.setUniformBoolean('u_simulate', value); + if (this._shader) { + + const shader = this._shader.getShader(); + shader.use(); + shader.setUniformBoolean('u_simulate', value); + } } get simulate(): boolean {