Phase one of better masking support while rendering.
Problem: artist wants character to walk in grass, but still have all rendered in seperate render-layers, for postpro effects and vblur. How to efficiently create a mask image you can put *over* the character for the grass? Solution has two parts; this commits allows any layer inside of the renderlayers to become a Z-mask (Z values for solid gets filled in, but not rendered). Second part of commit is render option "Only render stuff that's in front of a zbuffer value that was filled in (saves render time)
This commit is contained in:
@@ -505,6 +505,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
|
||||
|
||||
strcpy(rl->name, srl->name);
|
||||
rl->lay= srl->lay;
|
||||
rl->lay_zmask= srl->lay_zmask;
|
||||
rl->layflag= srl->layflag;
|
||||
rl->passflag= srl->passflag;
|
||||
rl->pass_xor= srl->pass_xor;
|
||||
|
||||
@@ -897,7 +897,7 @@ void zbufshadeDA_tile(RenderPart *pa)
|
||||
sdata.rl= rl;
|
||||
sdata.psmlist= &psmlist;
|
||||
sdata.edgerect= edgerect;
|
||||
zbuffer_solid(pa, rl->lay, rl->layflag, make_pixelstructs, &sdata);
|
||||
zbuffer_solid(pa, rl, make_pixelstructs, &sdata);
|
||||
if(R.test_break()) break;
|
||||
}
|
||||
|
||||
@@ -1063,7 +1063,7 @@ void zbufshade_tile(RenderPart *pa)
|
||||
shade_sample_initialize(&ssamp, pa, rl);
|
||||
addpassflag= rl->passflag & ~(SCE_PASS_Z|SCE_PASS_COMBINED);
|
||||
|
||||
zbuffer_solid(pa, rl->lay, rl->layflag, NULL, NULL);
|
||||
zbuffer_solid(pa, rl, NULL, NULL);
|
||||
|
||||
if(!R.test_break()) { /* NOTE: this if() is not consistant */
|
||||
|
||||
|
||||
@@ -1925,7 +1925,7 @@ void zbufclip4(ZSpan *zspan, int obi, int zvlnr, float *f1, float *f2, float *f3
|
||||
|
||||
/* ***************** ZBUFFER MAIN ROUTINES **************** */
|
||||
|
||||
void zbuffer_solid(RenderPart *pa, unsigned int lay, short layflag, void(*fillfunc)(RenderPart*, ZSpan*, int, void*), void *data)
|
||||
void zbuffer_solid(RenderPart *pa, RenderLayer *rl, void(*fillfunc)(RenderPart*, ZSpan*, int, void*), void *data)
|
||||
{
|
||||
ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE];
|
||||
ZSpan zspans[16], *zspan; /* 16 = RE_MAX_OSA */
|
||||
@@ -1935,7 +1935,9 @@ void zbuffer_solid(RenderPart *pa, unsigned int lay, short layflag, void(*fillfu
|
||||
ObjectInstanceRen *obi;
|
||||
ObjectRen *obr;
|
||||
float winmat[4][4], bounds[4], ho1[4], ho2[4], ho3[4], ho4[4]={0};
|
||||
unsigned int lay= rl->lay, lay_zmask= rl->lay_zmask;
|
||||
int i, v, zvlnr, zsample, samples, c1, c2, c3, c4=0;
|
||||
short layflag= rl->layflag;
|
||||
short nofill=0, env=0, wire=0, all_z= layflag & SCE_LAY_ALL_Z;
|
||||
|
||||
samples= (R.osa? R.osa: 1);
|
||||
@@ -2016,7 +2018,7 @@ void zbuffer_solid(RenderPart *pa, unsigned int lay, short layflag, void(*fillfu
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(all_z) {
|
||||
else if(all_z || (obr->lay & lay_zmask)) {
|
||||
env= 1;
|
||||
nofill= 0;
|
||||
ma= NULL;
|
||||
|
||||
Reference in New Issue
Block a user