mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
Work on making blending and combining use color_t instead of UINT8 pointesr
This commit is contained in:
parent
66fdd28b83
commit
9fe201b57c
@ -26,6 +26,7 @@ TODO:
|
|||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "video/n64.h"
|
#include "video/n64.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#define LOG_RDP_EXECUTION 0
|
#define LOG_RDP_EXECUTION 0
|
||||||
|
|
||||||
@ -462,7 +463,7 @@ void n64_rdp::set_subb_input_rgb(UINT8** input_r, UINT8** input_g, UINT8** input
|
|||||||
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
|
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
|
||||||
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
|
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
|
||||||
case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n");
|
case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n");
|
||||||
case 7: *input_r = (UINT8*)&m_k4; *input_g = (UINT8*)&m_k4; *input_b = (UINT8*)&m_k4; break;
|
case 7: *input_r = &userdata->m_k4.i.r; *input_g = &userdata->m_k4.i.g; *input_b = &userdata->m_k4.i.b; break;
|
||||||
case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
|
case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15:
|
||||||
{
|
{
|
||||||
*input_r = &m_zero.i.r; *input_g = &m_zero.i.g; *input_b = &m_zero.i.b; break;
|
*input_r = &m_zero.i.r; *input_g = &m_zero.i.g; *input_b = &m_zero.i.b; break;
|
||||||
@ -481,15 +482,15 @@ void n64_rdp::set_mul_input_rgb(UINT8** input_r, UINT8** input_g, UINT8** input_
|
|||||||
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
|
case 4: *input_r = &userdata->m_shade_color.i.r; *input_g = &userdata->m_shade_color.i.g; *input_b = &userdata->m_shade_color.i.b; break;
|
||||||
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
|
case 5: *input_r = &userdata->m_env_color.i.r; *input_g = &userdata->m_env_color.i.g; *input_b = &userdata->m_env_color.i.b; break;
|
||||||
case 6: *input_r = &userdata->m_key_scale.i.r; *input_g = &userdata->m_key_scale.i.g; *input_b = &userdata->m_key_scale.i.b; break;
|
case 6: *input_r = &userdata->m_key_scale.i.r; *input_g = &userdata->m_key_scale.i.g; *input_b = &userdata->m_key_scale.i.b; break;
|
||||||
case 7: *input_r = &userdata->m_combined_color.i.a; *input_g = &userdata->m_combined_color.i.a; *input_b = &userdata->m_combined_color.i.a; break;
|
case 7: *input_r = &userdata->m_combined_alpha.i.r; *input_g = &userdata->m_combined_alpha.i.g; *input_b = &userdata->m_combined_alpha.i.b; break;
|
||||||
case 8: *input_r = &userdata->m_texel0_color.i.a; *input_g = &userdata->m_texel0_color.i.a; *input_b = &userdata->m_texel0_color.i.a; break;
|
case 8: *input_r = &userdata->m_texel0_alpha.i.r; *input_g = &userdata->m_texel0_alpha.i.g; *input_b = &userdata->m_texel0_alpha.i.b; break;
|
||||||
case 9: *input_r = &userdata->m_texel1_color.i.a; *input_g = &userdata->m_texel1_color.i.a; *input_b = &userdata->m_texel1_color.i.a; break;
|
case 9: *input_r = &userdata->m_texel1_alpha.i.r; *input_g = &userdata->m_texel1_alpha.i.g; *input_b = &userdata->m_texel1_alpha.i.b; break;
|
||||||
case 10: *input_r = &userdata->m_prim_color.i.a; *input_g = &userdata->m_prim_color.i.a; *input_b = &userdata->m_prim_color.i.a; break;
|
case 10: *input_r = &userdata->m_prim_alpha.i.r; *input_g = &userdata->m_prim_alpha.i.g; *input_b = &userdata->m_prim_alpha.i.b; break;
|
||||||
case 11: *input_r = &userdata->m_shade_color.i.a; *input_g = &userdata->m_shade_color.i.a; *input_b = &userdata->m_shade_color.i.a; break;
|
case 11: *input_r = &userdata->m_shade_alpha.i.r; *input_g = &userdata->m_shade_alpha.i.g; *input_b = &userdata->m_shade_alpha.i.b; break;
|
||||||
case 12: *input_r = &userdata->m_env_color.i.a; *input_g = &userdata->m_env_color.i.a; *input_b = &userdata->m_env_color.i.a; break;
|
case 12: *input_r = &userdata->m_env_alpha.i.r; *input_g = &userdata->m_env_alpha.i.g; *input_b = &userdata->m_env_alpha.i.b; break;
|
||||||
case 13: *input_r = &userdata->m_lod_fraction; *input_g = &userdata->m_lod_fraction; *input_b = &userdata->m_lod_fraction; break;
|
case 13: *input_r = &userdata->m_lod_fraction.i.r; *input_g = &userdata->m_lod_fraction.i.g; *input_b = &userdata->m_lod_fraction.i.b; break;
|
||||||
case 14: *input_r = &userdata->m_prim_lod_fraction; *input_g = &userdata->m_prim_lod_fraction; *input_b = &userdata->m_prim_lod_fraction; break;
|
case 14: *input_r = &userdata->m_prim_lod_fraction.i.r; *input_g = &userdata->m_prim_lod_fraction.i.g; *input_b = &userdata->m_prim_lod_fraction.i.b; break;
|
||||||
case 15: *input_r = (UINT8*)&m_k5; *input_g = (UINT8*)&m_k5; *input_b = (UINT8*)&m_k5; break;
|
case 15: *input_r = &userdata->m_k5.i.r; *input_g = &userdata->m_k5.i.g; *input_b = &userdata->m_k5.i.b; break;
|
||||||
case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
|
case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
|
||||||
case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
|
case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
|
||||||
{
|
{
|
||||||
@ -532,61 +533,36 @@ void n64_rdp::set_mul_input_alpha(UINT8** input, INT32 code, rdp_span_aux* userd
|
|||||||
{
|
{
|
||||||
switch (code & 0x7)
|
switch (code & 0x7)
|
||||||
{
|
{
|
||||||
case 0: *input = &userdata->m_lod_fraction; break;
|
case 0: *input = &userdata->m_lod_fraction.i.a; break;
|
||||||
case 1: *input = &userdata->m_texel0_color.i.a; break;
|
case 1: *input = &userdata->m_texel0_color.i.a; break;
|
||||||
case 2: *input = &userdata->m_texel1_color.i.a; break;
|
case 2: *input = &userdata->m_texel1_color.i.a; break;
|
||||||
case 3: *input = &userdata->m_prim_color.i.a; break;
|
case 3: *input = &userdata->m_prim_color.i.a; break;
|
||||||
case 4: *input = &userdata->m_shade_color.i.a; break;
|
case 4: *input = &userdata->m_shade_color.i.a; break;
|
||||||
case 5: *input = &userdata->m_env_color.i.a; break;
|
case 5: *input = &userdata->m_env_color.i.a; break;
|
||||||
case 6: *input = &userdata->m_prim_lod_fraction; break;
|
case 6: *input = &userdata->m_prim_lod_fraction.i.a; break;
|
||||||
case 7: *input = &m_zero.i.a; break;
|
case 7: *input = &m_zero.i.a; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::set_blender_input(INT32 cycle, INT32 which, UINT8** input_r, UINT8** input_g, UINT8** input_b, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata)
|
void n64_rdp::set_blender_input(INT32 cycle, INT32 which, color_t** input_rgb, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata)
|
||||||
{
|
{
|
||||||
switch (a & 0x3)
|
switch (a & 0x3)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
*input_rgb = cycle == 0 ? &userdata->m_pixel_color : &userdata->m_blended_pixel_color;
|
||||||
if (cycle == 0)
|
|
||||||
{
|
|
||||||
*input_r = &userdata->m_pixel_color.i.r;
|
|
||||||
*input_g = &userdata->m_pixel_color.i.g;
|
|
||||||
*input_b = &userdata->m_pixel_color.i.b;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*input_r = &userdata->m_blended_pixel_color.i.r;
|
|
||||||
*input_g = &userdata->m_blended_pixel_color.i.g;
|
|
||||||
*input_b = &userdata->m_blended_pixel_color.i.b;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
*input_rgb = &userdata->m_memory_color;
|
||||||
*input_r = &userdata->m_memory_color.i.r;
|
|
||||||
*input_g = &userdata->m_memory_color.i.g;
|
|
||||||
*input_b = &userdata->m_memory_color.i.b;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
*input_rgb = &userdata->m_blend_color;
|
||||||
*input_r = &userdata->m_blend_color.i.r;
|
|
||||||
*input_g = &userdata->m_blend_color.i.g;
|
|
||||||
*input_b = &userdata->m_blend_color.i.b;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
*input_rgb = &userdata->m_fog_color;
|
||||||
*input_r = &userdata->m_fog_color.i.r;
|
|
||||||
*input_g = &userdata->m_fog_color.i.g;
|
|
||||||
*input_b = &userdata->m_fog_color.i.b;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (which == 0)
|
if (which == 0)
|
||||||
@ -2067,287 +2043,147 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
|
|||||||
rdp_poly_state* object = NULL;
|
rdp_poly_state* object = NULL;
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
|
||||||
if(flip)
|
INT32* minx = flip ? &minxhx : &minxmx;
|
||||||
|
INT32* maxx = flip ? &maxxmx : &maxxhx;
|
||||||
|
INT32* startx = flip ? maxx : minx;
|
||||||
|
INT32* endx = flip ? minx : maxx;
|
||||||
|
|
||||||
|
for (INT32 k = ycur; k <= ylfar; k++)
|
||||||
{
|
{
|
||||||
for (INT32 k = ycur; k <= ylfar; k++)
|
if (k == ym)
|
||||||
{
|
{
|
||||||
if (k == ym)
|
xleft = xl & ~1;
|
||||||
|
xleft_inc = (dxldy >> 2) & ~1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const INT32 xstart = xleft >> 16;
|
||||||
|
const INT32 xend = xright >> 16;
|
||||||
|
const INT32 j = k >> 2;
|
||||||
|
const INT32 spanidx = (k - ycur) >> 2;
|
||||||
|
const INT32 spix = k & 3;
|
||||||
|
bool valid_y = !(k < yh || k >= yl);
|
||||||
|
|
||||||
|
if (spanidx >= 0 && spanidx < 2048)
|
||||||
|
{
|
||||||
|
majorxint[spix] = xend;
|
||||||
|
minorxint[spix] = xstart;
|
||||||
|
majorx[spix] = xright;
|
||||||
|
minorx[spix] = xleft;
|
||||||
|
|
||||||
|
if (spix == 0)
|
||||||
{
|
{
|
||||||
xleft = xl & ~1;
|
*maxx = 0;
|
||||||
xleft_inc = (dxldy >> 2) & ~1;
|
*minx = 0xfff;
|
||||||
}
|
}
|
||||||
|
|
||||||
const INT32 xstart = xleft >> 16; // 319
|
if (valid_y)
|
||||||
const INT32 xend = xright >> 16; // 0
|
|
||||||
const INT32 j = k >> 2;
|
|
||||||
const INT32 spanidx = (k - ycur) >> 2;
|
|
||||||
const INT32 spix = k & 3;
|
|
||||||
const bool valid_y = !(k < yh || k >= yl);
|
|
||||||
|
|
||||||
if (spanidx >= 0 && spanidx < 2048)
|
|
||||||
{
|
{
|
||||||
majorxint[spix] = xend; // 0
|
if (flip)
|
||||||
minorxint[spix] = xstart; // 319
|
|
||||||
majorx[spix] = xright; // 0x00000000
|
|
||||||
minorx[spix] = xleft; // 0x013f0000
|
|
||||||
|
|
||||||
if (spix == 0)
|
|
||||||
{
|
{
|
||||||
maxxmx = 0;
|
*maxx = std::max(xstart, *maxx);
|
||||||
minxhx = 0xfff;
|
*minx = std::min(xend, *minx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*minx = std::min(xstart, *minx);
|
||||||
|
*maxx = std::max(xend, *maxx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spix == 0)
|
||||||
|
{
|
||||||
|
if(new_object)
|
||||||
|
{
|
||||||
|
object = &object_data_alloc();
|
||||||
|
memcpy(object->m_tmem, m_tmem, 0x1000);
|
||||||
|
new_object = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valid_y)
|
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
|
||||||
|
valid = true;
|
||||||
|
m_aux_buf_ptr += sizeof(rdp_span_aux);
|
||||||
|
|
||||||
|
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
|
||||||
{
|
{
|
||||||
maxxmx = (xstart > maxxmx) ? xstart : maxxmx;
|
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
|
||||||
minxhx = (xend < minxhx) ? xend : minxhx;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spix == 0)
|
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
|
||||||
{
|
userdata->m_tmem = object->m_tmem;
|
||||||
if(new_object)
|
|
||||||
{
|
|
||||||
object = &object_data_alloc();
|
|
||||||
memcpy(object->m_tmem, m_tmem, 0x1000);
|
|
||||||
new_object = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
|
userdata->m_blend_color = m_blend_color;
|
||||||
m_aux_buf_ptr += sizeof(rdp_span_aux);
|
userdata->m_prim_color = m_prim_color;
|
||||||
|
userdata->m_env_color = m_env_color;
|
||||||
|
userdata->m_fog_color = m_fog_color;
|
||||||
|
userdata->m_blend_alpha = m_blend_alpha;
|
||||||
|
userdata->m_prim_alpha = m_prim_alpha;
|
||||||
|
userdata->m_env_alpha = m_env_alpha;
|
||||||
|
userdata->m_fog_alpha = m_fog_alpha;
|
||||||
|
userdata->m_key_scale = m_key_scale;
|
||||||
|
userdata->m_lod_fraction = m_lod_fraction;
|
||||||
|
userdata->m_prim_lod_fraction = m_prim_lod_fraction;
|
||||||
|
|
||||||
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
|
// Setup blender data for this scanline
|
||||||
{
|
set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_rgb[0], &userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata);
|
||||||
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
|
set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_rgb[0], &userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
|
||||||
}
|
set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_rgb[1], &userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
|
||||||
|
set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_rgb[1], &userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
|
||||||
|
|
||||||
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
|
// Setup color combiner data for this scanline
|
||||||
valid = true;
|
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata);
|
||||||
|
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[0], &userdata->m_color_inputs.combiner_rgbsub_b_g[0], &userdata->m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0, userdata);
|
||||||
|
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[0], &userdata->m_color_inputs.combiner_rgbmul_g[0], &userdata->m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0, userdata);
|
||||||
|
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[0], &userdata->m_color_inputs.combiner_rgbadd_g[0], &userdata->m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0, userdata);
|
||||||
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0, userdata);
|
||||||
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0, userdata);
|
||||||
|
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[0], m_combine.mul_a0, userdata);
|
||||||
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[0], m_combine.add_a0, userdata);
|
||||||
|
|
||||||
userdata->m_tmem = object->m_tmem;
|
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[1], &userdata->m_color_inputs.combiner_rgbsub_a_g[1], &userdata->m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1, userdata);
|
||||||
|
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[1], &userdata->m_color_inputs.combiner_rgbsub_b_g[1], &userdata->m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1, userdata);
|
||||||
userdata->m_blend_color = m_blend_color;
|
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[1], &userdata->m_color_inputs.combiner_rgbmul_g[1], &userdata->m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1, userdata);
|
||||||
userdata->m_prim_color = m_prim_color;
|
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[1], &userdata->m_color_inputs.combiner_rgbadd_g[1], &userdata->m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1, userdata);
|
||||||
userdata->m_env_color = m_env_color;
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1, userdata);
|
||||||
userdata->m_fog_color = m_fog_color;
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1, userdata);
|
||||||
userdata->m_key_scale = m_key_scale;
|
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[1], m_combine.mul_a1, userdata);
|
||||||
userdata->m_lod_fraction = m_lod_fraction;
|
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[1], m_combine.add_a1, userdata);
|
||||||
userdata->m_prim_lod_fraction = m_prim_lod_fraction;
|
|
||||||
|
|
||||||
// Setup blender data for this scanline
|
|
||||||
set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_r[0],
|
|
||||||
&userdata->m_color_inputs.blender1a_g[0],
|
|
||||||
&userdata->m_color_inputs.blender1a_b[0],
|
|
||||||
&userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata);
|
|
||||||
set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_r[0],
|
|
||||||
&userdata->m_color_inputs.blender2a_g[0],
|
|
||||||
&userdata->m_color_inputs.blender2a_b[0],
|
|
||||||
&userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
|
|
||||||
set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_r[1],
|
|
||||||
&userdata->m_color_inputs.blender1a_g[1],
|
|
||||||
&userdata->m_color_inputs.blender1a_b[1],
|
|
||||||
&userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
|
|
||||||
set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_r[1],
|
|
||||||
&userdata->m_color_inputs.blender2a_g[1],
|
|
||||||
&userdata->m_color_inputs.blender2a_b[1],
|
|
||||||
&userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
|
|
||||||
|
|
||||||
// Setup color combiner data for this scanline
|
|
||||||
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata);
|
|
||||||
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[0], &userdata->m_color_inputs.combiner_rgbsub_b_g[0], &userdata->m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0, userdata);
|
|
||||||
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[0], &userdata->m_color_inputs.combiner_rgbmul_g[0], &userdata->m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0, userdata);
|
|
||||||
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[0], &userdata->m_color_inputs.combiner_rgbadd_g[0], &userdata->m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0, userdata);
|
|
||||||
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[0], m_combine.mul_a0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[0], m_combine.add_a0, userdata);
|
|
||||||
|
|
||||||
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[1], &userdata->m_color_inputs.combiner_rgbsub_a_g[1], &userdata->m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1, userdata);
|
|
||||||
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[1], &userdata->m_color_inputs.combiner_rgbsub_b_g[1], &userdata->m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1, userdata);
|
|
||||||
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[1], &userdata->m_color_inputs.combiner_rgbmul_g[1], &userdata->m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1, userdata);
|
|
||||||
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[1], &userdata->m_color_inputs.combiner_rgbadd_g[1], &userdata->m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1, userdata);
|
|
||||||
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[1], m_combine.mul_a1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[1], m_combine.add_a1, userdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == 3)
|
|
||||||
{
|
|
||||||
spans[spanidx].startx = maxxmx;
|
|
||||||
spans[spanidx].stopx = minxhx;
|
|
||||||
compute_cvg_flip(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == ldflag)
|
|
||||||
{
|
|
||||||
((rdp_span_aux*)spans[spanidx].userdata)->m_unscissored_rx = xend;
|
|
||||||
xfrac = ((xright >> 8) & 0xff);
|
|
||||||
spans[spanidx].param[SPAN_R].start = ((r >> 9) << 9) + drdiff - (xfrac * drdxh);
|
|
||||||
spans[spanidx].param[SPAN_G].start = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh);
|
|
||||||
spans[spanidx].param[SPAN_B].start = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh);
|
|
||||||
spans[spanidx].param[SPAN_A].start = ((a >> 9) << 9) + dadiff - (xfrac * dadxh);
|
|
||||||
spans[spanidx].param[SPAN_S].start = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_T].start = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_W].start = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_Z].start = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spix == 3)
|
if (spix == 3)
|
||||||
{
|
{
|
||||||
r += drde;
|
spans[spanidx].startx = *startx;
|
||||||
g += dgde;
|
spans[spanidx].stopx = *endx;
|
||||||
b += dbde;
|
((this)->*(m_compute_cvg[flip]))(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
|
||||||
a += dade;
|
|
||||||
s += dsde;
|
|
||||||
t += dtde;
|
|
||||||
w += dwde;
|
|
||||||
z += dzde;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
xleft += xleft_inc;
|
if (spix == ldflag)
|
||||||
xright += xright_inc;
|
{
|
||||||
|
((rdp_span_aux*)spans[spanidx].userdata)->m_unscissored_rx = xend;
|
||||||
|
xfrac = ((xright >> 8) & 0xff);
|
||||||
|
spans[spanidx].param[SPAN_R].start = ((r >> 9) << 9) + drdiff - (xfrac * drdxh);
|
||||||
|
spans[spanidx].param[SPAN_G].start = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh);
|
||||||
|
spans[spanidx].param[SPAN_B].start = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh);
|
||||||
|
spans[spanidx].param[SPAN_A].start = ((a >> 9) << 9) + dadiff - (xfrac * dadxh);
|
||||||
|
spans[spanidx].param[SPAN_S].start = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f;
|
||||||
|
spans[spanidx].param[SPAN_T].start = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f;
|
||||||
|
spans[spanidx].param[SPAN_W].start = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f;
|
||||||
|
spans[spanidx].param[SPAN_Z].start = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
if (spix == 3)
|
||||||
{
|
|
||||||
for (INT32 k = ycur; k <= ylfar; k++)
|
|
||||||
{
|
{
|
||||||
if (k == ym)
|
r += drde;
|
||||||
{
|
g += dgde;
|
||||||
xleft = xl & ~1;
|
b += dbde;
|
||||||
xleft_inc = (dxldy >> 2) & ~1;
|
a += dade;
|
||||||
}
|
s += dsde;
|
||||||
|
t += dtde;
|
||||||
const INT32 xstart = xleft >> 16;
|
w += dwde;
|
||||||
const INT32 xend = xright >> 16;
|
z += dzde;
|
||||||
const INT32 j = k >> 2;
|
|
||||||
const INT32 spanidx = j - (ycur >> 2);
|
|
||||||
const INT32 spix = k & 3;
|
|
||||||
bool valid_y = !(k < yh || k >= yl);
|
|
||||||
|
|
||||||
if (k >= 0 && k < 0x1000)
|
|
||||||
{
|
|
||||||
majorxint[spix] = xend;
|
|
||||||
minorxint[spix] = xstart;
|
|
||||||
majorx[spix] = xright;
|
|
||||||
minorx[spix] = xleft;
|
|
||||||
|
|
||||||
if (spix == 0)
|
|
||||||
{
|
|
||||||
maxxhx = 0;
|
|
||||||
minxmx = 0xfff;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (valid_y)
|
|
||||||
{
|
|
||||||
minxmx = (xstart < minxmx) ? xstart : minxmx;
|
|
||||||
maxxhx = (xend > maxxhx) ? xend : maxxhx;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == 0)
|
|
||||||
{
|
|
||||||
if(new_object)
|
|
||||||
{
|
|
||||||
object = &object_data_alloc();
|
|
||||||
memcpy(object->m_tmem, m_tmem, 0x1000);
|
|
||||||
new_object = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
spans[spanidx].userdata = (void*)((UINT8*)m_aux_buf + m_aux_buf_ptr);
|
|
||||||
valid = true;
|
|
||||||
m_aux_buf_ptr += sizeof(rdp_span_aux);
|
|
||||||
|
|
||||||
if(m_aux_buf_ptr >= EXTENT_AUX_COUNT)
|
|
||||||
{
|
|
||||||
fatalerror("n64_rdp::draw_triangle: span aux buffer overflow\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
rdp_span_aux* userdata = (rdp_span_aux*)spans[spanidx].userdata;
|
|
||||||
userdata->m_tmem = object->m_tmem;
|
|
||||||
|
|
||||||
userdata->m_blend_color = m_blend_color;
|
|
||||||
userdata->m_prim_color = m_prim_color;
|
|
||||||
userdata->m_env_color = m_env_color;
|
|
||||||
userdata->m_fog_color = m_fog_color;
|
|
||||||
userdata->m_key_scale = m_key_scale;
|
|
||||||
userdata->m_lod_fraction = m_lod_fraction;
|
|
||||||
userdata->m_prim_lod_fraction = m_prim_lod_fraction;
|
|
||||||
|
|
||||||
// Setup blender data for this scanline
|
|
||||||
set_blender_input(0, 0, &userdata->m_color_inputs.blender1a_r[0],
|
|
||||||
&userdata->m_color_inputs.blender1a_g[0],
|
|
||||||
&userdata->m_color_inputs.blender1a_b[0],
|
|
||||||
&userdata->m_color_inputs.blender1b_a[0], m_other_modes.blend_m1a_0, m_other_modes.blend_m1b_0, userdata);
|
|
||||||
set_blender_input(0, 1, &userdata->m_color_inputs.blender2a_r[0],
|
|
||||||
&userdata->m_color_inputs.blender2a_g[0],
|
|
||||||
&userdata->m_color_inputs.blender2a_b[0],
|
|
||||||
&userdata->m_color_inputs.blender2b_a[0], m_other_modes.blend_m2a_0, m_other_modes.blend_m2b_0, userdata);
|
|
||||||
set_blender_input(1, 0, &userdata->m_color_inputs.blender1a_r[1],
|
|
||||||
&userdata->m_color_inputs.blender1a_g[1],
|
|
||||||
&userdata->m_color_inputs.blender1a_b[1],
|
|
||||||
&userdata->m_color_inputs.blender1b_a[1], m_other_modes.blend_m1a_1, m_other_modes.blend_m1b_1, userdata);
|
|
||||||
set_blender_input(1, 1, &userdata->m_color_inputs.blender2a_r[1],
|
|
||||||
&userdata->m_color_inputs.blender2a_g[1],
|
|
||||||
&userdata->m_color_inputs.blender2a_b[1],
|
|
||||||
&userdata->m_color_inputs.blender2b_a[1], m_other_modes.blend_m2a_1, m_other_modes.blend_m2b_1, userdata);
|
|
||||||
|
|
||||||
// Setup color combiner data for this scanline
|
|
||||||
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[0], &userdata->m_color_inputs.combiner_rgbsub_a_g[0], &userdata->m_color_inputs.combiner_rgbsub_a_b[0], m_combine.sub_a_rgb0, userdata);
|
|
||||||
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[0], &userdata->m_color_inputs.combiner_rgbsub_b_g[0], &userdata->m_color_inputs.combiner_rgbsub_b_b[0], m_combine.sub_b_rgb0, userdata);
|
|
||||||
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[0], &userdata->m_color_inputs.combiner_rgbmul_g[0], &userdata->m_color_inputs.combiner_rgbmul_b[0], m_combine.mul_rgb0, userdata);
|
|
||||||
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[0], &userdata->m_color_inputs.combiner_rgbadd_g[0], &userdata->m_color_inputs.combiner_rgbadd_b[0], m_combine.add_rgb0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[0], m_combine.sub_a_a0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[0], m_combine.sub_b_a0, userdata);
|
|
||||||
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[0], m_combine.mul_a0, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[0], m_combine.add_a0, userdata);
|
|
||||||
|
|
||||||
set_suba_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_a_r[1], &userdata->m_color_inputs.combiner_rgbsub_a_g[1], &userdata->m_color_inputs.combiner_rgbsub_a_b[1], m_combine.sub_a_rgb1, userdata);
|
|
||||||
set_subb_input_rgb(&userdata->m_color_inputs.combiner_rgbsub_b_r[1], &userdata->m_color_inputs.combiner_rgbsub_b_g[1], &userdata->m_color_inputs.combiner_rgbsub_b_b[1], m_combine.sub_b_rgb1, userdata);
|
|
||||||
set_mul_input_rgb(&userdata->m_color_inputs.combiner_rgbmul_r[1], &userdata->m_color_inputs.combiner_rgbmul_g[1], &userdata->m_color_inputs.combiner_rgbmul_b[1], m_combine.mul_rgb1, userdata);
|
|
||||||
set_add_input_rgb(&userdata->m_color_inputs.combiner_rgbadd_r[1], &userdata->m_color_inputs.combiner_rgbadd_g[1], &userdata->m_color_inputs.combiner_rgbadd_b[1], m_combine.add_rgb1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_a[1], m_combine.sub_a_a1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphasub_b[1], m_combine.sub_b_a1, userdata);
|
|
||||||
set_mul_input_alpha(&userdata->m_color_inputs.combiner_alphamul[1], m_combine.mul_a1, userdata);
|
|
||||||
set_sub_input_alpha(&userdata->m_color_inputs.combiner_alphaadd[1], m_combine.add_a1, userdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == 3)
|
|
||||||
{
|
|
||||||
spans[spanidx].startx = minxmx;
|
|
||||||
spans[spanidx].stopx = maxxhx;
|
|
||||||
compute_cvg_noflip(spans, majorx, minorx, majorxint, minorxint, j, yh, yl, ycur >> 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == ldflag)
|
|
||||||
{
|
|
||||||
((rdp_span_aux*)spans[spanidx].userdata)->m_unscissored_rx = xend;
|
|
||||||
xfrac = ((xright >> 8) & 0xff);
|
|
||||||
spans[spanidx].param[SPAN_R].start = ((r >> 9) << 9) + drdiff - (xfrac * drdxh);
|
|
||||||
spans[spanidx].param[SPAN_G].start = ((g >> 9) << 9) + dgdiff - (xfrac * dgdxh);
|
|
||||||
spans[spanidx].param[SPAN_B].start = ((b >> 9) << 9) + dbdiff - (xfrac * dbdxh);
|
|
||||||
spans[spanidx].param[SPAN_A].start = ((a >> 9) << 9) + dadiff - (xfrac * dadxh);
|
|
||||||
spans[spanidx].param[SPAN_S].start = (((s >> 9) << 9) + dsdiff - (xfrac * dsdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_T].start = (((t >> 9) << 9) + dtdiff - (xfrac * dtdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_W].start = (((w >> 9) << 9) + dwdiff - (xfrac * dwdxh)) & ~0x1f;
|
|
||||||
spans[spanidx].param[SPAN_Z].start = ((z >> 9) << 9) + dzdiff - (xfrac * dzdxh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spix == 3)
|
|
||||||
{
|
|
||||||
r += drde;
|
|
||||||
g += dgde;
|
|
||||||
b += dbde;
|
|
||||||
a += dade;
|
|
||||||
s += dsde;
|
|
||||||
t += dtde;
|
|
||||||
w += dwde;
|
|
||||||
z += dzde;
|
|
||||||
}
|
|
||||||
xleft += xleft_inc;
|
|
||||||
xright += xright_inc;
|
|
||||||
}
|
}
|
||||||
|
xleft += xleft_inc;
|
||||||
|
xright += xright_inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!new_object && valid)
|
if(!new_object && valid)
|
||||||
@ -2577,7 +2413,10 @@ void n64_rdp::cmd_set_convert(UINT32 w1, UINT32 w2)
|
|||||||
k3 = ((w2 >> 26) & 1) ? (-(0x100 - k3)) : k3;
|
k3 = ((w2 >> 26) & 1) ? (-(0x100 - k3)) : k3;
|
||||||
k4 = ((w2 >> 17) & 1) ? (-(0x100 - k4)) : k4;
|
k4 = ((w2 >> 17) & 1) ? (-(0x100 - k4)) : k4;
|
||||||
k5 = ((w2 >> 8) & 1) ? (-(0x100 - k5)) : k5;
|
k5 = ((w2 >> 8) & 1) ? (-(0x100 - k5)) : k5;
|
||||||
set_yuv_factors(k0, k1, k2, k3, k4, k5);
|
|
||||||
|
UINT32 repl_k4 = (k4 & 0xff) * 0x01010101;
|
||||||
|
UINT32 repl_k5 = (k5 & 0xff) * 0x01010101;
|
||||||
|
set_yuv_factors(k0, k1, k2, k3, repl_k4, repl_k5);
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::cmd_set_scissor(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_scissor(UINT32 w1, UINT32 w2)
|
||||||
@ -3061,23 +2900,27 @@ void n64_rdp::cmd_fill_rect(UINT32 w1, UINT32 w2)
|
|||||||
void n64_rdp::cmd_set_fog_color(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_fog_color(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
m_fog_color.c = w2;
|
m_fog_color.c = w2;
|
||||||
|
m_fog_alpha.c = m_fog_color.i.a * 0x01010101;
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::cmd_set_blend_color(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_blend_color(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
m_blend_color.c = w2;
|
m_blend_color.c = w2;
|
||||||
|
m_blend_alpha.c = m_blend_color.i.a * 0x01010101;
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::cmd_set_prim_color(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_prim_color(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
m_misc_state.m_min_level = (w1 >> 8) & 0x1f;
|
m_misc_state.m_min_level = (w1 >> 8) & 0x1f;
|
||||||
m_prim_lod_fraction = w1 & 0xff;
|
m_prim_lod_fraction.c = (w1 & 0xff) * 0x01010101;
|
||||||
m_prim_color.c = w2;
|
m_prim_color.c = w2;
|
||||||
|
m_prim_alpha.c = m_prim_color.i.a * 0x01010101;
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::cmd_set_env_color(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_env_color(UINT32 w1, UINT32 w2)
|
||||||
{
|
{
|
||||||
m_env_color.c = w2;
|
m_env_color.c = w2;
|
||||||
|
m_env_alpha.c = m_env_color.i.a * 0x01010101;
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_rdp::cmd_set_combine(UINT32 w1, UINT32 w2)
|
void n64_rdp::cmd_set_combine(UINT32 w1, UINT32 w2)
|
||||||
@ -3286,7 +3129,7 @@ n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 320
|
|||||||
|
|
||||||
//memset(m_hidden_bits, 3, 8388608);
|
//memset(m_hidden_bits, 3, 8388608);
|
||||||
|
|
||||||
m_prim_lod_fraction = 0;
|
m_prim_lod_fraction.c = 0;
|
||||||
|
|
||||||
for (INT32 i = 0; i < 256; i++)
|
for (INT32 i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
@ -3337,6 +3180,9 @@ n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 320
|
|||||||
{
|
{
|
||||||
m_dzpix_normalize[i] = (UINT16)normalize_dzpix(i & 0xffff);
|
m_dzpix_normalize[i] = (UINT16)normalize_dzpix(i & 0xffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_compute_cvg[0] = &n64_rdp::compute_cvg_noflip;
|
||||||
|
m_compute_cvg[1] = &n64_rdp::compute_cvg_flip;
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_state::video_start()
|
void n64_state::video_start()
|
||||||
|
@ -327,13 +327,9 @@ struct color_inputs_t
|
|||||||
UINT8* combiner_alphaadd[2];
|
UINT8* combiner_alphaadd[2];
|
||||||
|
|
||||||
// blender input
|
// blender input
|
||||||
UINT8* blender1a_r[2];
|
color_t* blender1a_rgb[2];
|
||||||
UINT8* blender1a_g[2];
|
|
||||||
UINT8* blender1a_b[2];
|
|
||||||
UINT8* blender1b_a[2];
|
UINT8* blender1b_a[2];
|
||||||
UINT8* blender2a_r[2];
|
color_t* blender2a_rgb[2];
|
||||||
UINT8* blender2a_g[2];
|
|
||||||
UINT8* blender2a_b[2];
|
|
||||||
UINT8* blender2b_a[2];
|
UINT8* blender2b_a[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -346,19 +342,31 @@ struct rdp_span_aux
|
|||||||
color_t m_pixel_color;
|
color_t m_pixel_color;
|
||||||
color_t m_inv_pixel_color;
|
color_t m_inv_pixel_color;
|
||||||
color_t m_blended_pixel_color;
|
color_t m_blended_pixel_color;
|
||||||
|
|
||||||
color_t m_combined_color;
|
color_t m_combined_color;
|
||||||
|
color_t m_combined_alpha;
|
||||||
color_t m_texel0_color;
|
color_t m_texel0_color;
|
||||||
|
color_t m_texel0_alpha;
|
||||||
color_t m_texel1_color;
|
color_t m_texel1_color;
|
||||||
|
color_t m_texel1_alpha;
|
||||||
color_t m_next_texel_color;
|
color_t m_next_texel_color;
|
||||||
|
color_t m_next_texel_alpha;
|
||||||
color_t m_blend_color; /* constant blend color */
|
color_t m_blend_color; /* constant blend color */
|
||||||
|
color_t m_blend_alpha; /* constant blend alpha */
|
||||||
color_t m_prim_color; /* flat primitive color */
|
color_t m_prim_color; /* flat primitive color */
|
||||||
|
color_t m_prim_alpha; /* flat primitive alpha */
|
||||||
color_t m_env_color; /* generic color constant ('environment') */
|
color_t m_env_color; /* generic color constant ('environment') */
|
||||||
|
color_t m_env_alpha; /* generic color constant ('environment') */
|
||||||
color_t m_fog_color; /* generic color constant ('fog') */
|
color_t m_fog_color; /* generic color constant ('fog') */
|
||||||
|
color_t m_fog_alpha; /* generic color constant ('fog') */
|
||||||
color_t m_shade_color; /* gouraud-shaded color */
|
color_t m_shade_color; /* gouraud-shaded color */
|
||||||
|
color_t m_shade_alpha; /* gouraud-shaded color */
|
||||||
color_t m_key_scale; /* color-keying constant */
|
color_t m_key_scale; /* color-keying constant */
|
||||||
color_t m_noise_color; /* noise */
|
color_t m_noise_color; /* noise */
|
||||||
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */
|
color_t m_lod_fraction; /* Z-based LOD fraction for this poly */
|
||||||
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
color_t m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
||||||
|
color_t m_k4;
|
||||||
|
color_t m_k5;
|
||||||
color_inputs_t m_color_inputs;
|
color_inputs_t m_color_inputs;
|
||||||
UINT32 m_current_pix_cvg;
|
UINT32 m_current_pix_cvg;
|
||||||
UINT32 m_current_mem_cvg;
|
UINT32 m_current_mem_cvg;
|
||||||
@ -478,16 +486,14 @@ public:
|
|||||||
UINT8 get_random() { return m_misc_state.m_random_seed += 0x13; }
|
UINT8 get_random() { return m_misc_state.m_random_seed += 0x13; }
|
||||||
|
|
||||||
// YUV Factors
|
// YUV Factors
|
||||||
void set_yuv_factors(INT32 k0, INT32 k1, INT32 k2, INT32 k3, INT32 k4, INT32 k5) { m_k0 = k0; m_k1 = k1; m_k2 = k2; m_k3 = k3; m_k4 = k4; m_k5 = k5; }
|
void set_yuv_factors(INT32 k0, INT32 k1, INT32 k2, INT32 k3, INT32 k4, INT32 k5) { m_k0 = k0; m_k1 = k1; m_k2 = k2; m_k3 = k3; m_k4.c = k4; m_k5.c = k5; }
|
||||||
INT32 get_k0() const { return m_k0; }
|
INT32 get_k0() const { return m_k0; }
|
||||||
INT32 get_k1() const { return m_k1; }
|
INT32 get_k1() const { return m_k1; }
|
||||||
INT32 get_k2() const { return m_k2; }
|
INT32 get_k2() const { return m_k2; }
|
||||||
INT32 get_k3() const { return m_k3; }
|
INT32 get_k3() const { return m_k3; }
|
||||||
INT32* get_k4() { return &m_k4; }
|
|
||||||
INT32* get_k5() { return &m_k5; }
|
|
||||||
|
|
||||||
// Blender-related (move into RDP::Blender)
|
// Blender-related (move into RDP::Blender)
|
||||||
void set_blender_input(INT32 cycle, INT32 which, UINT8** input_r, UINT8** input_g, UINT8** input_b, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata);
|
void set_blender_input(INT32 cycle, INT32 which, color_t** input_rgb, UINT8** input_a, INT32 a, INT32 b, rdp_span_aux* userdata);
|
||||||
|
|
||||||
// Span rasterization
|
// Span rasterization
|
||||||
void span_draw_1cycle(INT32 scanline, const extent_t &extent, const rdp_poly_state &object, INT32 threadid);
|
void span_draw_1cycle(INT32 scanline, const extent_t &extent, const rdp_poly_state &object, INT32 threadid);
|
||||||
@ -565,12 +571,16 @@ public:
|
|||||||
|
|
||||||
// Color constants
|
// Color constants
|
||||||
color_t m_blend_color; /* constant blend color */
|
color_t m_blend_color; /* constant blend color */
|
||||||
|
color_t m_blend_alpha; /* constant blend alpha */
|
||||||
color_t m_prim_color; /* flat primitive color */
|
color_t m_prim_color; /* flat primitive color */
|
||||||
|
color_t m_prim_alpha; /* flat primitive alpha */
|
||||||
color_t m_env_color; /* generic color constant ('environment') */
|
color_t m_env_color; /* generic color constant ('environment') */
|
||||||
|
color_t m_env_alpha; /* generic alpha constant ('environment') */
|
||||||
color_t m_fog_color; /* generic color constant ('fog') */
|
color_t m_fog_color; /* generic color constant ('fog') */
|
||||||
|
color_t m_fog_alpha; /* generic alpha constant ('fog') */
|
||||||
color_t m_key_scale; /* color-keying constant */
|
color_t m_key_scale; /* color-keying constant */
|
||||||
UINT8 m_lod_fraction; /* Z-based LOD fraction for this poly */
|
color_t m_lod_fraction; /* Z-based LOD fraction for this poly */
|
||||||
UINT8 m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
color_t m_prim_lod_fraction; /* fixed LOD fraction for this poly */
|
||||||
|
|
||||||
color_t m_one;
|
color_t m_one;
|
||||||
color_t m_zero;
|
color_t m_zero;
|
||||||
@ -595,8 +605,6 @@ public:
|
|||||||
rectangle m_visarea;
|
rectangle m_visarea;
|
||||||
|
|
||||||
void draw_triangle(bool shade, bool texture, bool zbuffer, bool rect);
|
void draw_triangle(bool shade, bool texture, bool zbuffer, bool rect);
|
||||||
void compute_cvg_noflip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
|
|
||||||
void compute_cvg_flip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
|
|
||||||
|
|
||||||
void* m_aux_buf;
|
void* m_aux_buf;
|
||||||
UINT32 m_aux_buf_ptr;
|
UINT32 m_aux_buf_ptr;
|
||||||
@ -607,6 +615,9 @@ public:
|
|||||||
n64_tile_t m_tiles[8];
|
n64_tile_t m_tiles[8];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void compute_cvg_noflip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
|
||||||
|
void compute_cvg_flip(extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
|
||||||
|
|
||||||
void write_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, rdp_span_aux* userdata, const rdp_poly_state &object);
|
void write_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, rdp_span_aux* userdata, const rdp_poly_state &object);
|
||||||
void read_pixel(UINT32 curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
|
void read_pixel(UINT32 curpixel, rdp_span_aux* userdata, const rdp_poly_state &object);
|
||||||
void copy_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, INT32 m_current_pix_cvg, const rdp_poly_state &object);
|
void copy_pixel(UINT32 curpixel, INT32 r, INT32 g, INT32 b, INT32 m_current_pix_cvg, const rdp_poly_state &object);
|
||||||
@ -618,6 +629,9 @@ private:
|
|||||||
void video_update16(n64_periphs* n64, bitmap_rgb32 &bitmap);
|
void video_update16(n64_periphs* n64, bitmap_rgb32 &bitmap);
|
||||||
void video_update32(n64_periphs* n64, bitmap_rgb32 &bitmap);
|
void video_update32(n64_periphs* n64, bitmap_rgb32 &bitmap);
|
||||||
|
|
||||||
|
typedef void (n64_rdp::*compute_cvg_t) (extent_t* spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
|
||||||
|
compute_cvg_t m_compute_cvg[2];
|
||||||
|
|
||||||
running_machine* m_machine;
|
running_machine* m_machine;
|
||||||
|
|
||||||
combine_modes_t m_combine;
|
combine_modes_t m_combine;
|
||||||
@ -648,8 +662,8 @@ private:
|
|||||||
INT32 m_k1;
|
INT32 m_k1;
|
||||||
INT32 m_k2;
|
INT32 m_k2;
|
||||||
INT32 m_k3;
|
INT32 m_k3;
|
||||||
INT32 m_k4;
|
color_t m_k4;
|
||||||
INT32 m_k5;
|
color_t m_k5;
|
||||||
|
|
||||||
// Texture perspective division
|
// Texture perspective division
|
||||||
INT32 m_norm_point_rom[64];
|
INT32 m_norm_point_rom[64];
|
||||||
|
@ -106,9 +106,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_nodither(INT32* fr, INT32* fg, INT32*
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*fr = *userdata->m_color_inputs.blender1a_r[0];
|
*fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
|
||||||
*fg = *userdata->m_color_inputs.blender1a_g[0];
|
*fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
|
||||||
*fb = *userdata->m_color_inputs.blender1a_b[0];
|
*fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -121,9 +121,9 @@ bool n64_blender_t::cycle1_noblend_noacvg_dither(INT32* fr, INT32* fg, INT32* fb
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith];
|
*fr = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.r & 0xff) << 3) | dith];
|
||||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith];
|
*fg = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.g & 0xff) << 3) | dith];
|
||||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[0] & 0xff) << 3) | dith];
|
*fb = m_color_dither[(((*userdata->m_color_inputs.blender1a_rgb[0]).i.b & 0xff) << 3) | dith];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -136,9 +136,9 @@ bool n64_blender_t::cycle1_noblend_acvg_nodither(INT32* fr, INT32* fg, INT32* fb
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*fr = *userdata->m_color_inputs.blender1a_r[0];
|
*fr = (*userdata->m_color_inputs.blender1a_rgb[0]).i.r;
|
||||||
*fg = *userdata->m_color_inputs.blender1a_g[0];
|
*fg = (*userdata->m_color_inputs.blender1a_rgb[0]).i.g;
|
||||||
*fb = *userdata->m_color_inputs.blender1a_b[0];
|
*fb = (*userdata->m_color_inputs.blender1a_rgb[0]).i.b;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -151,9 +151,9 @@ bool n64_blender_t::cycle1_noblend_acvg_dither(INT32* fr, INT32* fg, INT32* fb,
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[0] & 0xff) << 3) | dith];
|
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.r << 3) | dith];
|
||||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[0] & 0xff) << 3) | dith];
|
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.g << 3) | dith];
|
||||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[0] & 0xff) << 3) | dith];
|
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[0]).i.b << 3) | dith];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -259,9 +259,9 @@ bool n64_blender_t::cycle2_noblend_noacvg_nodither(INT32* fr, INT32* fg, INT32*
|
|||||||
userdata->m_blended_pixel_color.i.g = g;
|
userdata->m_blended_pixel_color.i.g = g;
|
||||||
userdata->m_blended_pixel_color.i.b = b;
|
userdata->m_blended_pixel_color.i.b = b;
|
||||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||||
*fr = *userdata->m_color_inputs.blender1a_r[1];
|
*fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
|
||||||
*fg = *userdata->m_color_inputs.blender1a_g[1];
|
*fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
|
||||||
*fb = *userdata->m_color_inputs.blender1a_b[1];
|
*fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -285,9 +285,9 @@ bool n64_blender_t::cycle2_noblend_noacvg_dither(INT32* fr, INT32* fg, INT32* fb
|
|||||||
userdata->m_blended_pixel_color.i.g = g;
|
userdata->m_blended_pixel_color.i.g = g;
|
||||||
userdata->m_blended_pixel_color.i.b = b;
|
userdata->m_blended_pixel_color.i.b = b;
|
||||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[1] & 0xff) << 3) | dith];
|
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.r << 3) | dith];
|
||||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith];
|
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.g << 3) | dith];
|
||||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[1] & 0xff) << 3) | dith];
|
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -310,9 +310,9 @@ bool n64_blender_t::cycle2_noblend_acvg_nodither(INT32* fr, INT32* fg, INT32* fb
|
|||||||
userdata->m_blended_pixel_color.i.g = g;
|
userdata->m_blended_pixel_color.i.g = g;
|
||||||
userdata->m_blended_pixel_color.i.b = b;
|
userdata->m_blended_pixel_color.i.b = b;
|
||||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||||
*fr = *userdata->m_color_inputs.blender1a_r[1];
|
*fr = (*userdata->m_color_inputs.blender1a_rgb[1]).i.r;
|
||||||
*fg = *userdata->m_color_inputs.blender1a_g[1];
|
*fg = (*userdata->m_color_inputs.blender1a_rgb[1]).i.g;
|
||||||
*fb = *userdata->m_color_inputs.blender1a_b[1];
|
*fb = (*userdata->m_color_inputs.blender1a_rgb[1]).i.b;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -335,9 +335,9 @@ bool n64_blender_t::cycle2_noblend_acvg_dither(INT32* fr, INT32* fg, INT32* fb,
|
|||||||
userdata->m_blended_pixel_color.i.g = g;
|
userdata->m_blended_pixel_color.i.g = g;
|
||||||
userdata->m_blended_pixel_color.i.b = b;
|
userdata->m_blended_pixel_color.i.b = b;
|
||||||
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
userdata->m_blended_pixel_color.i.a = userdata->m_pixel_color.i.a;
|
||||||
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_r[1] & 0xff) << 3) | dith];
|
*fr = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.r << 3) | dith];
|
||||||
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_g[1] & 0xff) << 3) | dith];
|
*fg = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.g << 3) | dith];
|
||||||
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_b[1] & 0xff) << 3) | dith];
|
*fb = m_color_dither[((*userdata->m_color_inputs.blender1a_rgb[1]).i.b << 3) | dith];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -460,9 +460,9 @@ void n64_blender_t::blend_with_partial_reject(INT32* r, INT32* g, INT32* b, INT3
|
|||||||
{
|
{
|
||||||
if (partialreject && userdata->m_pixel_color.i.a >= 0xff)
|
if (partialreject && userdata->m_pixel_color.i.a >= 0xff)
|
||||||
{
|
{
|
||||||
*r = *userdata->m_color_inputs.blender1a_r[cycle];
|
*r = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.r;
|
||||||
*g = *userdata->m_color_inputs.blender1a_g[cycle];
|
*g = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.g;
|
||||||
*b = *userdata->m_color_inputs.blender1a_b[cycle];
|
*b = (*userdata->m_color_inputs.blender1a_rgb[cycle]).i.b;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -480,13 +480,13 @@ void n64_blender_t::blend_pipe(const int cycle, const int special, int* r_out, i
|
|||||||
const INT32 blend2a = (*userdata->m_color_inputs.blender2b_a[cycle] >> shift_b) & mask;
|
const INT32 blend2a = (*userdata->m_color_inputs.blender2b_a[cycle] >> shift_b) & mask;
|
||||||
const INT32 special_shift = special << 1;
|
const INT32 special_shift = special << 1;
|
||||||
|
|
||||||
INT32 r = (((int)(*userdata->m_color_inputs.blender1a_r[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_r[cycle]) * (int)(blend2a)));
|
INT32 r = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.r * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.r * (int)(blend2a)));
|
||||||
INT32 g = (((int)(*userdata->m_color_inputs.blender1a_g[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_g[cycle]) * (int)(blend2a)));
|
INT32 g = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.g * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.g * (int)(blend2a)));
|
||||||
INT32 b = (((int)(*userdata->m_color_inputs.blender1a_b[cycle]) * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_b[cycle]) * (int)(blend2a)));
|
INT32 b = (((int)(*userdata->m_color_inputs.blender1a_rgb[cycle]).i.b * (int)(blend1a))) + (((int)(*userdata->m_color_inputs.blender2a_rgb[cycle]).i.b * (int)(blend2a)));
|
||||||
|
|
||||||
r += ((int)*userdata->m_color_inputs.blender2a_r[cycle]) << special_shift;
|
r += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.r << special_shift;
|
||||||
g += ((int)*userdata->m_color_inputs.blender2a_g[cycle]) << special_shift;
|
g += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.g << special_shift;
|
||||||
b += ((int)*userdata->m_color_inputs.blender2a_b[cycle]) << special_shift;
|
b += (*userdata->m_color_inputs.blender2a_rgb[cycle]).i.b << special_shift;
|
||||||
|
|
||||||
r >>= object.m_other_modes.blend_shift;
|
r >>= object.m_other_modes.blend_shift;
|
||||||
g >>= object.m_other_modes.blend_shift;
|
g >>= object.m_other_modes.blend_shift;
|
||||||
|
@ -541,24 +541,27 @@ void n64_texture_pipe_t::lod_1cycle(INT32* sss, INT32* sst, const INT32 s, const
|
|||||||
const bool magnify = (lod < 32);
|
const bool magnify = (lod < 32);
|
||||||
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
|
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
|
||||||
|
|
||||||
userdata->m_lod_fraction = ((lod << 3) >> l_tile) & 0xff;
|
UINT8 lod_fraction = ((lod << 3) >> l_tile) & 0xff;
|
||||||
|
|
||||||
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
|
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
|
||||||
{
|
{
|
||||||
if (distant)
|
if (distant)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction = 0xff;
|
lod_fraction = 0xff;
|
||||||
}
|
}
|
||||||
else if (magnify)
|
else if (magnify)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction = 0;
|
lod_fraction = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userdata->m_lod_fraction.i.r = userdata->m_lod_fraction.i.g = userdata->m_lod_fraction.i.b = userdata->m_lod_fraction.i.a = lod_fraction;
|
||||||
|
/* FIXME: ???
|
||||||
if(object.m_other_modes.sharpen_tex_en && magnify)
|
if(object.m_other_modes.sharpen_tex_en && magnify)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction |= 0x100;
|
userdata->m_lod_fraction |= 0x100;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const INT32 t, const INT32 w, const INT32 dsinc, const INT32 dtinc, const INT32 dwinc, const INT32 prim_tile, INT32* t1, INT32* t2, rdp_span_aux* userdata, const rdp_poly_state& object)
|
void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const INT32 t, const INT32 w, const INT32 dsinc, const INT32 dtinc, const INT32 dwinc, const INT32 prim_tile, INT32* t1, INT32* t2, rdp_span_aux* userdata, const rdp_poly_state& object)
|
||||||
@ -611,24 +614,27 @@ void n64_texture_pipe_t::lod_2cycle(INT32* sss, INT32* sst, const INT32 s, const
|
|||||||
const bool magnify = (lod < 32);
|
const bool magnify = (lod < 32);
|
||||||
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
|
const bool distant = ((lod & 0x6000) || (l_tile >= object.m_misc_state.m_max_level));
|
||||||
|
|
||||||
userdata->m_lod_fraction = ((lod << 3) >> l_tile) & 0xff;
|
UINT8 lod_fraction = ((lod << 3) >> l_tile) & 0xff;
|
||||||
|
|
||||||
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
|
if(!object.m_other_modes.sharpen_tex_en && !object.m_other_modes.detail_tex_en)
|
||||||
{
|
{
|
||||||
if (distant)
|
if (distant)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction = 0xff;
|
lod_fraction = 0xff;
|
||||||
}
|
}
|
||||||
else if (magnify)
|
else if (magnify)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction = 0;
|
lod_fraction = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userdata->m_lod_fraction.i.r = userdata->m_lod_fraction.i.g = userdata->m_lod_fraction.i.b = userdata->m_lod_fraction.i.a = lod_fraction;
|
||||||
|
|
||||||
|
/* FIXME: ???
|
||||||
if(object.m_other_modes.sharpen_tex_en && magnify)
|
if(object.m_other_modes.sharpen_tex_en && magnify)
|
||||||
{
|
{
|
||||||
userdata->m_lod_fraction |= 0x100;
|
userdata->m_lod_fraction |= 0x100;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (object.m_other_modes.tex_lod_en)
|
if (object.m_other_modes.tex_lod_en)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user