diff --git a/src/core/utils/PaletteMapFilter.ts b/src/core/utils/PaletteMapFilter.ts new file mode 100644 index 00000000..81e48196 --- /dev/null +++ b/src/core/utils/PaletteMapFilter.ts @@ -0,0 +1,65 @@ +import { NitroFilter } from './proxy'; + +const vertex = ` +attribute vec2 aVertexPosition; +attribute vec2 aTextureCoord; +uniform mat3 projectionMatrix; +varying vec2 vTextureCoord; +void main(void) +{ + gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0); + vTextureCoord = aTextureCoord; +}`; + +const fragment = ` +varying vec2 vTextureCoord; +uniform sampler2D uSampler; +uint8_t reds[256]; +uint8_t greens[256]; +uint8_t blues[256]; +uint8_t alphas[256]; + +void main(void) { + vec4 currentColor = texture2D(uSampler, vTextureCoord); + vec4 newColor = + + gl_FragColor = vec4(newColor.r, newColor.g, newColor.b, newColor.a); +}`; + +export class PaletteMapFilter extends NitroFilter +{ + private _reds: number[]; + private _greens: number[]; + private _blues: number[]; + private _alphas: number[]; + + constructor(reds: number[], greens: number[], blues: number[], alphas: number[]) + { + super(vertex, fragment); + + this._reds = reds; + this._greens = greens; + this._blues = blues; + this._alphas = alphas; + } + + public get reds(): number[] + { + return this._reds; + } + + public get blues(): number[] + { + return this._blues; + } + + public get greens(): number[] + { + return this._greens; + } + + public get alphas(): number[] + { + return this._alphas; + } +} diff --git a/src/nitro/avatar/AvatarImage.ts b/src/nitro/avatar/AvatarImage.ts index 7ab3389e..df7c47d5 100644 --- a/src/nitro/avatar/AvatarImage.ts +++ b/src/nitro/avatar/AvatarImage.ts @@ -5,6 +5,7 @@ import { Rectangle } from '@pixi/math'; import { Sprite } from '@pixi/sprite'; import { NitroContainer, NitroSprite } from '../../core'; import { AdvancedMap } from '../../core/utils/AdvancedMap'; +import { PaletteMapFilter } from '../../core/utils/PaletteMapFilter'; import { IGraphicAsset } from '../../room/object/visualization/utils/IGraphicAsset'; import { TextureUtils } from '../../room/utils/TextureUtils'; import { Nitro } from '../Nitro'; @@ -394,6 +395,8 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener if(this._avatarSpriteData && this._avatarSpriteData.paletteIsGrayscale) { this.convertToGrayscale(container); + + container.filters.push(new PaletteMapFilter(this._avatarSpriteData.reds, [], [], [])); } if(!cache) @@ -415,13 +418,13 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener if(!this._reusableTexture) return null; - if(this._avatarSpriteData) - { - if(this._avatarSpriteData.paletteIsGrayscale) - { - this._reusableTexture = this.applyPalette(this._reusableTexture, this._avatarSpriteData.reds, [], []); - } - } + // if(this._avatarSpriteData) + // { + // if(this._avatarSpriteData.paletteIsGrayscale) + // { + // this._reusableTexture = this.applyPalette(this._reusableTexture, this._avatarSpriteData.reds, [], []); + // } + // } this._image = this._reusableTexture; this._changes = false;