161 lines
4.5 KiB
C++
161 lines
4.5 KiB
C++
|
//#include <glh_extensions.h>
|
||
|
#include "../glNV.h"
|
||
|
|
||
|
#include "rc1.0_final.h"
|
||
|
#include "nvparse_errors.h"
|
||
|
#include "nvparse_externs.h"
|
||
|
|
||
|
void FinalRgbFunctionStruct::ZeroOut()
|
||
|
{
|
||
|
RegisterEnum zero;
|
||
|
zero.word = RCP_ZERO;
|
||
|
a.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
b.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
c.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
d.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
}
|
||
|
|
||
|
void FinalAlphaFunctionStruct::ZeroOut()
|
||
|
{
|
||
|
RegisterEnum zero;
|
||
|
zero.word = RCP_ZERO;
|
||
|
g.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
}
|
||
|
|
||
|
void FinalProductStruct::ZeroOut()
|
||
|
{
|
||
|
RegisterEnum zero;
|
||
|
zero.word = RCP_ZERO;
|
||
|
e.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
f.Init(zero, GL_UNSIGNED_IDENTITY_NV);
|
||
|
}
|
||
|
void FinalCombinerStruct::Validate()
|
||
|
{
|
||
|
if (hasProduct &&
|
||
|
(GL_E_TIMES_F_NV == product.e.reg.bits.name ||
|
||
|
GL_SPARE0_PLUS_SECONDARY_COLOR_NV == product.e.reg.bits.name ||
|
||
|
GL_DISCARD_NV == product.e.reg.bits.name ||
|
||
|
GL_E_TIMES_F_NV == product.f.reg.bits.name ||
|
||
|
GL_SPARE0_PLUS_SECONDARY_COLOR_NV == product.f.reg.bits.name ||
|
||
|
GL_DISCARD_NV == product.f.reg.bits.name))
|
||
|
errors.set("invalid input register for final_product");
|
||
|
|
||
|
if (hasProduct &&
|
||
|
(RCP_BLUE == product.e.reg.bits.channel ||
|
||
|
RCP_BLUE == product.f.reg.bits.channel))
|
||
|
errors.set("blue register used in final_product");
|
||
|
|
||
|
if (GL_E_TIMES_F_NV == alpha.g.reg.bits.name ||
|
||
|
GL_SPARE0_PLUS_SECONDARY_COLOR_NV == alpha.g.reg.bits.name ||
|
||
|
GL_DISCARD_NV == alpha.g.reg.bits.name)
|
||
|
errors.set("invalid input register for final alpha");
|
||
|
|
||
|
if (RCP_RGB == alpha.g.reg.bits.channel)
|
||
|
errors.set("rgb register used in final alpha");
|
||
|
|
||
|
if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name &&
|
||
|
GL_SPARE0_PLUS_SECONDARY_COLOR_NV != rgb.b.reg.bits.name &&
|
||
|
GL_ZERO == rgb.c.reg.bits.name && GL_UNSIGNED_IDENTITY_NV == rgb.c.map)
|
||
|
{
|
||
|
MappedRegisterStruct temp;
|
||
|
temp = rgb.a;
|
||
|
rgb.a = rgb.b;
|
||
|
rgb.b = temp;
|
||
|
}
|
||
|
|
||
|
if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name &&
|
||
|
GL_ZERO == rgb.b.reg.bits.name && GL_UNSIGNED_INVERT_NV == rgb.b.map &&
|
||
|
GL_ZERO == rgb.c.reg.bits.name && GL_UNSIGNED_IDENTITY_NV == rgb.c.map &&
|
||
|
GL_SPARE0_PLUS_SECONDARY_COLOR_NV != rgb.d.reg.bits.name)
|
||
|
{
|
||
|
MappedRegisterStruct temp;
|
||
|
temp = rgb.a;
|
||
|
rgb.a = rgb.d;
|
||
|
rgb.d = temp;
|
||
|
}
|
||
|
|
||
|
if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name ||
|
||
|
GL_DISCARD_NV == rgb.a.reg.bits.name ||
|
||
|
GL_DISCARD_NV == rgb.b.reg.bits.name ||
|
||
|
GL_DISCARD_NV == rgb.c.reg.bits.name ||
|
||
|
GL_DISCARD_NV == rgb.d.reg.bits.name)
|
||
|
errors.set("invalid input register for final rgb");
|
||
|
|
||
|
if (RCP_BLUE == rgb.a.reg.bits.channel ||
|
||
|
RCP_BLUE == rgb.b.reg.bits.channel ||
|
||
|
RCP_BLUE == rgb.c.reg.bits.channel ||
|
||
|
RCP_BLUE == rgb.d.reg.bits.channel)
|
||
|
errors.set("blue register used in final rgb");
|
||
|
|
||
|
if ((GL_E_TIMES_F_NV == rgb.a.reg.bits.name ||
|
||
|
GL_E_TIMES_F_NV == rgb.b.reg.bits.name ||
|
||
|
GL_E_TIMES_F_NV == rgb.c.reg.bits.name ||
|
||
|
GL_E_TIMES_F_NV == rgb.d.reg.bits.name) && !hasProduct)
|
||
|
errors.set("final_product used but not set");
|
||
|
|
||
|
if (RCP_NONE == rgb.a.reg.bits.channel)
|
||
|
rgb.a.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == rgb.b.reg.bits.channel)
|
||
|
rgb.b.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == rgb.c.reg.bits.channel)
|
||
|
rgb.c.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == rgb.d.reg.bits.channel)
|
||
|
rgb.d.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == product.e.reg.bits.channel)
|
||
|
product.e.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == product.f.reg.bits.channel)
|
||
|
product.f.reg.bits.channel = RCP_RGB;
|
||
|
if (RCP_NONE == alpha.g.reg.bits.channel)
|
||
|
alpha.g.reg.bits.channel = RCP_ALPHA;
|
||
|
}
|
||
|
|
||
|
void FinalCombinerStruct::Invoke()
|
||
|
{
|
||
|
if(clamp)
|
||
|
qglCombinerParameteriNV(GL_COLOR_SUM_CLAMP_NV, GL_TRUE);
|
||
|
else
|
||
|
qglCombinerParameteriNV(GL_COLOR_SUM_CLAMP_NV, GL_FALSE);
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_A_NV,
|
||
|
rgb.a.reg.bits.name,
|
||
|
rgb.a.map,
|
||
|
MAP_CHANNEL(rgb.a.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_B_NV,
|
||
|
rgb.b.reg.bits.name,
|
||
|
rgb.b.map,
|
||
|
MAP_CHANNEL(rgb.b.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_C_NV,
|
||
|
rgb.c.reg.bits.name,
|
||
|
rgb.c.map,
|
||
|
MAP_CHANNEL(rgb.c.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_D_NV,
|
||
|
rgb.d.reg.bits.name,
|
||
|
rgb.d.map,
|
||
|
MAP_CHANNEL(rgb.d.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_E_NV,
|
||
|
product.e.reg.bits.name,
|
||
|
product.e.map,
|
||
|
MAP_CHANNEL(product.e.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_F_NV,
|
||
|
product.f.reg.bits.name,
|
||
|
product.f.map,
|
||
|
MAP_CHANNEL(product.f.reg.bits.channel));
|
||
|
|
||
|
qglFinalCombinerInputNV(
|
||
|
GL_VARIABLE_G_NV,
|
||
|
alpha.g.reg.bits.name,
|
||
|
alpha.g.map,
|
||
|
MAP_CHANNEL(alpha.g.reg.bits.channel));
|
||
|
}
|