diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 10 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 18 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 3 | ||||
-rw-r--r-- | source/blender/include/BIF_butspace.h | 8 | ||||
-rw-r--r-- | source/blender/include/butspace.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_lamp_types.h | 17 | ||||
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/convertblender.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 31 | ||||
-rw-r--r-- | source/blender/src/buttons_shading.c | 44 |
11 files changed, 129 insertions, 20 deletions
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index fda31d9e7c0..83b014cdd63 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -62,12 +62,18 @@ CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, floa { CurveMapping *cumap; int a; + float clipminx, clipminy, clipmaxx, clipmaxy; cumap= MEM_callocN(sizeof(CurveMapping), "new curvemap"); cumap->flag= CUMA_DO_CLIP; if(tot==4) cumap->cur= 3; /* rhms, hack for 'col' curve? */ - BLI_init_rctf(&cumap->curr, minx, maxx, miny, maxy); + clipminx = MIN2(minx, maxx); + clipminy = MIN2(miny, maxy); + clipmaxx = MAX2(minx, maxx); + clipmaxy = MAX2(miny, maxy); + + BLI_init_rctf(&cumap->curr, clipminx, clipmaxx, clipminy, clipmaxy); cumap->clipr= cumap->curr; cumap->white[0]= cumap->white[1]= cumap->white[2]= 1.0f; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 9f68706716a..751887b9f42 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -70,6 +70,7 @@ #include "BKE_armature.h" #include "BKE_action.h" +#include "BKE_colortools.h" #include "BKE_deform.h" #include "BKE_DerivedMesh.h" #include "BKE_nla.h" @@ -601,6 +602,9 @@ void *add_lamp(char *name) la->ray_samp_method = LA_SAMP_HALTON; la->adapt_thresh = 0.001; la->preview=NULL; + la->falloff_type = LA_FALLOFF_INVLINEAR; + la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f); + curvemapping_initialize(la->curfalloff); return la; } @@ -619,6 +623,8 @@ Lamp *copy_lamp(Lamp *la) } } + lan->curfalloff = curvemapping_copy(la->curfalloff); + id_us_plus((ID *)lan->ipo); if (la->preview) lan->preview = BKE_previewimg_copy(la->preview); @@ -693,13 +699,15 @@ void free_lamp(Lamp *la) /* scriptlinks */ BPY_free_scriptlink(&la->scriptlink); - + for(a=0; a<MAX_MTEX; a++) { mtex= la->mtex[a]; if(mtex && mtex->tex) mtex->tex->id.us--; if(mtex) MEM_freeN(mtex); } la->ipo= 0; + + curvemapping_free(la->curfalloff); BKE_previewimg_free(&la->preview); BKE_icon_delete(&la->id); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 38240ceeafa..624bfedf6cd 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -112,6 +112,7 @@ #include "BKE_action.h" #include "BKE_armature.h" +#include "BKE_colortools.h" #include "BKE_constraint.h" #include "BKE_curve.h" #include "BKE_customdata.h" @@ -1917,6 +1918,11 @@ static void direct_link_lamp(FileData *fd, Lamp *la) for(a=0; a<MAX_MTEX; a++) { la->mtex[a]= newdataadr(fd, la->mtex[a]); } + + la->curfalloff= newdataadr(fd, la->curfalloff); + if(la->curfalloff) + direct_link_curvemapping(fd, la->curfalloff); + la->preview = direct_link_preview_image(fd, la->preview); } @@ -6670,6 +6676,18 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + if(main->versionfile <= 245) { + Lamp *la; + if (main->versionfile != 245 || main->subversionfile < 1) { + for(la=main->lamp.first; la; la= la->id.next) { + if (la->mode & LA_QUAD) la->falloff_type = LA_FALLOFF_SLIDERS; + else la->falloff_type = LA_FALLOFF_INVLINEAR; + + la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f); + curvemapping_initialize(la->curfalloff); + } + } + } if (main->versionfile <= 245) { bScreen *sc; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 90873efb5b9..4f09f51bc87 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1380,6 +1380,9 @@ static void write_lamps(WriteData *wd, ListBase *idbase) if(la->mtex[a]) writestruct(wd, DATA, "MTex", 1, la->mtex[a]); } + if(la->curfalloff) + write_curvemapping(wd, la->curfalloff); + write_scriptlink(wd, &la->scriptlink); write_previews(wd, la->preview); diff --git a/source/blender/include/BIF_butspace.h b/source/blender/include/BIF_butspace.h index 519f3f18a0c..eb2cafad792 100644 --- a/source/blender/include/BIF_butspace.h +++ b/source/blender/include/BIF_butspace.h @@ -120,16 +120,16 @@ extern void validate_editbonebutton_cb(void *bonev, void *namev); #define PANEL_YMAX 210 #define PANEL_XMAX 310 -#define X1CLM 10 +#define X1CLM1 10 -#define X2CLM1 X1CLM +#define X2CLM1 X1CLM1 #define X2CLM2 165 -#define X3CLM1 X1CLM +#define X3CLM1 X1CLM1 #define X3CLM2 113 #define X3CLM3 217 -#define X4CLM1 X1CLM +#define X4CLM1 X1CLM1 #define X4CLM2 77 #define X4CLM3 165 #define X4CLM4 232 diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 44e4e5132eb..4f09ad716d7 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -180,6 +180,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la #define B_SHADRAY 1106 #define B_LMTEXPASTE 1107 #define B_LMTEXCOPY 1108 +#define B_LFALLOFFCHANGED 1109 /* *********************** */ #define B_MATBUTS 1300 diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h index e1d4e4c1cc1..f8cc2378cb1 100644 --- a/source/blender/makesdna/DNA_lamp_types.h +++ b/source/blender/makesdna/DNA_lamp_types.h @@ -43,6 +43,7 @@ struct MTex; struct Ipo; +struct CurveMapping; typedef struct Lamp { ID id; @@ -54,7 +55,13 @@ typedef struct Lamp { float energy, dist, spotsize, spotblend; float haint; + + float att1, att2; /* Quad1 and Quad2 attenuation */ + int pad2; + struct CurveMapping *curfalloff; + short falloff_type; + short pad3; float clipsta, clipend, shadspotsize; float bias, soft; @@ -104,7 +111,7 @@ typedef struct Lamp { #define LA_SHAD_BUF 1 #define LA_HALO 2 #define LA_LAYER 4 -#define LA_QUAD 8 +#define LA_QUAD 8 /* no longer used */ #define LA_NEG 16 #define LA_ONLYSHADOW 32 #define LA_SPHERE 64 @@ -119,6 +126,14 @@ typedef struct Lamp { /* Since it is used with LOCAL lamp, can't use LA_SHAD */ #define LA_YF_SOFT 16384 +/* falloff_type */ +#define LA_FALLOFF_CONSTANT 0 +#define LA_FALLOFF_INVLINEAR 1 +#define LA_FALLOFF_INVSQUARE 2 +#define LA_FALLOFF_CURVE 3 +#define LA_FALLOFF_SLIDERS 4 + + /* buftype, no flag */ #define LA_SHADBUF_REGULAR 0 #define LA_SHADBUF_IRREGULAR 1 diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index b6d1024a081..abcdf417b62 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -32,6 +32,7 @@ /* exposed internal in render module only! */ /* ------------------------------------------------------------------------- */ +#include "DNA_color_types.h" #include "DNA_scene_types.h" #include "DNA_world_types.h" #include "DNA_object_types.h" @@ -324,7 +325,10 @@ typedef struct LampRen { float vec[3]; float xsp, ysp, distkw, inpr; float halokw, halo; + + short falloff_type; float ld1,ld2; + struct CurveMapping *curfalloff; /* copied from Lamp, to decouple more rendering stuff */ /** Size of the shadowbuffer */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index cb31c58ab2f..29b48413ca7 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -66,6 +66,7 @@ #include "BKE_action.h" #include "BKE_curve.h" #include "BKE_customdata.h" +#include "BKE_colortools.h" #include "BKE_constraint.h" #include "BKE_displist.h" #include "BKE_deform.h" @@ -2221,7 +2222,6 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->mode= la->mode; lar->energy= la->energy; - lar->energy= la->energy; if(la->mode & LA_NEG) lar->energy= -lar->energy; lar->vec[0]= -mat[2][0]; @@ -2312,8 +2312,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob) lar->lay= ob->lay & 0xFFFFFF; // higher 8 bits are localview layers + lar->falloff_type = la->falloff_type; lar->ld1= la->att1; lar->ld2= la->att2; + lar->curfalloff = curvemapping_copy(la->curfalloff); if(lar->type==LA_SPOT) { @@ -2965,6 +2967,7 @@ void RE_Database_Free(Render *re) if(lar->jitter) MEM_freeN(lar->jitter); if(lar->shadsamp) MEM_freeN(lar->shadsamp); if(lar->qsa) free_lamp_qmcsampler(lar); + curvemapping_free(lar->curfalloff); } BLI_freelistN(&re->lampren); diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index c8f6bd129c3..f50028e4c83 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -32,6 +32,7 @@ #include "MTC_matrixops.h" #include "BLI_arithb.h" +#include "BKE_colortools.h" #include "BKE_material.h" #include "BKE_texture.h" #include "BKE_utildefines.h" @@ -1056,14 +1057,26 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist) visifac= 0.0f; } else { - if(lar->mode & LA_QUAD) { - if(lar->ld1>0.0f) - visifac= lar->dist/(lar->dist+lar->ld1*dist[0]); - if(lar->ld2>0.0f) - visifac*= lar->distkw/(lar->distkw+lar->ld2*dist[0]*dist[0]); - } - else { - visifac= (lar->dist/(lar->dist+dist[0])); + switch(lar->falloff_type) + { + case LA_FALLOFF_CONSTANT: + visifac = 1.0f; + break; + case LA_FALLOFF_INVLINEAR: + visifac = lar->dist/(lar->dist + dist[0]); + break; + case LA_FALLOFF_INVSQUARE: + visifac = lar->dist / (lar->dist + dist[0]*dist[0]); + break; + case LA_FALLOFF_SLIDERS: + if(lar->ld1>0.0f) + visifac= lar->dist/(lar->dist+lar->ld1*dist[0]); + if(lar->ld2>0.0f) + visifac*= lar->distkw/(lar->distkw+lar->ld2*dist[0]*dist[0]); + break; + case LA_FALLOFF_CURVE: + visifac = curvemapping_evaluateF(lar->curfalloff, 0, dist[0]/lar->dist); + break; } if(lar->mode & LA_SPHERE) { @@ -1130,6 +1143,8 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int vn= shi->vn; view= shi->view; + if (lar->energy == 0.0) return; + /* lampdist, spot angle, area side, ... */ visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist); if(visifac==0.0f) diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 385fd36b698..b11e3bc006d 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -61,6 +61,7 @@ #include "DNA_view3d_types.h" #include "DNA_world_types.h" +#include "BKE_colortools.h" #include "BKE_displist.h" #include "BKE_effect.h" #include "BKE_global.h" @@ -2317,6 +2318,13 @@ void do_lampbuts(unsigned short event) scrarea_queue_winredraw(curarea); } break; + case B_LFALLOFFCHANGED: + la= G.buts->lockpoin; + curvemapping_changed(la->curfalloff, 1); + BIF_undo_push("Edit Lamp falloff curve"); + BIF_preview_changed(ID_LA); + scrarea_queue_winredraw(curarea); + break; } } @@ -2664,6 +2672,28 @@ static void lamp_panel_yafray(Object *ob, Lamp *la) } +static void lamp_panel_falloff(Object *ob, Lamp *la) +{ + uiBlock *block; + rctf butr; + short yco=PANEL_YMAX; + float grid= 0.0; + + /* name "Preview" is abused to detect previewrender offset panel */ + block= uiNewBlock(&curarea->uiblocks, "lamp_panel_falloff", UI_EMBOSS, UI_HELV, curarea->win); + uiNewPanelTabbed("Lamp", "Lamp"); + if(uiNewPanel(curarea, block, "Falloff Curve", "Lamp", PANELX, PANELY, PANELW, PANELH)==0) return; + + if(G.vd) grid= G.vd->grid; + if(grid<1.0) grid= 1.0; + + uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE); + + BLI_init_rctf(&butr, 10.0, 310.0, 10.0, (float)yco); + curvemap_buttons(block, la->curfalloff, 's', B_LFALLOFFCHANGED, B_LAMPREDRAW, &butr); + +} + static void lamp_panel_lamp(Object *ob, Lamp *la) { uiBlock *block; @@ -2701,7 +2731,8 @@ static void lamp_panel_lamp(Object *ob, Lamp *la) } else if( ELEM(la->type, LA_LOCAL, LA_SPOT)) { uiBlockSetCol(block, TH_BUT_SETTING1); - uiDefButBitS(block, TOG, LA_QUAD, B_LAMPPRV,"Quad", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Uses inverse quadratic proportion for light attenuation"); + uiDefButS(block, MENU, B_LAMPREDRAW, "Falloff %t|Constant %x0|Inverse Linear %x1|Inverse Square %x2|Custom Curve %x3|Lin/Quad Weighted %x4|", + 10,150,100,19, &la->falloff_type, 0,0,0,0, "Lamp falloff - intensity decay with distance"); uiDefButBitS(block, TOG, LA_SPHERE, REDRAWVIEW3D,"Sphere", 10,130,100,19,&la->mode, 0, 0, 0, 0, "Sets light intensity to zero for objects beyond the distance value"); } @@ -2725,9 +2756,9 @@ static void lamp_panel_lamp(Object *ob, Lamp *la) uiDefButF(block, COL, B_LAMPPRV, "", 120,52,180,24, &la->r, 0, 0, 0, B_COLLAMP, ""); uiBlockBeginAlign(block); - if (ELEM(la->type, LA_LOCAL, LA_SPOT)) { - uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad1 ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp"); - uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad2 ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp"); + if (ELEM(la->type, LA_LOCAL, LA_SPOT) && (la->falloff_type == LA_FALLOFF_SLIDERS)) { + uiDefButF(block, NUMSLI,B_LAMPPRV,"Linear ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp"); } else if(la->type==LA_AREA) { if(la->k==0.0) la->k= 1.0; @@ -3992,11 +4023,16 @@ void material_panels() void lamp_panels() { Object *ob= OBACT; + Lamp *la = ob->data; if(ob==NULL || ob->type!= OB_LAMP) return; lamp_panel_preview(ob, ob->data); lamp_panel_lamp(ob, ob->data); + + if (ELEM(la->type, LA_SPOT, LA_LOCAL) && (la->falloff_type == LA_FALLOFF_CURVE)) + lamp_panel_falloff(ob, ob->data); + /* switch to yafray lamp panel if yafray enabled */ if (G.scene->r.renderer==R_INTERN) lamp_panel_spot(ob, ob->data); |