Extra texture channel input for Mist effect; "Global". This feeds the
authorTon Roosendaal <ton@blender.org>
Thu, 1 Dec 2005 22:16:07 +0000 (22:16 +0000)
committerTon Roosendaal <ton@blender.org>
Thu, 1 Dec 2005 22:16:07 +0000 (22:16 +0000)
global coordinate (from faces) to the sky texture color calculus, this to
make textured mist a bit less transparent (was only view coordinate).

source/blender/makesdna/DNA_world_types.h
source/blender/render/intern/include/pixelshading.h
source/blender/render/intern/include/rendercore.h
source/blender/render/intern/include/texture.h
source/blender/render/intern/source/pixelshading.c
source/blender/render/intern/source/ray.c
source/blender/render/intern/source/rendercore.c
source/blender/render/intern/source/texture.c
source/blender/render/intern/source/vanillaRenderPipe.c
source/blender/render/intern/source/zbuf.c
source/blender/src/buttons_shading.c

index e284044a633530c00f03094929ceae2be83f2da4..edc621ba7582175231fc046df1e00c988771c405 100644 (file)
@@ -152,12 +152,13 @@ typedef struct World {
 #define WOMAP_HORIZ            2
 #define WOMAP_ZENUP            4
 #define WOMAP_ZENDOWN  8
+#define WOMAP_MIST             16
 
 /* physicsEngine */
 #define WOPHY_NONE             0
 #define WOPHY_ENJI             1
 #define WOPHY_SUMO             2
-#define WOPHY_DYNAMO           3
+#define WOPHY_DYNAMO   3
 #define WOPHY_ODE              4
 #define WOPHY_BULLET   5
 
index 6b9e13c069f20441ef2405b90d1d0de3bd86b918..9f4600209b5d36ce5c678ceeb6d3fbf5352c10f8 100644 (file)
@@ -68,12 +68,11 @@ enum RE_SkyAlphaBlendingType getSkyBlendingMode(void);
 /**
  * Render the sky at pixel (x, y).
  */
-void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y);
+void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y, float *rco);
+void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy, float *rco);
+void shadeSkyPixelFloat(float *colf, float *rco, float *view, float *dxyview);
 
-/* used by shadeSkyPixel: */
-void shadeSkyPixelFloat(float *colf, float *view, float *dxyview);
 void renderSpotHaloPixel(float x, float y, float *target);
-void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy);
 void fillBackgroundImage(RE_COLBUFTYPE *collector, float x, float y);
 void fillBackgroundImageChar(char *col, float x, float y);
 
index 5163b85d8c0a67ffed6f674cfb2aa2469f3959dd..0859620982c485b2030e3fe37159de737edfacc5 100644 (file)
@@ -103,7 +103,7 @@ void zbufshadeDA(void);     /* Delta Accum Pixel Struct */
 /**
  * Also called in: zbuf.c
  */
-void *shadepixel(float x, float y, int z, int facenr, int mask, float *col);
+void *shadepixel(float x, float y, int z, int facenr, int mask, float *col, float *rco);
 
 /**
  * A cryptic but very efficient way of counting the number of bits that 
index 525f8455aa2bb719ad0668d57ff8cae4dee2c0f5..4b7ac102d80840610d76d723ed3776ee0ff44a1f 100644 (file)
@@ -55,7 +55,7 @@ struct Image;
 /* texture.h */
 
 void do_halo_tex(struct HaloRen *har, float xn, float yn, float *colf);
-void do_sky_tex(float *lo, float *dxyview, float *hor, float *zen, float *blend);
+void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, float *blend);
 void render_realtime_texture(struct ShadeInput *shi);           
 
 /* imagetexture.h */
index d0c23f6daf389e3c45f8cdf9d818901591e014a2..9d6e7b421d566fae5c7ce343e809b9333b2b8c0a 100644 (file)
@@ -127,10 +127,11 @@ static void *renderHaloPixel(RE_COLBUFTYPE *collector, float x, float y, int hal
 
 void *renderPixel(RE_COLBUFTYPE *collector, float x, float y, int *obdata, int mask)
 {
-    void* data = NULL;
+    void *data = NULL;
+       float rco[3];   /* not used (yet?) */
     
     if (obdata[3] & RE_POLY) {
-               data = shadepixel(x, y, obdata[0], obdata[1], mask, collector);
+               data = shadepixel(x, y, obdata[0], obdata[1], mask, collector, rco);
     }
     else if (obdata[3] & RE_HALO) {
         data = renderHaloPixel(collector, x, y, obdata[1]);
@@ -138,7 +139,7 @@ void *renderPixel(RE_COLBUFTYPE *collector, float x, float y, int *obdata, int m
        else if( obdata[1] == 0 ) {     
                /* for lamphalo, but doesn't seem to be called? Actually it is, and  */
                /* it returns NULL pointers. */
-        data = shadepixel(x, y, obdata[0], obdata[1], mask, collector);
+        data = shadepixel(x, y, obdata[0], obdata[1], mask, collector, rco);
        }
     return data;
    
@@ -148,7 +149,8 @@ void *renderPixel(RE_COLBUFTYPE *collector, float x, float y, int *obdata, int m
 
 void renderSpotHaloPixel(float x, float y, float* fcol)
 {
-       shadepixel(x, y, 0, 0, 0, fcol);        
+       float rco[3];   /* unused */
+       shadepixel(x, y, 0, 0, 0, fcol, rco);
 }
 
 
@@ -551,7 +553,7 @@ enum RE_SkyAlphaBlendingType getSkyBlendingMode() {
 }
 
 /* This one renders into collector, as always.                               */
-void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y)
+void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y, float *rco)
 {
 
        switch (keyingType) {
@@ -566,7 +568,7 @@ void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y)
                break;
        case RE_ALPHA_SKY:
                /* Fill in the sky as if it were a normal face. */
-               shadeSkyPixel(collector, x, y);
+               shadeSkyPixel(collector, x, y, rco);
                collector[3]= 0.0;
                break;
        default:
@@ -579,7 +581,7 @@ void renderSkyPixelFloat(RE_COLBUFTYPE *collector, float x, float y)
 /*
   Stuff the sky colour into the collector.
  */
-void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy) 
+void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy, float *rco
 {
        float view[3], dxyview[2];
        
@@ -655,13 +657,13 @@ void shadeSkyPixel(RE_COLBUFTYPE *collector, float fx, float fy)
                }
        
                /* get sky colour in the collector */
-               shadeSkyPixelFloat(collector, view, dxyview);
+               shadeSkyPixelFloat(collector, rco, view, dxyview);
                collector[3] = 1.0f;
        }
 }
 
 /* Only view vector is important here. Result goes to colf[3] */
-void shadeSkyPixelFloat(float *colf, float *view, float *dxyview)
+void shadeSkyPixelFloat(float *colf, float *rco, float *view, float *dxyview)
 {
        float lo[3], zen[3], hor[3], blend, blendm;
        
@@ -698,7 +700,7 @@ void shadeSkyPixelFloat(float *colf, float *view, float *dxyview)
                        SWAP(float, lo[1],  lo[2]);
                        
                }
-               do_sky_tex(lo, dxyview, hor, zen, &blend);
+               do_sky_tex(rco, lo, dxyview, hor, zen, &blend);
        }
 
        if(blend>1.0) blend= 1.0;
index d9f94c0be60b3cd2900ce86034cfcee2f6430a89..df914f96283076718e03313cf8db66ddaa751c28 100644 (file)
@@ -1623,7 +1623,7 @@ static void traceray(short depth, float *start, float *vec, float *col, VlakRen
                VECCOPY(shi.view, vec);
                Normalise(shi.view);
                
-               shadeSkyPixelFloat(col, shi.view, NULL);
+               shadeSkyPixelFloat(col, shi.view, NULL, isec.start);
        }
 }
 
@@ -2118,7 +2118,7 @@ void ray_ao(ShadeInput *shi, World *wrld, float *shadfac)
                                        shadfac[2]+= (1.0-fac)*R.wrld.horb + fac*R.wrld.zenb;
                                }
                                else {
-                                       shadeSkyPixelFloat(skycol, view, NULL);
+                                       shadeSkyPixelFloat(skycol, view, NULL, isec.start);
                                        shadfac[0]+= skycol[0];
                                        shadfac[1]+= skycol[1];
                                        shadfac[2]+= skycol[2];
index 98c82019fa4f1f1f4958b783b0c9a0928cacdd2a..911a1c8fb1495b629b9978c2ee17907c8f07e574 100644 (file)
@@ -158,7 +158,7 @@ void RE_sky_char(float *view, char *col)
 
        dither_value = ( (BLI_frand()-0.5)*R.r.dither_intensity)/256.0; 
        
-       shadeSkyPixelFloat(colf, view, NULL);
+       shadeSkyPixelFloat(colf, view, view, NULL);
        
        f= 255.0*(colf[0]+dither_value);
        if(f<=0.0) col[0]= 0; else if(f>255.0) col[0]= 255;
@@ -2096,7 +2096,7 @@ static float isec_view_line(float *view, float *v3, float *v4)
   
 /* x,y: window coordinate from 0 to rectx,y */
 /* return pointer to rendered face */
-void *shadepixel(float x, float y, int z, int facenr, int mask, float *col)
+void *shadepixel(float x, float y, int z, int facenr, int mask, float *col, float *rco)
 {
        ShadeResult shr;
        ShadeInput shi;
@@ -2115,6 +2115,7 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col)
        
        if(facenr==0) { /* sky */
                col[0]= 0.0; col[1]= 0.0; col[2]= 0.0; col[3]= 0.0;
+               VECCOPY(rco, col);
        }
        else if( (facenr & 0x7FFFFF) <= R.totvlak) {
                VertRen *v1, *v2, *v3;
@@ -2210,6 +2211,8 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col)
                                }
                        }
                }
+               /* rco might be used for sky texture */
+               VECCOPY(rco, shi.co);
                
                /* cannot normalise earlier, code above needs it at pixel level */
                fac= Normalise(shi.view);
@@ -2382,15 +2385,15 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col)
 static void shadepixel_sky(float x, float y, int z, int facenr, int mask, float *colf)
 {
        VlakRen *vlr;
-       float collector[4];
+       float collector[4], rco[3];
        
-       vlr= shadepixel(x, y, z, facenr, mask, colf);
+       vlr= shadepixel(x, y, z, facenr, mask, colf, rco);
        if(colf[3] != 1.0) {
                /* bail out when raytrace transparency (sky included already) */
                if(vlr && (R.r.mode & R_RAYTRACE))
                        if(vlr->mat->mode & MA_RAYTRANSP) return;
-
-               renderSkyPixelFloat(collector, x, y);
+               
+               renderSkyPixelFloat(collector, x, y, vlr?rco:NULL);
                addAlphaOverFloat(collector, colf);
                QUATCOPY(colf, collector);
        }
index 55e546a89f93a673504860bb759ffdc1387526aa..3653b82f581d78b7b84b4d6110070fae9cb4568d 100644 (file)
@@ -1965,7 +1965,7 @@ void do_halo_tex(HaloRen *har, float xn, float yn, float *colf)
 /* ------------------------------------------------------------------------- */
 
 /* hor and zen are RGB vectors, blend is 1 float, should all be initialized */
-void do_sky_tex(float *lo, float *dxyview, float *hor, float *zen, float *blend)
+void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, float *blend)
 {
        MTex *mtex;
        TexResult texres;
@@ -2033,6 +2033,22 @@ void do_sky_tex(float *lo, float *dxyview, float *hor, float *zen, float *blend)
                                        MTC_Mat4MulVecfl(mtex->object->imat, tempvec);
                                        co= tempvec;
                                }
+                               break;
+                               
+                       case TEXCO_GLOB:
+                               if(rco) {
+                                       VECCOPY(tempvec, rco);
+                                       MTC_Mat4MulVecfl(R.viewinv, tempvec);
+                                       co= tempvec;
+                               }
+                               else
+                                       co= lo;
+                               
+//                             VECCOPY(shi->dxgl, shi->dxco);
+//                             MTC_Mat3MulVecfl(R.imat, shi->dxco);
+//                             VECCOPY(shi->dygl, shi->dyco);
+//                             MTC_Mat3MulVecfl(R.imat, shi->dyco);
+                               break;
                        }
                        
                        /* placement */                 
index b5b70aa0e0d43d3c497eb22b3aa69e8fda1fb9e8..5ab38b589e832cdfd5682cb172862c8960f1a58c 100644 (file)
@@ -594,7 +594,6 @@ static int composeStack(int zrow[][RE_PIXELFIELDSIZE], RE_COLBUFTYPE *collector,
        VlakRen *vlr= NULL;
     float  xs = 0.0;
     float  ys = 0.0;  /* coordinates for the render-spot              */
-
     float  alphathreshold[RE_MAX_OSA_COUNT];
        float colbuf[4];
     int    inconflict          = 0;
@@ -714,7 +713,7 @@ static int composeStack(int zrow[][RE_PIXELFIELDSIZE], RE_COLBUFTYPE *collector,
        ys= (float)y;
 
        /* code identical for rendering empty sky pixel */
-       renderSkyPixelFloat(collector, xs, ys);
+       renderSkyPixelFloat(collector, xs, ys, NULL);
        cpFloatColV(collector, colbuf);
 
        if(R.flag & R_LAMPHALO) {
@@ -1011,7 +1010,7 @@ static zbufline zb1, zb2;
 
 static void renderZBufLine(int y, RE_COLBUFTYPE *colbuf1, RE_COLBUFTYPE *colbuf2, RE_COLBUFTYPE *colbuf3) 
 {
-     RE_APixstrExt *ap;       /* iterator for the face-lists                  */
+       RE_APixstrExt *ap;       /* iterator for the face-lists                  */
        RE_COLBUFTYPE  collector[4];
        RE_COLBUFTYPE  sampcol[RE_MAX_OSA_COUNT * 4];
     RE_COLBUFTYPE *j = NULL; /* generic pixel pointer                        */
@@ -1057,7 +1056,7 @@ static void renderZBufLine(int y, RE_COLBUFTYPE *colbuf1, RE_COLBUFTYPE *colbuf2
                        
                        /* This is a bit dirty. Depending on sky-mode, the pixel is      */
                        /* blended in differently.                                       */
-                       renderSkyPixelFloat(collector, x, y);
+                       renderSkyPixelFloat(collector, x, y, NULL);
                        
                        j = sampcol;
                        for(i = 0; i < osaNr; i++, j+=4) { 
index b99f4d8e76876d25e69a75e242483b8a729ead0d..f7480c4cb2f17a57116f7d5cf03c84f65b329476 100644 (file)
@@ -2695,6 +2695,7 @@ int vergzvlak(const void *a1, const void *a2)
  */
 static void shadetrapixel(float x, float y, int z, int facenr, int mask, float *fcol)
 {
+       float rco[3];
        
        if( (facenr & 0x7FFFFF) > R.totvlak) {
                printf("error in shadetrapixel nr: %d\n", (facenr & 0x7FFFFF));
@@ -2708,7 +2709,7 @@ static void shadetrapixel(float x, float y, int z, int facenr, int mask, float *
                if(vlr->flag & R_FULL_OSA) {
                        for(a=0; a<R.osa; a++) {
                                if(mask & (1<<a)) {
-                                       shadepixel(x+jit[a][0], y+jit[a][1], z, facenr, 1<<a, fcol);
+                                       shadepixel(x+jit[a][0], y+jit[a][1], z, facenr, 1<<a, fcol, rco);
                                        accumcol[0]+= fcol[0];
                                        accumcol[1]+= fcol[1];
                                        accumcol[2]+= fcol[2];
@@ -2729,11 +2730,11 @@ static void shadetrapixel(float x, float y, int z, int facenr, int mask, float *
                        int b= centmask[mask];
                        x= x+centLut[b & 15];
                        y= y+centLut[b>>4];
-                       shadepixel(x, y, z, facenr, mask, fcol);
+                       shadepixel(x, y, z, facenr, mask, fcol, rco);
        
                }
        }
-       else shadepixel(x, y, z, facenr, mask, fcol);
+       else shadepixel(x, y, z, facenr, mask, fcol, rco);
 }
 
 static int addtosampcol(float *sampcol, float *fcol, int mask)
index 98d4d5d537ff6e8a9ff47738805704dcf15ac4d4..eac6964f18754c66db9140f525ccd45b0aeeb1a6 100644 (file)
@@ -1781,10 +1781,10 @@ static void world_panel_mapto(World *wrld)
        
        /* MAP TO */
        uiBlockBeginAlign(block);
-       uiDefButBitS(block, TOG, WOMAP_BLEND, B_MATPRV, "Blend",                10,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour progression of the background");
+       uiDefButBitS(block, TOG, WOMAP_BLEND, B_MATPRV, "Blend",        10,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour progression of the background");
        uiDefButBitS(block, TOG, WOMAP_HORIZ, B_MATPRV, "Hori",         85,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the horizon");
-       uiDefButBitS(block, TOG, WOMAP_ZENUP, B_MATPRV, "ZenUp",                160,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith above");
-       uiDefButBitS(block, TOG, WOMAP_ZENDOWN, B_MATPRV, "ZenDo",              235,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith below");
+       uiDefButBitS(block, TOG, WOMAP_ZENUP, B_MATPRV, "ZenUp",        160,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith above");
+       uiDefButBitS(block, TOG, WOMAP_ZENDOWN, B_MATPRV, "ZenDo",      235,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith below");
        uiBlockEndAlign(block);
 
        uiBlockBeginAlign(block);
@@ -1857,21 +1857,24 @@ static void world_panel_texture(World *wrld)
 
        /* TEXCO */
        uiBlockBeginAlign(block);
-       uiDefButS(block, ROW, B_MATPRV, "View",                 100,110,45,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses global coordinates for the texture coordinates");
-       uiDefButS(block, ROW, B_MATPRV, "AngMap",               145,110,55,20, &(mtex->texco), 4.0, (float)TEXCO_ANGMAP, 0, 0, "Uses 360 degree angular coordinates, e.g. for spherical light probes");
-       uiDefButS(block, ROW, B_MATPRV, "Sphere",               200,110,55,20, &(mtex->texco), 4.0, (float)TEXCO_H_SPHEREMAP, 0, 0, "For 360 degree panorama sky, spherical mapped, only top half");
-       uiDefButS(block, ROW, B_MATPRV, "Tube",                 255,110,45,20, &(mtex->texco), 4.0, (float)TEXCO_H_TUBEMAP, 0, 0, "For 360 degree panorama sky, cylindrical mapped, only top half");
-       uiDefButS(block, ROW, B_MATPRV, "Object",               100,90,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates");
-       uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_MATPRV, "", 170,90,130,20, &(mtex->object), "");
+       uiDefButS(block, ROW, B_MATPRV, "View",         100,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses view vector for the texture coordinates");
+       uiDefButS(block, ROW, B_MATPRV, "Global",       200,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates (interior mist)");
+       
+       uiDefButS(block, ROW, B_MATPRV, "AngMap",       100,90,70,20, &(mtex->texco), 4.0, (float)TEXCO_ANGMAP, 0, 0, "Uses 360 degree angular coordinates, e.g. for spherical light probes");
+       uiDefButS(block, ROW, B_MATPRV, "Sphere",       170,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_SPHEREMAP, 0, 0, "For 360 degree panorama sky, spherical mapped, only top half");
+       uiDefButS(block, ROW, B_MATPRV, "Tube",         235,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_TUBEMAP, 0, 0, "For 360 degree panorama sky, cylindrical mapped, only top half");
+       
+       uiDefButS(block, ROW, B_MATPRV, "Object",       100,70,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates");
+       uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_MATPRV, "", 170,70,130,20, &(mtex->object), "");
 
        uiBlockBeginAlign(block);
-       uiDefButF(block, NUM, B_MATPRV, "dX",           100,50,100,19, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate");
-       uiDefButF(block, NUM, B_MATPRV, "dY",           100,30,100,19, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate");
-       uiDefButF(block, NUM, B_MATPRV, "dZ",           100,10,100,19, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate");
+       uiDefButF(block, NUM, B_MATPRV, "dX",           100,40,100,19, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate");
+       uiDefButF(block, NUM, B_MATPRV, "dY",           100,20,100,19, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate");
+       uiDefButF(block, NUM, B_MATPRV, "dZ",           100, 0,100,19, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate");
        uiBlockBeginAlign(block);
-       uiDefButF(block, NUM, B_MATPRV, "sizeX",        200,50,100,19, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size");
-       uiDefButF(block, NUM, B_MATPRV, "sizeY",        200,30,100,19, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size");
-       uiDefButF(block, NUM, B_MATPRV, "sizeZ",        200,10,100,19, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size");
+       uiDefButF(block, NUM, B_MATPRV, "sizeX",        200,40,100,19, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size");
+       uiDefButF(block, NUM, B_MATPRV, "sizeY",        200,20,100,19, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size");
+       uiDefButF(block, NUM, B_MATPRV, "sizeZ",        200, 0,100,19, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size");
        
 }