1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00
GLideN64/texture_env.cpp
2015-05-13 10:09:18 +06:00

176 lines
4.4 KiB
C++

#ifndef __LINUX__
# include <windows.h>
#else
# include "winlnxdefs.h"
#endif
#include "OpenGL.h"
#include "Combiner.h"
#include "texture_env.h"
void Init_texture_env()
{
}
void TexEnv::UpdateColors()
{
}
TexEnv::TexEnv( Combiner *color, Combiner *alpha )
{
m_usesT0 = FALSE;
m_usesT1 = FALSE;
m_fragment.color = m_fragment.alpha = COMBINED;
for (int i = 0; i < alpha->numStages; i++)
{
for (int j = 0; j < alpha->stage[i].numOps; j++)
{
switch (alpha->stage[i].op[j].op)
{
case LOAD:
if ((alpha->stage[i].op[j].param1 != TEXEL0_ALPHA) && (alpha->stage[i].op[j].param1 != TEXEL1_ALPHA))
{
m_fragment.alpha = alpha->stage[i].op[j].param1;
m_usesT0 = FALSE;
m_usesT1 = FALSE;
}
else
{
m_mode = GL_REPLACE;
m_usesT0 = alpha->stage[i].op[j].param1 == TEXEL0_ALPHA;
m_usesT1 = alpha->stage[i].op[j].param1 == TEXEL1_ALPHA;
}
break;
case SUB:
break;
case MUL:
if (((alpha->stage[i].op[j].param1 == TEXEL0_ALPHA) || (alpha->stage[i].op[j].param1 == TEXEL1_ALPHA)) &&
((alpha->stage[i].op[j - 1].param1 != TEXEL0_ALPHA) || (alpha->stage[i].op[j - 1].param1 != TEXEL1_ALPHA)))
{
m_mode = GL_MODULATE;
}
else if (((alpha->stage[i].op[j].param1 != TEXEL0_ALPHA) || (alpha->stage[i].op[j].param1 != TEXEL1_ALPHA)) &&
((alpha->stage[i].op[j - 1].param1 == TEXEL0_ALPHA) || (alpha->stage[i].op[j - 1].param1 == TEXEL1_ALPHA)))
{
m_fragment.alpha = alpha->stage[i].op[j].param1;
m_mode = GL_MODULATE;
}
break;
case ADD:
break;
case INTER:
break;
}
}
}
for (int i = 0; i < color->numStages; i++)
{
for (int j = 0; j < color->stage[i].numOps; j++)
{
switch (color->stage[i].op[j].op)
{
case LOAD:
if ((color->stage[i].op[j].param1 == TEXEL0) || (color->stage[i].op[j].param1 == TEXEL0_ALPHA))
{
if (m_mode == GL_MODULATE)
m_fragment.color = ONE;
m_usesT0 = TRUE;
m_usesT1 = FALSE;
}
else if ((color->stage[i].op[j].param1 == TEXEL1) || (color->stage[i].op[j].param1 == TEXEL1_ALPHA))
{
if (m_mode == GL_MODULATE)
m_fragment.color = ONE;
m_usesT0 = FALSE;
m_usesT1 = TRUE;
}
else
{
m_fragment.color = color->stage[i].op[j].param1;
m_usesT0 = m_usesT1 = FALSE;
}
break;
case SUB:
break;
case MUL:
if ((color->stage[i].op[j].param1 == TEXEL0) || (color->stage[i].op[j].param1 == TEXEL0_ALPHA))
{
if (!m_usesT0 && !m_usesT1)
{
m_mode = GL_MODULATE;
m_usesT0 = TRUE;
m_usesT1 = FALSE;
}
}
else if ((color->stage[i].op[j].param1 == TEXEL1) || (color->stage[i].op[j].param1 == TEXEL1_ALPHA))
{
if (!m_usesT0 && !m_usesT1)
{
m_mode = GL_MODULATE;
m_usesT0 = FALSE;
m_usesT1 = TRUE;
}
}
else if (m_usesT0 || m_usesT1)
{
m_mode = GL_MODULATE;
m_fragment.color = color->stage[i].op[j].param1;
}
break;
case ADD:
break;
case INTER:
if ((color->stage[i].op[j].param1 == TEXEL0) &&
((color->stage[i].op[j].param2 != TEXEL0) && (color->stage[i].op[j].param2 != TEXEL0_ALPHA) &&
(color->stage[i].op[j].param2 != TEXEL1) && (color->stage[i].op[j].param2 != TEXEL1_ALPHA)) &&
(color->stage[i].op[j].param3 == TEXEL0_ALPHA))
{
m_mode = GL_DECAL;
m_fragment.color = color->stage[i].op[j].param2;
m_usesT0 = TRUE;
m_usesT1 = FALSE;
}
else if ((color->stage[i].op[j].param1 == TEXEL0) &&
((color->stage[i].op[j].param2 != TEXEL0) && (color->stage[i].op[j].param2 != TEXEL0_ALPHA) &&
(color->stage[i].op[j].param2 != TEXEL1) && (color->stage[i].op[j].param2 != TEXEL1_ALPHA)) &&
(color->stage[i].op[j].param3 == TEXEL0_ALPHA))
{
m_mode = GL_DECAL;
m_fragment.color = color->stage[i].op[j].param2;
m_usesT0 = FALSE;
m_usesT1 = TRUE;
}
break;
}
}
}
}
void TexEnv::Set()
{
combiner.usesT0 = m_usesT0;
combiner.usesT1 = m_usesT1;
combiner.usesNoise = FALSE;
combiner.vertex.color = m_fragment.color;
combiner.vertex.secondaryColor = COMBINED;
combiner.vertex.alpha = m_fragment.alpha;
// Shouldn't ever happen, but who knows?
if (OGL.ARB_multitexture)
glActiveTextureARB( GL_TEXTURE0_ARB );
if (m_usesT0 || m_usesT1)
glEnable( GL_TEXTURE_2D );
else
glDisable( GL_TEXTURE_2D );
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_mode );
}