Bugfix #17696
authorTon Roosendaal <ton@blender.org>
Mon, 29 Sep 2008 10:26:20 +0000 (10:26 +0000)
committerTon Roosendaal <ton@blender.org>
Mon, 29 Sep 2008 10:26:20 +0000 (10:26 +0000)
- Area lamp with 1 sample still used an offset for the first sample
- Sample buttons were not visible for area without shadow.

source/blender/render/intern/source/rayshade.c
source/blender/src/buttons_shading.c

index 0fd9365477ca6fa67100185899704642fac79875..6c4bd5da1a9dfbc3b0e2a1e7b0a60d49f911cd1f 100644 (file)
@@ -633,24 +633,27 @@ void init_jitter_plane(LampRen *lar)
        /* at least 4, or max threads+1 tables */
        if(BLENDER_MAX_THREADS < 4) x= 4;
        else x= BLENDER_MAX_THREADS+1;
-       fp= lar->jitter= MEM_mallocN(x*tot*2*sizeof(float), "lamp jitter tab");
+       fp= lar->jitter= MEM_callocN(x*tot*2*sizeof(float), "lamp jitter tab");
        
-       /* set per-lamp fixed seed */
-       BLI_srandom(tot);
-       
-       /* fill table with random locations, area_size large */
-       for(x=0; x<tot; x++, fp+=2) {
-               fp[0]= (BLI_frand()-0.5)*lar->area_size;
-               fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
-       }
-       
-       while(iter--) {
-               fp= lar->jitter;
-               for(x=tot; x>0; x--, fp+=2) {
-                       DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
+       /* if 1 sample, we leave table to be zero's */
+       if(tot>1) {
+               
+               /* set per-lamp fixed seed */
+               BLI_srandom(tot);
+               
+               /* fill table with random locations, area_size large */
+               for(x=0; x<tot; x++, fp+=2) {
+                       fp[0]= (BLI_frand()-0.5)*lar->area_size;
+                       fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
                }
-       }
-       
+               
+               while(iter--) {
+                       fp= lar->jitter;
+                       for(x=tot; x>0; x--, fp+=2) {
+                               DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
+                       }
+               }
+       }       
        /* create the dithered tables (could just check lamp type!) */
        jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.0f);
        jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.5f);
index 2fdd1ba2f5008ba5f583628876b6e377ae04772d..2dafa70a350972c13c9f783cc047bf2157cc6c45 100644 (file)
@@ -2722,47 +2722,49 @@ static void lamp_panel_spot(Object *ob, Lamp *la)
                        
                }
        }
-       if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & LA_SHAD_RAY)) {
+       if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL)) {
                
-               if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
-                       if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
-               
-                       uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2",
-                               100,110,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
-               
-                       uiDefButF(block, NUM,B_LAMPREDRAW,"Soft Size",  100,80,200,19, &la->area_size, 0.01, 100.0, 10, 0, "Area light size, doesn't affect energy amount");
+               if(la->mode & LA_SHAD_RAY) {
+                       if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
+                               if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
+                       
+                               uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2",
+                                       100,110,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
                        
-                       uiDefButS(block, NUM,0,"Samples:",      100,60,200,19,  &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
-                       if (la->ray_samp_method == LA_SAMP_HALTON)
-                               uiDefButF(block, NUM,0,"Threshold:",    100,40,200,19,  &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+                               uiDefButF(block, NUM,B_LAMPREDRAW,"Soft Size",  100,80,200,19, &la->area_size, 0.01, 100.0, 10, 0, "Area light size, doesn't affect energy amount");
+                               
+                               uiDefButS(block, NUM,0,"Samples:",      100,60,200,19,  &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
+                               if (la->ray_samp_method == LA_SAMP_HALTON)
+                                       uiDefButF(block, NUM,0,"Threshold:",    100,40,200,19,  &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+                       }
+                       else if (la->type == LA_AREA) {
+                               uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2|Constant Jittered %x0",
+                                       100,180,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest");
+                       
+                               if (la->ray_samp_method == LA_SAMP_CONSTANT) {
+                                       uiBlockBeginAlign(block);
+                                       uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra",                      100,90,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
+                                       uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither",                    100,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
+                                       uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise",                     200,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
+                               } else if (la->ray_samp_method == LA_SAMP_HALTON) {
+                                       uiDefButF(block, NUM,0,"Threshold:",    100,90,200,19,  &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+                               }
+                       }
                }
-               else if (la->type == LA_AREA) {
-                       uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2|Constant Jittered %x0",
-                               100,180,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest");
-               
+               /* also for non-shadow case, it's using light samples */
+               if(la->type == LA_AREA) {
                        if(la->area_shape==LA_AREA_SQUARE) 
                                uiDefButS(block, NUM,0,"Samples:",      100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
                        else if(la->area_shape==LA_AREA_CUBE) 
                                uiDefButS(block, NUM,0,"Samples:",      100,130,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp x samp)");
-
+                       
                        if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_BOX)) {
                                uiDefButS(block, NUM,0,"SamplesX:",     100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of X samples taken extra");
                                uiDefButS(block, NUM,0,"SamplesY:",     100,130,200,19, &la->ray_sampy, 1.0, 16.0, 100, 0, "Sets the amount of Y samples taken extra");
                                if(la->area_shape==LA_AREA_BOX)
                                        uiDefButS(block, NUM,0,"SamplesZ:",     100,110,200,19, &la->ray_sampz, 1.0, 8.0, 100, 0, "Sets the amount of Z samples taken extra");
                        }
-                       
-                       if (la->ray_samp_method == LA_SAMP_CONSTANT) {
-                               uiBlockBeginAlign(block);
-                               uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra",                      100,90,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
-                               uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither",                    100,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
-                               uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise",                     200,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
-                       } else if (la->ray_samp_method == LA_SAMP_HALTON) {
-                               uiDefButF(block, NUM,0,"Threshold:",    100,90,200,19,  &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
-                       }
-               }
-               
-               
+               }                       
        }
        else uiDefBut(block, LABEL,0," ",       100,180,200,19,NULL, 0, 0, 0, 0, "");