2012
2014
zbuf_free_span(&zspan);
2017
static void zbuffill_sss(ZSpan *zspan, int zvlnr, float *v1, float *v2, float *v3, float *v4)
2019
double zxd, zyd, zy0, z;
2020
float x0, y0, x1, y1, x2, y2, z0, z1, z2, xx1, *span1, *span2;
2021
int x, y, sn1, sn2, rectx= zspan->rectx, my0, my2;
2024
zbuf_init_span(zspan);
2027
zbuf_add_to_span(zspan, v1, v2);
2028
zbuf_add_to_span(zspan, v2, v3);
2030
zbuf_add_to_span(zspan, v3, v4);
2031
zbuf_add_to_span(zspan, v4, v1);
2034
zbuf_add_to_span(zspan, v3, v1);
2037
if(zspan->minp2==NULL || zspan->maxp2==NULL) return;
2039
if(zspan->miny1 < zspan->miny2) my0= zspan->miny2; else my0= zspan->miny1;
2040
if(zspan->maxy1 > zspan->maxy2) my2= zspan->maxy2; else my2= zspan->maxy1;
2044
/* ZBUF DX DY, in floats still */
2056
if(z0==0.0f) return;
2058
xx1= (x0*v1[0] + y0*v1[1])/z0 + v1[2];
2059
zxd= -(double)x0/(double)z0;
2060
zyd= -(double)y0/(double)z0;
2061
zy0= ((double)my2)*zyd + (double)xx1;
2065
if(zspan->span1[sn1] < zspan->span2[sn1]) {
2066
span1= zspan->span1+my2;
2067
span2= zspan->span2+my2;
2070
span1= zspan->span2+my2;
2071
span2= zspan->span1+my2;
2074
for(y=my2; y>=my0; y--, span1--, span2--) {
2079
if(sn2>=rectx) sn2= rectx-1;
2082
z= (double)sn1*zxd + zy0;
2084
for(x= sn1; x<=sn2; x++, z+=zxd)
2085
zspan->sss_func(zspan->sss_handle, zvlnr, x, y, z);
2091
void zbuffer_sss(RenderPart *pa, unsigned int lay, void *handle, void (*func)(void *, int, int, int, int))
2095
VertRen *v1, *v2, *v3, *v4;
2096
Material *ma=0, *sss_ma= R.sss_mat;
2097
short nofill=0, env=0, wire=0;
2098
char *clipflag= pa->clipflag;
2101
zbuf_alloc_span(&zspan, pa->rectx, pa->recty);
2103
zspan.sss_handle= handle;
2104
zspan.sss_func= func;
2106
/* needed for transform from hoco to zbuffer co */
2107
zspan.zmulx= ((float)R.winx)/2.0;
2108
zspan.zmuly= ((float)R.winy)/2.0;
2110
/* -0.5f to center the sample position */
2111
zspan.zofsx= -pa->disprect.xmin - 0.5f;
2112
zspan.zofsy= -pa->disprect.ymin - 0.5f;
2114
/* filling methods */
2115
zspan.zbuffunc= zbuffill_sss;
2117
/* fill front and back zbuffer */
2119
fillrect(pa->rectp, pa->rectx, pa->recty, 0);
2120
fillrect(pa->rectz, pa->rectx, pa->recty, 0x7FFFFFFF);
2123
fillrect(pa->rectbackp, pa->rectx, pa->recty, 0);
2124
fillrect(pa->rectbackz, pa->rectx, pa->recty, -0x7FFFFFFF);
2127
for(v=0; v<R.totvlak; v++) {
2128
if((v & 255)==0) vlr= R.vlaknodes[v>>8].vlak;
2131
if((vlr->flag & R_VISIBLE) && material_in_material(vlr->mat, sss_ma)) {
2132
/* three cases, visible for render, only z values and nothing */
2133
if(vlr->lay & lay) {
2136
nofill= ma->mode & MA_ONLYCAST;
2137
env= (ma->mode & MA_ENV);
2138
wire= (ma->mode & MA_WIRE);
2143
ma= NULL; /* otherwise nofill can hang */
2146
if(nofill==0 && wire==0 && env==0) {
2147
unsigned short partclip;
2154
/* partclipping doesn't need viewplane clipping */
2155
partclip= clipflag[v1->index] & clipflag[v2->index] & clipflag[v3->index];
2157
partclip &= clipflag[v4->index];
2162
zbufclip(&zspan, zvlnr, v1->ho, v2->ho, v3->ho, v1->clip, v2->clip, v3->clip);
2164
zvlnr+= RE_QUAD_OFFS;
2165
zbufclip(&zspan, zvlnr, v1->ho, v3->ho, v4->ho, v1->clip, v3->clip, v4->clip);
2172
zbuf_free_span(&zspan);
2015
2175
/* ******************** VECBLUR ACCUM BUF ************************* */
2017
2177
typedef struct DrawBufPixel {