Implemented multisampling for texture nodes.

This commit is contained in:
Robin Allen
2009-08-17 22:17:25 +00:00
parent f9ceeeede6
commit 2de4c8f2b2
2 changed files with 45 additions and 3 deletions

View File

@@ -35,6 +35,48 @@ static bNodeSocketType inputs[]= {
{ -1, 0, "" }
};
static void osa(
void (*input_fn)(float *, bNodeStack *, TexParams *, short),
float *out,
bNodeStack *in,
TexParams *p,
short thread
){
if(!p->dxt) {
input_fn(out, in, p, thread);
} else {
float sample[4] = {0};
float coord[3];
TexParams sp = *p;
int i;
sp.coord = coord;
sp.dxt = sp.dyt = 0;
QUATCOPY(out, sample);
for(i=0; i<5; i++) {
VECCOPY(coord, p->coord);
if(i < 4)
{
if(i % 2) VECADD(coord, coord, p->dxt);
if(i > 1) VECADD(coord, coord, p->dyt);
}
else
{
VECADDFAC(coord, coord, p->dxt, 0.5);
VECADDFAC(coord, coord, p->dyt, 0.5);
}
input_fn(sample, in, &sp, thread);
QUATADDFAC(out, out, sample, 0.2);
}
}
}
/* applies to render pipeline */
static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
@@ -52,14 +94,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
TexParams params;
params_from_cdata(&params, cdata);
tex_input_rgba(&target->tr, in[0], &params, cdata->thread);
osa(tex_input_rgba, &target->tr, in[0], &params, cdata->thread);
target->tin = (target->tr + target->tg + target->tb) / 3.0f;
target->talpha = 1.0f;
if(target->nor) {
if(in[1]->hasinput)
tex_input_vec(target->nor, in[1], &params, cdata->thread);
osa(tex_input_vec, target->nor, in[1], &params, cdata->thread);
else
target->nor = 0;
}

View File

@@ -149,7 +149,7 @@ void tex_do_preview(bNode *node, bNodeStack *ns, TexCallData *cdata)
params.dxt = 0;
params.dyt = 0;
params.cfra = 0; /* XXX Use current? */
params.cfra = cdata->cfra;
params.coord = coord;
for(x=0; x<preview->xsize; x++)