1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00
GLideN64/GLSLCombiner.h
2015-05-13 10:13:56 +06:00

120 lines
3.6 KiB
C++

#ifndef GLSL_COMBINER_H
#define GLSL_COMBINER_H
#include "gDP.h"
class ShaderCombiner {
public:
ShaderCombiner(Combiner & _color, Combiner & _alpha, const gDPCombine & _combine);
~ShaderCombiner();
void update();
void updateColors(bool _bForce = false);
void updateFBInfo(bool _bForce = false);
void updateDepthInfo(bool _bForce = false);
void updateAlphaTestInfo(bool _bForce = false);
void updateTextureInfo(bool _bForce = false);
void updateRenderState(bool _bForce = false);
void updateLight(bool _bForce = false);
u64 getMux() const {return m_combine.mux;}
bool usesT0() const {return (m_nInputs & ((1<<TEXEL0)|(1<<TEXEL0_ALPHA))) != 0;}
bool usesT1() const {return (m_nInputs & ((1<<TEXEL1)|(1<<TEXEL1_ALPHA))) != 0;}
bool usesLOD() const {return (m_nInputs & (1<<LOD_FRACTION)) != 0;}
bool usesShadeColor() const {return (m_nInputs & ((1<<SHADE)|(1<<SHADE_ALPHA))) != 0;}
private:
struct iUniform {GLint loc; int val;};
struct fUniform {GLint loc; float val;};
struct fv2Uniform {GLint loc; float val[2];};
struct iv2Uniform {GLint loc; int val[2];};
struct fv3Uniform {GLint loc; float val[3];};
struct fv4Uniform {GLint loc; float val[4];};
struct UniformLocation
{
iUniform uTex0, uTex1, uTlutImage, uZlutImage, uDepthImage,
uFogMode, uFogUsage, uEnableLod, uEnableAlphaTest,
uEnableDepth, uEnableDepthCompare, uEnableDepthUpdate,
uDepthMode, uFb8Bit, uFbFixedAlpha, uRenderState,
uMaxTile, uTextureDetail, uTexturePersp,
uAlphaCompareMode, uAlphaDitherMode, uColorDitherMode;
fUniform uFogMultiplier, uFogOffset, uK4, uK5, uPrimLod, uNoiseTime, uScreenWidth, uScreenHeight,
uLodXScale, uLodYScale, uMinLod, uDepthTrans, uDepthScale, uAlphaTestValue;
fv4Uniform uEnvColor, uPrimColor, uFogColor, uCenterColor, uScaleColor;
fv2Uniform uTexScale, uTexOffset[2], uTexMask[2],
uCacheShiftScale[2], uCacheScale[2], uCacheOffset[2];
fv3Uniform uLightDirection[8], uLightColor[8];
iv2Uniform uCacheFrameBuffer;
};
#ifdef OS_MAC_OS_X
#define glUniform1i glUniform1iARB
#define glUniform1f glUniform1fARB
#define glUniform2f glUniform2fARB
#define glUniform2i glUniform2iARB
#define glUniform3fv glUniform3fvARB
#define glUniform4fv glUniform4fvARB
#endif
void _locate_attributes() const;
void _locateUniforms();
void _setIUniform(iUniform & _u, int _val, bool _force) {
if (_force|| _u.val != _val) {
_u.val = _val;
glUniform1i(_u.loc, _val);
}
}
void _setFUniform(fUniform & _u, float _val, bool _force) {
if (_force|| _u.val != _val) {
_u.val = _val;
glUniform1f(_u.loc, _val);
}
}
void _setFV2Uniform(fv2Uniform & _u, float _val1, float _val2, bool _force) {
if (_force|| _u.val[0] != _val1 || _u.val[1] != _val2) {
_u.val[0] = _val1;
_u.val[1] = _val2;
glUniform2f(_u.loc, _val1, _val2);
}
}
void _setIV2Uniform(iv2Uniform & _u, int _val1, int _val2, bool _force) {
if (_force|| _u.val[0] != _val1 || _u.val[1] != _val2) {
_u.val[0] = _val1;
_u.val[1] = _val2;
glUniform2i(_u.loc, _val1, _val2);
}
}
void _setV3Uniform(fv3Uniform & _u, float * _pVal, bool _force) {
const size_t szData = sizeof(float)*3;
if (_force|| memcmp(_u.val, _pVal, szData) > 0) {
memcpy(_u.val, _pVal, szData);
glUniform3fv(_u.loc, 1, _pVal);
}
}
void _setV4Uniform(fv4Uniform & _u, float * _pVal, bool _force) {
const size_t szData = sizeof(float)*4;
if (_force|| memcmp(_u.val, _pVal, szData) > 0) {
memcpy(_u.val, _pVal, szData);
glUniform4fv(_u.loc, 1, _pVal);
}
}
gDPCombine m_combine;
UniformLocation m_uniforms;
GLuint m_program;
int m_nInputs;
};
void InitShaderCombiner();
void DestroyShaderCombiner();
void SetShadowMapCombiner();
#endif //GLSL_COMBINER_H