PaletteMapFilter

This commit is contained in:
Bill 2021-08-31 17:11:22 -04:00
parent 31fc2b714c
commit 270d785d27
2 changed files with 75 additions and 7 deletions

View File

@ -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;
}
}

View File

@ -5,6 +5,7 @@ import { Rectangle } from '@pixi/math';
import { Sprite } from '@pixi/sprite'; import { Sprite } from '@pixi/sprite';
import { NitroContainer, NitroSprite } from '../../core'; import { NitroContainer, NitroSprite } from '../../core';
import { AdvancedMap } from '../../core/utils/AdvancedMap'; import { AdvancedMap } from '../../core/utils/AdvancedMap';
import { PaletteMapFilter } from '../../core/utils/PaletteMapFilter';
import { IGraphicAsset } from '../../room/object/visualization/utils/IGraphicAsset'; import { IGraphicAsset } from '../../room/object/visualization/utils/IGraphicAsset';
import { TextureUtils } from '../../room/utils/TextureUtils'; import { TextureUtils } from '../../room/utils/TextureUtils';
import { Nitro } from '../Nitro'; import { Nitro } from '../Nitro';
@ -394,6 +395,8 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
if(this._avatarSpriteData && this._avatarSpriteData.paletteIsGrayscale) if(this._avatarSpriteData && this._avatarSpriteData.paletteIsGrayscale)
{ {
this.convertToGrayscale(container); this.convertToGrayscale(container);
container.filters.push(new PaletteMapFilter(this._avatarSpriteData.reds, [], [], []));
} }
if(!cache) if(!cache)
@ -415,13 +418,13 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
if(!this._reusableTexture) return null; if(!this._reusableTexture) return null;
if(this._avatarSpriteData) // if(this._avatarSpriteData)
{ // {
if(this._avatarSpriteData.paletteIsGrayscale) // if(this._avatarSpriteData.paletteIsGrayscale)
{ // {
this._reusableTexture = this.applyPalette(this._reusableTexture, this._avatarSpriteData.reds, [], []); // this._reusableTexture = this.applyPalette(this._reusableTexture, this._avatarSpriteData.reds, [], []);
} // }
} // }
this._image = this._reusableTexture; this._image = this._reusableTexture;
this._changes = false; this._changes = false;