Implemented multisampling for texture nodes.
[blender-staging.git] / source / blender / nodes / intern / TEX_nodes / TEX_output.c
index 355de796c7e76666a05ca36c58bc2f4865390cc8..96ee5d74f66952881b927f8761c951b28dd2286f 100644 (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;
                        }