ref_soft: Fix render setup

This commit is contained in:
mittorn 2019-03-23 05:39:45 +07:00
parent 932ad73441
commit 4c73f026b2
6 changed files with 120 additions and 109 deletions

View File

@ -134,7 +134,7 @@ void R_BeginEdgeFrame (void)
}
// FIXME: set with memset
for (v=0 ; v<gpGlobals->height ; v++)
for (v=RI.vrect.y ; v<RI.vrectbottom ; v++)
{
newedges[v] = removeedges[v] = NULL;
}
@ -653,13 +653,13 @@ void R_ScanEdges (void)
basespan_p = (espan_t *)
((long)(basespans + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
max_span_p = &basespan_p[MAXSPANS - gpGlobals->width];
max_span_p = &basespan_p[MAXSPANS - RI.vrect.width];
span_p = basespan_p;
// clear active edges to just the background edges around the whole screen
// FIXME: most of this only needs to be set up once
edge_head.u = 1 << 20; //r_refdef.vrect.x << 20;
edge_head.u = RI.vrect.x << 20;
edge_head_u_shift20 = edge_head.u >> 20;
edge_head.u_step = 0;
edge_head.prev = NULL;
@ -667,7 +667,7 @@ void R_ScanEdges (void)
edge_head.surfs[0] = 0;
edge_head.surfs[1] = 1;
edge_tail.u =(gpGlobals->width << 20) + 0xFFFFF; // (r_refdef.vrectright << 20) + 0xFFFFF;
edge_tail.u =(RI.vrectright << 20) + 0xFFFFF; // (r_refdef.vrectright << 20) + 0xFFFFF;
edge_tail_u_shift20 = edge_tail.u >> 20;
edge_tail.u_step = 0;
edge_tail.prev = &edge_head;
@ -687,7 +687,7 @@ void R_ScanEdges (void)
//
// process all scan lines
//
bottom = gpGlobals->height; //r_refdef.vrectbottom - 1;
bottom = RI.vrectbottom - 1;
for (iv=0 ; iv<bottom ; iv++)
{

View File

@ -214,6 +214,30 @@ typedef struct
float viewplanedist;
mplane_t clipPlane;
// q2 oldrefdef
vrect_t vrect; // subwindow in video for refresh
// FIXME: not need vrect next field here?
vrect_t aliasvrect; // scaled Alias version
int vrectright, vrectbottom; // right & bottom screen coords
int aliasvrectright, aliasvrectbottom; // scaled Alias versions
float vrectrightedge; // rightmost right edge we care about,
// for use in edge list
float fvrectx, fvrecty; // for floating-point compares
float fvrectx_adj, fvrecty_adj; // left and top edges, for clamping
int vrect_x_adj_shift20; // (vrect.x + 0.5 - epsilon) << 20
int vrectright_adj_shift20; // (vrectright + 0.5 - epsilon) << 20
float fvrectright_adj, fvrectbottom_adj;
// right and bottom edges, for clamping
float fvrectright; // rightmost edge, for Alias clamping
float fvrectbottom; // bottommost edge, for Alias clamping
float horizontalFieldOfView; // at Z = 1.0, this many X is visible
// 2.0 = 90 degrees
float xOrigin; // should probably always be 0.5
float yOrigin; // between be around 0.3 to 0.5
int ambientlight;
} ref_instance_t;
typedef struct
@ -748,7 +772,7 @@ extern cvar_t *r_showhull;
// polygon (while processing)
// !!! if this is changed, it must be changed in d_ifacea.h too !!!
#define MAXHEIGHT 1200
#define MAXWIDTH 1600
#define MAXWIDTH 1920
#define INFINITE_DISTANCE 0x10000 // distance that's always guaranteed to
// be farther away than anything in

View File

@ -1687,6 +1687,13 @@ qboolean R_Init()
// init draw stack
tr.draw_list = &tr.draw_stack[0];
tr.draw_stack_pos = 0;
RI.yOrigin = YCENTERING;
RI.xOrigin = XCENTERING;
view_clipplanes[0].leftedge = true;
view_clipplanes[1].rightedge = true;
view_clipplanes[1].leftedge = view_clipplanes[2].leftedge =view_clipplanes[3].leftedge = false;
view_clipplanes[0].rightedge = view_clipplanes[2].rightedge = view_clipplanes[3].rightedge = false;
return true;
}

105
r_misc.c
View File

@ -95,8 +95,8 @@ void D_ViewChanged (void)
if (d_pix_max < 1)
d_pix_max = 1;
d_vrectx = 0;//r_refdef.vrect.x;
d_vrecty = 0;//r_refdef.vrect.y;
d_vrectx = RI.vrect.x;
d_vrecty = RI.vrect.y;
d_vrectright_particle = gpGlobals->width - d_pix_max;
d_vrectbottom_particle =
gpGlobals->height - d_pix_max;
@ -223,98 +223,89 @@ Guaranteed to be called before the first refresh
void R_ViewChanged (vrect_t *vr)
{
int i;
#if 0
r_refdef.vrect = *vr;
float verticalFieldOfView, xOrigin, yOrigin;
r_refdef.horizontalFieldOfView = 2*tan((float)r_newrefdef.fov_x/360*M_PI);;
verticalFieldOfView = 2*tan((float)r_newrefdef.fov_y/360*M_PI);
RI.vrect = *vr;
r_refdef.fvrectx = (float)r_refdef.vrect.x;
r_refdef.fvrectx_adj = (float)r_refdef.vrect.x - 0.5;
r_refdef.vrect_x_adj_shift20 = (r_refdef.vrect.x<<20) + (1<<19) - 1;
r_refdef.fvrecty = (float)r_refdef.vrect.y;
r_refdef.fvrecty_adj = (float)r_refdef.vrect.y - 0.5;
r_refdef.vrectright = r_refdef.vrect.x + r_refdef.vrect.width;
r_refdef.vrectright_adj_shift20 = (r_refdef.vrectright<<20) + (1<<19) - 1;
r_refdef.fvrectright = (float)r_refdef.vrectright;
r_refdef.fvrectright_adj = (float)r_refdef.vrectright - 0.5;
r_refdef.vrectrightedge = (float)r_refdef.vrectright - 0.99;
r_refdef.vrectbottom = r_refdef.vrect.y + r_refdef.vrect.height;
r_refdef.fvrectbottom = (float)r_refdef.vrectbottom;
r_refdef.fvrectbottom_adj = (float)r_refdef.vrectbottom - 0.5;
RI.horizontalFieldOfView = 2*tan((float)RI.fov_x/360*M_PI);
verticalFieldOfView = 2*tan((float)RI.fov_y/360*M_PI);
r_refdef.aliasvrect.x = (int)(r_refdef.vrect.x * r_aliasuvscale);
r_refdef.aliasvrect.y = (int)(r_refdef.vrect.y * r_aliasuvscale);
r_refdef.aliasvrect.width = (int)(r_refdef.vrect.width * r_aliasuvscale);
r_refdef.aliasvrect.height = (int)(r_refdef.vrect.height * r_aliasuvscale);
r_refdef.aliasvrectright = r_refdef.aliasvrect.x +
r_refdef.aliasvrect.width;
r_refdef.aliasvrectbottom = r_refdef.aliasvrect.y +
r_refdef.aliasvrect.height;
RI.fvrectx = (float)RI.vrect.x;
RI.fvrectx_adj = (float)RI.vrect.x - 0.5;
RI.vrect_x_adj_shift20 = (RI.vrect.x<<20) + (1<<19) - 1;
RI.fvrecty = (float)RI.vrect.y;
RI.fvrecty_adj = (float)RI.vrect.y - 0.5;
RI.vrectright = RI.vrect.x + RI.vrect.width;
RI.vrectright_adj_shift20 = (RI.vrectright<<20) + (1<<19) - 1;
RI.fvrectright = (float)RI.vrectright;
RI.fvrectright_adj = (float)RI.vrectright - 0.5;
RI.vrectrightedge = (float)RI.vrectright - 0.99;
RI.vrectbottom = RI.vrect.y + RI.vrect.height;
RI.fvrectbottom = (float)RI.vrectbottom;
RI.fvrectbottom_adj = (float)RI.vrectbottom - 0.5;
xOrigin = r_refdef.xOrigin;
yOrigin = r_refdef.yOrigin;
#endif
//RI.aliasvrect.x = (int)(RI.vrect.x * r_aliasuvscale);
//RI.aliasvrect.y = (int)(RI.vrect.y * r_aliasuvscale);
//RI.aliasvrect.width = (int)(RI.vrect.width * r_aliasuvscale);
//RI.aliasvrect.height = (int)(RI.vrect.height * r_aliasuvscale);
RI.aliasvrectright = RI.aliasvrect.x +
RI.aliasvrect.width;
RI.aliasvrectbottom = RI.aliasvrect.y +
RI.aliasvrect.height;
int fov_x = 2.0 * tan (RI.fov_x/360*M_PI);
int fov_y = 2.0 * tan (RI.fov_y/360*M_PI);
xOrigin = RI.xOrigin;// = r_origin[0];
yOrigin = RI.yOrigin;// = r_origin[1];
#define PLANE_ANYZ 5
// values for perspective projection
// if math were exact, the values would range from 0.5 to to range+0.5
// hopefully they wll be in the 0.000001 to range+.999999 and truncate
// the polygon rasterization will never render in the first row or column
// but will definately render in the [range] row and column, so adjust the
// buffer origin to get an exact edge to edge fill
xcenter = ((float)gpGlobals->width * XCENTERING) +
0 - 0.5;
xcenter = ((float)RI.vrect.width * XCENTERING) +
RI.vrect.x - 0.5;
//aliasxcenter = xcenter * r_aliasuvscale;
ycenter = ((float)gpGlobals->height * YCENTERING) +
0 - 0.5;
//aliasycenter = ycenter * r_aliasuvscale;
ycenter = ((float)RI.vrect.height * YCENTERING) +
RI.vrect.y - 0.5;
// aliasycenter = ycenter * r_aliasuvscale;
xscale = gpGlobals->width * 1.5 / fov_x;
//aliasxscale = xscale * r_aliasuvscale;
xscale = RI.vrect.width / RI.horizontalFieldOfView;
// aliasxscale = xscale * r_aliasuvscale;
xscaleinv = 1.0 / xscale;
yscale = xscale;
//aliasyscale = yscale * r_aliasuvscale;
// aliasyscale = yscale * r_aliasuvscale;
yscaleinv = 1.0 / yscale;
xscaleshrink = (gpGlobals->width-6)/fov_x;
xscaleshrink = (RI.vrect.width-6)/RI.horizontalFieldOfView;
yscaleshrink = xscaleshrink;
// ???
#define PLANE_ANYZ 5
int xOrigin = r_origin[0];
int yOrigin = r_origin[1];
// left side clip
screenedge[0].normal[0] = -1.0 / (xOrigin*fov_x);
screenedge[0].normal[0] = -1.0 / (xOrigin*RI.horizontalFieldOfView);
screenedge[0].normal[1] = 0;
screenedge[0].normal[2] = 1;
screenedge[0].type = PLANE_ANYZ;
// right side clip
screenedge[1].normal[0] =
1.0 / ((1.0-xOrigin)*fov_x);
1.0 / ((1.0-xOrigin)*RI.horizontalFieldOfView);
screenedge[1].normal[1] = 0;
screenedge[1].normal[2] = 1;
screenedge[1].type = PLANE_ANYZ;
// top side clip
screenedge[2].normal[0] = 0;
screenedge[2].normal[1] = -1.0 / (yOrigin*fov_y);
screenedge[2].normal[1] = -1.0 / (yOrigin*verticalFieldOfView);
screenedge[2].normal[2] = 1;
screenedge[2].type = PLANE_ANYZ;
// bottom side clip
screenedge[3].normal[0] = 0;
screenedge[3].normal[1] = 1.0 / ((1.0-yOrigin)*fov_y);
screenedge[3].normal[2] = 1;
screenedge[3].normal[1] = 1.0 / ((1.0-yOrigin)*verticalFieldOfView);
screenedge[3].normal[2] = 1;
screenedge[3].type = PLANE_ANYZ;
for (i=0 ; i<4 ; i++)
VectorNormalize (screenedge[i].normal);
VectorNormalize (screenedge[i].normal);
D_ViewChanged ();
}

View File

@ -226,8 +226,6 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
int v, v2, ceilv0;
float scale, lzi0, u0, v0;
int side;
if( isnan( pv0->position[1]) )
return;
if (r_lastvertvalid)
{
@ -252,26 +250,19 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
// FIXME: build x/yscale into transform?
scale = xscale * lzi0;
u0 = (xcenter + scale*transformed[0]);
if (u0 < 0)
u0 = 0;
if (u0 > gpGlobals->width)
u0 = gpGlobals->width;
if (u0 < RI.fvrectx_adj)
u0 = RI.fvrectx_adj;
if (u0 > RI.fvrectright_adj)
u0 = RI.fvrectright_adj;
scale = yscale * lzi0;
v0 = (ycenter - scale*transformed[1]);
if (v0 < 0)
v0 = 0;
if (v0 > gpGlobals->height)
v0 = gpGlobals->height;
if (v0 < RI.fvrecty_adj)
v0 = RI.fvrecty_adj;
if (v0 > RI.fvrectbottom_adj)
v0 = RI.fvrectbottom_adj;
ceilv0 = (int) ceil(v0);
if( ceilv0 < 0 )
{
printf("ceilv0 %d %f %f %f %f\n", ceilv0, v0, scale, transformed[1], ycenter );
printf("%f %f %f %f\n", world[1],modelorg[1], local[1], transformed[1] );
}
}
world = &pv1->position[0];
@ -287,17 +278,17 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
scale = xscale * r_lzi1;
r_u1 = (xcenter + scale*transformed[0]);
if (r_u1 < 0)
r_u1 = 0;
if (r_u1 > gpGlobals->width)
r_u1 = gpGlobals->width;
if (r_u1 < RI.fvrectx_adj)
r_u1 = RI.fvrectx_adj;
if (r_u1 > RI.fvrectright_adj)
r_u1 = RI.fvrectright_adj;
scale = yscale * r_lzi1;
r_v1 = (ycenter - scale*transformed[1]);
if (r_v1 < 0)
r_v1 = 0;
if (r_v1 > gpGlobals->height)
r_v1 = gpGlobals->height;
if (r_v1 < RI.fvrecty_adj)
r_v1 = RI.fvrecty_adj;
if (r_v1 > RI.fvrectbottom_adj)
r_v1 = RI.fvrectbottom_adj;
if (r_lzi1 > lzi0)
lzi0 = r_lzi1;
@ -339,7 +330,6 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
{
// trailing edge (go from p1 to p2)
v = ceilv0;
if( v < 0 )printf("v0 %d\n", v);
v2 = r_ceilv1 - 1;
edge->surfs[0] = surface_p - surfaces;
@ -353,7 +343,6 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
// leading edge (go from p2 to p1)
v2 = ceilv0 - 1;
v = r_ceilv1;
if( v < 0 )printf("v1 %d\n", v);
edge->surfs[0] = 0;
edge->surfs[1] = surface_p - surfaces;
@ -370,12 +359,17 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
// it to incorrectly extend to the scan, and the extension of the line goes off
// the edge of the screen
// FIXME: is this actually needed?
int r = (gpGlobals->width<<20) + (1<<19) - 1;
/*int r = (gpGlobals->width<<20) + (1<<19) - 1;
int x = (1<<20) + (1<<19) - 1;
if (edge->u < x)
edge->u = x;
if (edge->u > r)
edge->u = r;
edge->u = r;*/
if (edge->u < RI.vrect_x_adj_shift20)
edge->u = RI.vrect_x_adj_shift20;
if (edge->u > RI.vrectright_adj_shift20)
edge->u = RI.vrectright_adj_shift20;
//
// sort the edge in normally
@ -384,11 +378,6 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1)
if (edge->surfs[0])
u_check++; // sort trailers after leaders
if( v < 0 )
{
printf("v %d\n", v);
v = 0;
}
if (!newedges[v] || newedges[v]->u >= u_check)
{
edge->next = newedges[v];

View File

@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
@ -129,7 +129,7 @@ void Turbulent8 (espan_t *pspan)
fixed16_t snext, tnext;
float sdivz, tdivz, zi, z, du, dv, spancountminus1;
float sdivz16stepu, tdivz16stepu, zi16stepu;
r_turb_turb = sintable + ((int)(gpGlobals->time*SPEED)&(CYCLE-1));
r_turb_sstep = 0; // keep compiler happy
@ -264,7 +264,7 @@ void NonTurbulent8 (espan_t *pspan)
fixed16_t snext, tnext;
float sdivz, tdivz, zi, z, du, dv, spancountminus1;
float sdivz16stepu, tdivz16stepu, zi16stepu;
// r_turb_turb = sintable + ((int)(r_newrefdef.time*SPEED)&(CYCLE-1));
r_turb_turb = blanktable;
@ -395,13 +395,13 @@ void NonTurbulent8 (espan_t *pspan)
int kernel[2][2][2] =
{
{
{16384,0},
{49152,32768}
{16384,0},
{49152,32768}
}
,
{
{32768,49152},
{0,16384}
{32768,49152},
{0,16384}
}
};
@ -525,7 +525,7 @@ void D_DrawSpans16 (espan_t *pspan)
}
}
// Drawing phrase
if (sw_texfilt->value == 0.0f)
{
@ -539,7 +539,7 @@ void D_DrawSpans16 (espan_t *pspan)
else if (sw_texfilt->value == 1.0f)
{
do
{
{
int idiths = s;
int iditht = t;
@ -552,18 +552,18 @@ void D_DrawSpans16 (espan_t *pspan)
idiths = idiths >> 16;
idiths = idiths ? idiths -1 : idiths;
iditht = iditht >> 16;
iditht = iditht ? iditht -1 : iditht;
*pdest++ = *(pbase + idiths + iditht * cachewidth);
s += sstep;
t += tstep;
} while (--spancount > 0);
}
} while (count > 0);