mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-04-29 19:44:49 +02:00
396 lines
7.3 KiB
C++
396 lines
7.3 KiB
C++
/*
|
|
** shader.h
|
|
**
|
|
** This file is part of mkxp.
|
|
**
|
|
** Copyright (C) 2013 - 2021 Amaryllis Kulla <ancurio@mapleshrine.eu>
|
|
**
|
|
** mkxp is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** mkxp is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef SHADER_H
|
|
#define SHADER_H
|
|
|
|
#include "etc-internal.h"
|
|
#include "gl-util.h"
|
|
#include "glstate.h"
|
|
|
|
class Shader
|
|
{
|
|
public:
|
|
void bind();
|
|
static void unbind();
|
|
|
|
enum Attribute
|
|
{
|
|
Position = 0,
|
|
TexCoord = 1,
|
|
Color = 2
|
|
};
|
|
|
|
static std::string &commonHeader();
|
|
|
|
protected:
|
|
Shader();
|
|
~Shader();
|
|
|
|
void init(const unsigned char *vert, int vertSize,
|
|
const unsigned char *frag, int fragSize,
|
|
const char *vertName, const char *fragName,
|
|
const char *programName);
|
|
void initFromFile(const char *vertFile, const char *fragFile,
|
|
const char *programName);
|
|
|
|
static void setVec4Uniform(GLint location, const Vec4 &vec);
|
|
static void setVec2Uniform(GLint location, const Vec2 &vec);
|
|
static void setTexUniform(GLint location, unsigned unitIndex, TEX::ID texture);
|
|
|
|
GLuint vertShader, fragShader;
|
|
GLuint program;
|
|
|
|
private:
|
|
#ifdef MKXPZ_BUILD_XCODE
|
|
static std::string shaderCommon;
|
|
#endif
|
|
};
|
|
|
|
class ShaderBase : public Shader
|
|
{
|
|
public:
|
|
|
|
struct GLProjMat : public GLProperty<Vec2i>
|
|
{
|
|
private:
|
|
void apply(const Vec2i &value);
|
|
GLint u_mat;
|
|
|
|
friend class ShaderBase;
|
|
};
|
|
|
|
/* Stack is not used (only 'set()') */
|
|
GLProjMat projMat;
|
|
|
|
/* Retrieves the current glState.viewport size,
|
|
* calculates the corresponding ortho projection matrix
|
|
* and loads it into the shaders uniform */
|
|
void applyViewportProj();
|
|
|
|
void setTexSize(const Vec2i &value);
|
|
void setTranslation(const Vec2i &value);
|
|
|
|
protected:
|
|
void init();
|
|
virtual bool framebufferScalingAllowed();
|
|
|
|
GLint u_texSizeInv, u_translation;
|
|
};
|
|
|
|
class FlatColorShader : public ShaderBase
|
|
{
|
|
public:
|
|
FlatColorShader();
|
|
|
|
void setColor(const Vec4 &value);
|
|
|
|
private:
|
|
GLint u_color;
|
|
};
|
|
|
|
class SimpleShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleShader();
|
|
|
|
void setTexOffsetX(int value);
|
|
|
|
protected:
|
|
GLint u_texOffsetX;
|
|
};
|
|
|
|
class SimpleColorShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleColorShader();
|
|
};
|
|
|
|
class SimpleAlphaShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleAlphaShader();
|
|
};
|
|
|
|
class SimpleSpriteShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleSpriteShader();
|
|
|
|
void setSpriteMat(const float value[16]);
|
|
|
|
private:
|
|
GLint u_spriteMat;
|
|
};
|
|
|
|
class AlphaSpriteShader : public ShaderBase
|
|
{
|
|
public:
|
|
AlphaSpriteShader();
|
|
|
|
void setSpriteMat(const float value[16]);
|
|
void setAlpha(float value);
|
|
|
|
private:
|
|
GLint u_spriteMat, u_alpha;
|
|
};
|
|
|
|
class TransShader : public ShaderBase
|
|
{
|
|
public:
|
|
TransShader();
|
|
|
|
void setCurrentScene(TEX::ID tex);
|
|
void setFrozenScene(TEX::ID tex);
|
|
void setTransMap(TEX::ID tex);
|
|
void setProg(float value);
|
|
void setVague(float value);
|
|
|
|
private:
|
|
GLint u_currentScene, u_frozenScene, u_transMap, u_prog, u_vague;
|
|
};
|
|
|
|
class SimpleTransShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleTransShader();
|
|
|
|
void setCurrentScene(TEX::ID tex);
|
|
void setFrozenScene(TEX::ID tex);
|
|
void setProg(float value);
|
|
|
|
private:
|
|
GLint u_currentScene, u_frozenScene, u_prog;
|
|
};
|
|
|
|
class SpriteShader : public ShaderBase
|
|
{
|
|
public:
|
|
SpriteShader();
|
|
|
|
void setSpriteMat(const float value[16]);
|
|
void setTone(const Vec4 &value);
|
|
void setColor(const Vec4 &value);
|
|
void setOpacity(float value);
|
|
void setBushDepth(float value);
|
|
void setBushOpacity(float value);
|
|
void setPattern(const TEX::ID pattern, const Vec2 &dimensions);
|
|
void setPatternBlendType(int blendType);
|
|
void setPatternTile(bool value);
|
|
void setShouldRenderPattern(bool value);
|
|
void setPatternOpacity(float value);
|
|
void setPatternScroll(const Vec2 &scroll);
|
|
void setPatternZoom(const Vec2 &zoom);
|
|
void setInvert(bool value);
|
|
|
|
private:
|
|
GLint u_spriteMat, u_tone, u_opacity, u_color, u_bushDepth, u_bushOpacity, u_pattern, u_renderPattern,
|
|
u_patternBlendType, u_patternSizeInv, u_patternTile, u_patternOpacity, u_patternScroll, u_patternZoom, u_invert;
|
|
};
|
|
|
|
class PlaneShader : public ShaderBase
|
|
{
|
|
public:
|
|
PlaneShader();
|
|
|
|
void setTone(const Vec4 &value);
|
|
void setColor(const Vec4 &value);
|
|
void setFlash(const Vec4 &value);
|
|
void setOpacity(float value);
|
|
|
|
private:
|
|
GLint u_tone, u_color, u_flash, u_opacity;
|
|
};
|
|
|
|
class GrayShader : public ShaderBase
|
|
{
|
|
public:
|
|
GrayShader();
|
|
|
|
void setGray(float value);
|
|
|
|
protected:
|
|
virtual bool framebufferScalingAllowed();
|
|
|
|
private:
|
|
GLint u_gray;
|
|
};
|
|
|
|
class TilemapShader : public ShaderBase
|
|
{
|
|
public:
|
|
TilemapShader();
|
|
|
|
void setAniIndex(int value);
|
|
|
|
void setTone(const Vec4 &value);
|
|
void setColor(const Vec4 &value);
|
|
void setOpacity(float value);
|
|
|
|
void setATFrames(int values[7]);
|
|
|
|
private:
|
|
GLint u_aniIndex, u_tone, u_color, u_opacity, u_atFrames;
|
|
};
|
|
|
|
class FlashMapShader : public ShaderBase
|
|
{
|
|
public:
|
|
FlashMapShader();
|
|
|
|
void setAlpha(float value);
|
|
|
|
private:
|
|
GLint u_alpha;
|
|
};
|
|
|
|
class HueShader : public ShaderBase
|
|
{
|
|
public:
|
|
HueShader();
|
|
|
|
void setHueAdjust(float value);
|
|
|
|
private:
|
|
GLint u_hueAdjust;
|
|
};
|
|
|
|
class SimpleMatrixShader : public ShaderBase
|
|
{
|
|
public:
|
|
SimpleMatrixShader();
|
|
|
|
void setMatrix(const float value[16]);
|
|
|
|
private:
|
|
GLint u_matrix;
|
|
};
|
|
|
|
/* Gaussian blur */
|
|
struct BlurShader
|
|
{
|
|
class HPass : public ShaderBase
|
|
{
|
|
public:
|
|
HPass();
|
|
};
|
|
|
|
class VPass : public ShaderBase
|
|
{
|
|
public:
|
|
VPass();
|
|
};
|
|
|
|
HPass pass1;
|
|
VPass pass2;
|
|
};
|
|
|
|
class TilemapVXShader : public ShaderBase
|
|
{
|
|
public:
|
|
TilemapVXShader();
|
|
|
|
void setAniOffset(const Vec2 &value);
|
|
|
|
private:
|
|
GLint u_aniOffset;
|
|
};
|
|
|
|
/* Bitmap blit */
|
|
class BltShader : public ShaderBase
|
|
{
|
|
public:
|
|
BltShader();
|
|
|
|
void setSource();
|
|
void setDestination(const TEX::ID value);
|
|
void setDestCoorF(const Vec2 &value);
|
|
void setSubRect(const FloatRect &value);
|
|
void setOpacity(float value);
|
|
|
|
private:
|
|
GLint u_source, u_destination, u_subRect, u_opacity;
|
|
};
|
|
|
|
class Lanczos3Shader : public SimpleShader
|
|
{
|
|
public:
|
|
Lanczos3Shader();
|
|
|
|
void setTexSize(const Vec2i &value);
|
|
|
|
protected:
|
|
GLint u_sourceSize;
|
|
};
|
|
|
|
class BicubicShader : public Lanczos3Shader
|
|
{
|
|
public:
|
|
BicubicShader();
|
|
|
|
void setSharpness(int sharpness);
|
|
|
|
protected:
|
|
GLint u_bc;
|
|
};
|
|
|
|
#ifdef MKXPZ_SSL
|
|
class XbrzShader : public Lanczos3Shader
|
|
{
|
|
public:
|
|
XbrzShader();
|
|
|
|
void setTargetScale(const Vec2 &value);
|
|
|
|
protected:
|
|
GLint u_targetScale;
|
|
};
|
|
#endif
|
|
|
|
/* Global object containing all available shaders */
|
|
struct ShaderSet
|
|
{
|
|
FlatColorShader flatColor;
|
|
SimpleShader simple;
|
|
SimpleColorShader simpleColor;
|
|
SimpleAlphaShader simpleAlpha;
|
|
SimpleSpriteShader simpleSprite;
|
|
AlphaSpriteShader alphaSprite;
|
|
SpriteShader sprite;
|
|
PlaneShader plane;
|
|
GrayShader gray;
|
|
TilemapShader tilemap;
|
|
FlashMapShader flashMap;
|
|
TransShader trans;
|
|
SimpleTransShader simpleTrans;
|
|
HueShader hue;
|
|
BltShader blt;
|
|
SimpleMatrixShader simpleMatrix;
|
|
BlurShader blur;
|
|
TilemapVXShader tilemapVX;
|
|
BicubicShader bicubic;
|
|
Lanczos3Shader lanczos3;
|
|
#ifdef MKXPZ_SSL
|
|
XbrzShader xbrz;
|
|
#endif
|
|
};
|
|
|
|
#endif // SHADER_H
|