rasterize: simplify handling of non-textured polys: it seems that everything is logical if the sampler returns opaque white and everything else proceeds as normal.
This commit is contained in:
parent
ef767f03c3
commit
f810403c92
|
@ -73,6 +73,9 @@
|
||||||
//produce a 32bpp color from a DS RGB16
|
//produce a 32bpp color from a DS RGB16
|
||||||
#define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3))
|
#define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3))
|
||||||
|
|
||||||
|
//produce a 32bpp color from a ds RGB15, using a table
|
||||||
|
#define RGB15TO32_NOALPHA(col) ( color_15bit_to_24bit[col&0x7FFF] )
|
||||||
|
|
||||||
//produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table
|
//produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table
|
||||||
#define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[col&0x7FFF] )
|
#define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[col&0x7FFF] )
|
||||||
|
|
||||||
|
|
|
@ -365,6 +365,7 @@ public:
|
||||||
{
|
{
|
||||||
Sampler() {}
|
Sampler() {}
|
||||||
|
|
||||||
|
bool enabled;
|
||||||
int width, height;
|
int width, height;
|
||||||
int wmask, hmask;
|
int wmask, hmask;
|
||||||
int wrap;
|
int wrap;
|
||||||
|
@ -379,6 +380,7 @@ public:
|
||||||
wmask = width-1;
|
wmask = width-1;
|
||||||
hmask = height-1;
|
hmask = height-1;
|
||||||
wrap = (texParam>>16)&0xF;
|
wrap = (texParam>>16)&0xF;
|
||||||
|
enabled = gfx3d.renderState.enableTexturing && (texFormat!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCEINLINE void clamp(int &val, const int size, const int sizemask){
|
FORCEINLINE void clamp(int &val, const int size, const int sizemask){
|
||||||
|
@ -430,6 +432,9 @@ public:
|
||||||
|
|
||||||
FORCEINLINE FragmentColor sample(float u, float v)
|
FORCEINLINE FragmentColor sample(float u, float v)
|
||||||
{
|
{
|
||||||
|
static FragmentColor white = MakeFragmentColor(63,63,63,31);
|
||||||
|
if(!sampler.enabled) return white;
|
||||||
|
|
||||||
//finally, we can use floor here. but, it is slower than we want.
|
//finally, we can use floor here. but, it is slower than we want.
|
||||||
//the best solution is probably to wait until the pipeline is full of fixed point
|
//the best solution is probably to wait until the pipeline is full of fixed point
|
||||||
s32 iu = s32floor(u);
|
s32 iu = s32floor(u);
|
||||||
|
@ -491,33 +496,24 @@ public:
|
||||||
v = shader.invv*shader.w;
|
v = shader.invv*shader.w;
|
||||||
texColor = sample(u,v);
|
texColor = sample(u,v);
|
||||||
FragmentColor toonColor = engine->toonTable[shader.materialColor.r>>1];
|
FragmentColor toonColor = engine->toonTable[shader.materialColor.r>>1];
|
||||||
if(sampler.texFormat == 0)
|
|
||||||
|
if(gfx3d.renderState.shading == GFX3D_State::HIGHLIGHT)
|
||||||
{
|
{
|
||||||
//if no texture is set then we dont need to modulate texture with toon
|
dst.r = modulate_table[texColor.r][shader.materialColor.r];
|
||||||
//but rather just use toon directly
|
dst.g = modulate_table[texColor.g][shader.materialColor.r];
|
||||||
dst = toonColor;
|
dst.b = modulate_table[texColor.b][shader.materialColor.r];
|
||||||
dst.a = shader.materialColor.a;
|
dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;
|
||||||
|
|
||||||
|
dst.r = min<u8>(63, (dst.r + toonColor.r));
|
||||||
|
dst.g = min<u8>(63, (dst.g + toonColor.g));
|
||||||
|
dst.b = min<u8>(63, (dst.b + toonColor.b));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(gfx3d.renderState.shading == GFX3D_State::HIGHLIGHT)
|
dst.r = modulate_table[texColor.r][toonColor.r];
|
||||||
{
|
dst.g = modulate_table[texColor.g][toonColor.g];
|
||||||
dst.r = modulate_table[texColor.r][shader.materialColor.r];
|
dst.b = modulate_table[texColor.b][toonColor.b];
|
||||||
dst.g = modulate_table[texColor.g][shader.materialColor.r];
|
dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;
|
||||||
dst.b = modulate_table[texColor.b][shader.materialColor.r];
|
|
||||||
dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;
|
|
||||||
|
|
||||||
dst.r = min<u8>(63, (dst.r + toonColor.r));
|
|
||||||
dst.g = min<u8>(63, (dst.g + toonColor.g));
|
|
||||||
dst.b = min<u8>(63, (dst.b + toonColor.b));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dst.r = modulate_table[texColor.r][toonColor.r];
|
|
||||||
dst.g = modulate_table[texColor.g][toonColor.g];
|
|
||||||
dst.b = modulate_table[texColor.b][toonColor.b];
|
|
||||||
dst.a = modulate_table[GFX3D_5TO6(texColor.a)][GFX3D_5TO6(shader.materialColor.a)]>>1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -526,20 +522,12 @@ public:
|
||||||
//is this right? only with the material color?
|
//is this right? only with the material color?
|
||||||
dst = shader.materialColor;
|
dst = shader.materialColor;
|
||||||
break;
|
break;
|
||||||
case 4: //our own special mode which only uses the material color (for when texturing is disabled)
|
|
||||||
dst = shader.materialColor;
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupShader(u32 polyattr)
|
void setupShader(u32 polyattr)
|
||||||
{
|
{
|
||||||
shader.mode = (polyattr>>4)&0x3;
|
shader.mode = (polyattr>>4)&0x3;
|
||||||
//if there is no texture set, then set to the mode which doesnt even use a texture
|
|
||||||
//(no texture makes sense for toon/highlight mode)
|
|
||||||
if(sampler.texFormat == 0 && (shader.mode == 0 || shader.mode == 1))
|
|
||||||
shader.mode = 4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCEINLINE void pixel(int adr,float r, float g, float b, float invu, float invv, float w, float z)
|
FORCEINLINE void pixel(int adr,float r, float g, float b, float invu, float invv, float w, float z)
|
||||||
|
@ -1157,13 +1145,14 @@ void SoftRasterizerEngine::updateToonTable()
|
||||||
//convert the toon colors
|
//convert the toon colors
|
||||||
for(int i=0;i<32;i++) {
|
for(int i=0;i<32;i++) {
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
u32 u32temp = RGB15TO32(gfx3d.renderState.u16ToonTable[i]);
|
u32 u32temp = RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i]);
|
||||||
toonTable[i].r = (u32temp >> 2) & 0x3F;
|
toonTable[i].r = (u32temp >> 2) & 0x3F;
|
||||||
toonTable[i].g = (u32temp >> 10) & 0x3F;
|
toonTable[i].g = (u32temp >> 10) & 0x3F;
|
||||||
toonTable[i].b = (u32temp >> 18) & 0x3F;
|
toonTable[i].b = (u32temp >> 18) & 0x3F;
|
||||||
#else
|
#else
|
||||||
toonTable[i].color = (RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i])>>2)&0x3F3F3F3F;
|
toonTable[i].color = (RGB15TO32_NOALPHA(gfx3d.renderState.u16ToonTable[i])>>2)&0x3F3F3F3F;
|
||||||
#endif
|
#endif
|
||||||
|
//printf("%d %d %d %d\n",toonTable[i].r,toonTable[i].g,toonTable[i].b,toonTable[i].a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,13 @@ union FragmentColor {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline FragmentColor MakeFragmentColor(u8 r, u8 g,u8 b,u8 a)
|
||||||
|
{
|
||||||
|
FragmentColor ret;
|
||||||
|
ret.r = r; ret.g = g; ret.b = b; ret.a = a;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
struct Fragment
|
struct Fragment
|
||||||
{
|
{
|
||||||
u32 depth;
|
u32 depth;
|
||||||
|
|
Loading…
Reference in New Issue