[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12045] trunk/blender/source/blender: * Extra lamp falloff options, including custom curve!

Matt Ebb matt at mke3.net
Sun Sep 16 15:50:34 CEST 2007


Revision: 12045
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12045
Author:   broken
Date:     2007-09-16 15:50:34 +0200 (Sun, 16 Sep 2007)

Log Message:
-----------
* Extra lamp falloff options, including custom curve!

This adds some new lamp attenuation options to the Lamp panel, replacing the old 'Quad' button. Yes, the panel layout is still nasty here, but I've ignored it for now to address properly in the panels cleanup work.

* Constant
http://mke3.net/blender/devel/rendering/falloff-constant.jpg
Lamp doesn't decay with distance

* Inverse Linear
http://mke3.net/blender/devel/rendering/falloff-invlinear.jpg
Default, and same as in older Blender without 'Quad' on. Decays linearly, with 'Dist' value as the lamp's half-energy-distance

* Inverse Square
http://mke3.net/blender/devel/rendering/falloff-invsquare.jpg
A sharper, more realistic decay, good for most electric lights (i.e. not sunlight). This is similar to the old Quad option with slight changes.

* Lin/Quad weighted
Exactly the same as in older Blenders with the old 'Quad' button enabled. When this setting is chosen, two sliders are shown, 'Linear' and 'Quad' (previously Quad1 and Quad2), which controls the 'linearness' or 'quadraticness' of the falloff curve. Lamps in old files with the 'Quad' button on will be initialised to this setting.

But much better for precise control over the lamp falloff now is:

* Custom Curve
This shows an extra 'Falloff Curve' panel, where you can use the standard Blender curve UI control to precisely control how the light falls off. The Y axis is intensity, and the X axis is distance, stretched over the length of the 'Dist' value.

Some example curves and renders:
http://mke3.net/blender/devel/rendering/falloff-curve1-curve.png
http://mke3.net/blender/devel/rendering/falloff-curve1.jpg

http://mke3.net/blender/devel/rendering/falloff-curve2-curve.png
http://mke3.net/blender/devel/rendering/falloff-curve2.jpg

http://mke3.net/blender/devel/rendering/falloff-curve3-curve.png
http://mke3.net/blender/devel/rendering/falloff-curve3.jpg (whee)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/colortools.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/include/BIF_butspace.h
    trunk/blender/source/blender/include/butspace.h
    trunk/blender/source/blender/makesdna/DNA_lamp_types.h
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/shadeoutput.c
    trunk/blender/source/blender/src/buttons_shading.c

Modified: trunk/blender/source/blender/blenkernel/intern/colortools.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/colortools.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/blenkernel/intern/colortools.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -62,12 +62,18 @@
 {
 	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;

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -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 @@
 	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 @@
 		}
 	}
 	
+	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 @@
 	/* 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);

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -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 @@
 	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 @@
 			}
 		}
 	}
+	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;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -1380,6 +1380,9 @@
 				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);

Modified: trunk/blender/source/blender/include/BIF_butspace.h
===================================================================
--- trunk/blender/source/blender/include/BIF_butspace.h	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/include/BIF_butspace.h	2007-09-16 13:50:34 UTC (rev 12045)
@@ -120,16 +120,16 @@
 #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

Modified: trunk/blender/source/blender/include/butspace.h
===================================================================
--- trunk/blender/source/blender/include/butspace.h	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/include/butspace.h	2007-09-16 13:50:34 UTC (rev 12045)
@@ -180,6 +180,7 @@
 #define B_SHADRAY		1106
 #define B_LMTEXPASTE	1107
 #define B_LMTEXCOPY		1108
+#define B_LFALLOFFCHANGED	1109
 
 /* *********************** */
 #define B_MATBUTS		1300

Modified: trunk/blender/source/blender/makesdna/DNA_lamp_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_lamp_types.h	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/makesdna/DNA_lamp_types.h	2007-09-16 13:50:34 UTC (rev 12045)
@@ -43,6 +43,7 @@
 
 struct MTex;
 struct Ipo;
+struct CurveMapping;
 
 typedef struct Lamp {
 	ID id;
@@ -54,7 +55,13 @@
 	
 	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 @@
 #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 @@
 /* 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

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2007-09-16 13:50:34 UTC (rev 12045)
@@ -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 @@
 	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 */

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -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 @@
 	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 @@
 
 	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 @@
 		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);

Modified: trunk/blender/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/shadeoutput.c	2007-09-16 07:27:47 UTC (rev 12044)
+++ trunk/blender/source/blender/render/intern/source/shadeoutput.c	2007-09-16 13:50:34 UTC (rev 12045)
@@ -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,15 +1057,27 @@
 				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]);
+			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;
 			}
-			else {
-				visifac= (lar->dist/(lar->dist+dist[0]));
-			}
 			
 			if(lar->mode & LA_SPHERE) {
 				float t= lar->dist - dist[0];
@@ -1130,6 +1143,8 @@
 	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);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list