[Bf-committers] cloud/marble/wood bump patch

Ton Roosendaal bf-committers@blender.org
Sat, 10 Jan 2004 13:37:21 +0100


Hi,

Excellent work. This is the correct way, to derive the 'nabla' for  
displacement. :)
It's OK to provide such a patch here, this is code I like to keep track  
of anyway. I will commit it with one little change, and that is  
changing the #define b_ofs to uppercase, as defines usually are in  
Blender code.

Another note; what kind of text editor you use for code? The patch  
contains noise... your editor seems to replace emtpy lines with  
something else. Do you have your editor by default on UNIX end-of-line  
style?

Thanks,

-Ton-


On Saturday, Jan 10, 2004, at 00:25 Europe/Amsterdam, Alfredo de Greef  
wrote:

> Here is a small patch to be able to do correct(?)
> bumpmapping for the cloud/marble and wood textures.
> This breaks or at least changes displacement
> behaviour, so if this is going to be included, this
> should be looked after. Anyway, nothing major, but I
> was told that some might still find this useful.
> I don't know if I have commit rights for this or for
> that matter still don't even know how to commit
> (without causing 'disasters') so I just send it as a
> patch.
>
> Alfredo
>
> __________________________________
> Do you Yahoo!?
> Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
> http://hotjobs.sweepstakes.yahoo.com/signingbonusIndex:  
> ./source/blender/render/intern/source/texture.c
> ===================================================================
> RCS file:  
> /cvsroot/bf-blender/blender/source/blender/render/intern/source/ 
> texture.c,v
> retrieving revision 1.7
> diff -u -r1.7 texture.c
> --- ./source/blender/render/intern/source/texture.c	7 Jan 2004  
> 20:29:21 -0000	1.7
> +++ ./source/blender/render/intern/source/texture.c	9 Jan 2004  
> 23:16:38 -0000
> @@ -173,7 +173,7 @@
>
>  void end_render_texture(Tex *tex)
>  {
> -	
> +
>
>  }
>
> @@ -182,45 +182,13 @@
>  void end_render_textures()
>  {
>  	Tex *tex;
> -	
> +
>  	tex= G.main->tex.first;
>  	while(tex) {
>  		if(tex->id.us) end_render_texture(tex);
>  		tex= tex->id.next;
>  	}
> -	
> -}
> -
> -
> -/* ************************** */
> -
> -static int clouds(Tex *tex, float *texvec)
> -{
> -	float (*turbfunc)(float, float, float, float, int);
> -
> -	if(tex->noisetype==TEX_NOISESOFT) turbfunc= BLI_turbulence;
> -	else turbfunc= BLI_turbulence1;
> -	
> -	Tin= turbfunc(tex->noisesize, texvec[0], texvec[1], texvec[2],  
> tex->noisedepth);
> -
> -	if(tex->stype==1) {
> -
> -		Tr= Tin;
> -		Tg= turbfunc(tex->noisesize, texvec[1], texvec[0], texvec[2],  
> tex->noisedepth);
> -
> -		Tb= turbfunc(tex->noisesize,texvec[1],texvec[2],texvec[0],  
> tex->noisedepth);
> -		
> -		BRICONRGB;
> -		Ta= 1.0;
> -		
> -		return 1;
> -	}
> -	
> -	BRICON;
>
> -	if(tex->flag & TEX_COLORBAND)  return do_colorband(tex->coba);
> -		
> -	return 0;
>  }
>
>  /*  
> ----------------------------------------------------------------------- 
> -- */
> @@ -228,7 +196,7 @@
>  static int blend(Tex *tex, float *texvec)
>  {
>  	float x, y, t;
> -	
> +
>  	if(tex->flag & TEX_FLIPBLEND) {
>  		x= texvec[1];
>  		y= texvec[0];
> @@ -237,7 +205,7 @@
>  		x= texvec[0];
>  		y= texvec[1];
>  	}
> -	
> +
>  	if(tex->stype==0) {	/* lin */
>  		Tin= (1.0+x)/2.0;
>  	}
> @@ -263,7 +231,7 @@
>  		if(Tin<0.0) Tin= 0.0;
>  		if(tex->stype==5) Tin*= Tin;  /* halo */
>  	}
> -	
> +
>  	BRICON;
>  	if(tex->flag & TEX_COLORBAND)  return do_colorband(tex->coba);
>
> @@ -271,65 +239,130 @@
>  }
>
>  /*  
> ----------------------------------------------------------------------- 
> -- */
> +/*  
> *********************************************************************** 
> ** */
> +/* clouds, wood & marble updated to do proper bumpmapping */
> +/* 0.025 seems reasonable value for offset */
> +#define b_ofs 0.025
>
> -static int wood(Tex *tex, float *texvec)
> +static int clouds(Tex *tex, float *texvec)
> +{
> +	float (*turbfunc)(float, float, float, float, int);
> +	int rv=0;	/* return value, int:0, col:1, nor:2, everything:3 */
> +
> +	if (tex->noisetype==TEX_NOISESOFT) turbfunc = BLI_turbulence;
> +	else turbfunc = BLI_turbulence1;
> +
> +	Tin = turbfunc(tex->noisesize, texvec[0], texvec[1], texvec[2],  
> tex->noisedepth);
> +
> +	if (tex->nor!=NULL) {
> +		/* calculate bumpnormal */
> +		tex->nor[0] = Tin - turbfunc(tex->noisesize, texvec[0] + b_ofs,  
> texvec[1], texvec[2], tex->noisedepth);
> +		tex->nor[1] = Tin - turbfunc(tex->noisesize, texvec[0], texvec[1] +  
> b_ofs, texvec[2], tex->noisedepth);
> +		tex->nor[2] = Tin - turbfunc(tex->noisesize, texvec[0], texvec[1],  
> texvec[2] + b_ofs, tex->noisedepth);
> +		rv += 2;
> +	}
> +
> +	if (tex->stype==1) {
> +		/* in this case, int. value should really be computed from color,
> +		   and bumpnormal from that, would be too slow, looks ok as is */
> +		Tr = Tin;
> +		Tg = turbfunc(tex->noisesize, texvec[1], texvec[0], texvec[2],  
> tex->noisedepth);
> +		Tb = turbfunc(tex->noisesize, texvec[1], texvec[2], texvec[0],  
> tex->noisedepth);
> +		BRICONRGB;
> +		Ta = 1.0;
> +		return (rv+1);
> +	}
> +
> +	BRICON;
> +
> +	if (tex->flag & TEX_COLORBAND)  return (rv +  
> do_colorband(tex->coba));
> +
> +	return rv;
> +
> +}
> +
> +/* computes basic wood intensity value at x,y,z */
> +static float wood_int(Tex *tex, float x, float y, float z)
>  {
>  	float (*noisefunc)(float, float, float, float);
> +	float wi=0;
>
> -	if(tex->noisetype==TEX_NOISESOFT) noisefunc= BLI_hnoise;
> -	else noisefunc= BLI_hnoisep;
> +	if (tex->noisetype==TEX_NOISESOFT) noisefunc = BLI_hnoise;
> +	else noisefunc = BLI_hnoisep;
>
> -	
> -	if(tex->stype==0) {
> -		Tin= 0.5+0.5*sin( (texvec[0]+texvec[1]+texvec[2])*10.0 );
> +	if (tex->stype==0)
> +		wi = 0.5 + 0.5*sin((x + y + z)*10.0);
> +	else if (tex->stype==1)
> +		wi = 0.5 + 0.5*sin(sqrt(x*x + y*y + z*z)*20.0);
> +	else if (tex->stype==2) {
> +		wi = noisefunc(tex->noisesize, x, y, z);
> +		wi = 0.5 + 0.5*sin(tex->turbul*wi + (x + y + z)*10.0);
>  	}
> -	else if(tex->stype==1) {
> -		Tin= 0.5+0.5*sin(  
> sqrt(texvec[0]*texvec[0]+texvec[1]*texvec[1]+texvec[2]*texvec[2])*20.0  
> );
> +	else if (tex->stype==3) {
> +		wi = noisefunc(tex->noisesize, x, y, z);
> +		wi = 0.5 + 0.5*sin(tex->turbul*wi + (sqrt(x*x + y*y + z*z))*20.0);
>  	}
> -	else if(tex->stype==2) {
> -		Tin= noisefunc(tex->noisesize, texvec[0], texvec[1], texvec[2]);
> -		Tin= 0.5+  
> 0.5*sin(tex->turbul*Tin+(texvec[0]+texvec[1]+texvec[2])*10.0);
> -	}
> -	else if(tex->stype==3) {
> -		Tin= noisefunc(tex->noisesize, texvec[0], texvec[1], texvec[2]);
> -		Tin= 0.5+  
> 0.5*sin(tex- 
> >turbul*Tin+(sqrt(texvec[0]*texvec[0]+texvec[1]*texvec[1]+texvec[2]*tex 
> vec[2]))*20.0);
> +
> +	return wi;
> +}
> +
> +static int wood(Tex *tex, float *texvec)
> +{
> +	int rv=0;	/* return value, int:0, col:1, nor:2, everything:3 */
> +
> +	Tin = wood_int(tex, texvec[0], texvec[1], texvec[2]);
> +	if (tex->nor!=NULL) {
> +		/* calculate bumpnormal */
> +		tex->nor[0] = Tin - wood_int(tex, texvec[0] + b_ofs, texvec[1],  
> texvec[2]);
> +		tex->nor[1] = Tin - wood_int(tex, texvec[0], texvec[1] + b_ofs,  
> texvec[2]);
> +		tex->nor[2] = Tin - wood_int(tex, texvec[0], texvec[1], texvec[2] +  
> b_ofs);
> +		rv += 2;
>  	}
> -	
> -	
> +
>  	BRICON;
> -	if(tex->flag & TEX_COLORBAND)  return do_colorband(tex->coba);
> -	
> -	return 0;
> -}
> +	if (tex->flag & TEX_COLORBAND)  return (rv +  
> do_colorband(tex->coba));
>
> -/*  
> ----------------------------------------------------------------------- 
> -- */
> +	return rv;
> +}
>
> -static int marble(Tex *tex, float *texvec)
> +/* computes basic marble intensity at x,y,z */
> +static float marble_int(Tex *tex, float x, float y, float z)
>  {
> -	float n;
> +	float n, mi;
>  	float (*turbfunc)(float, float, float, float, int);
>
> -	if(tex->noisetype==TEX_NOISESOFT) turbfunc= BLI_turbulence;
> -	else turbfunc= BLI_turbulence1;
> -	
> -	n= 5.0*(texvec[0]+texvec[1]+texvec[2]);
> +	if (tex->noisetype==TEX_NOISESOFT) turbfunc = BLI_turbulence;
> +	else turbfunc = BLI_turbulence1;
>
> -	Tin = 0.5+0.5*sin(n+tex->turbul*turbfunc(tex->noisesize,  
> texvec[0],texvec[1],texvec[2], tex->noisedepth));
> +	n = 5.0 * (x + y + z);
>
> -	switch (tex->stype) {
> -	case 1:
> -		Tin= sqrt(Tin);
> -		break;
> -	case 2:
> -		Tin= sqrt(Tin);
> -		Tin= sqrt(Tin);
> -		break;
> +	mi = 0.5 + 0.5 * sin(n + tex->turbul*turbfunc(tex->noisesize, x, y,  
> z, tex->noisedepth));
> +	if (tex->stype>=1) {
> +		mi = sqrt(mi);
> +		if (tex->stype==2) mi = sqrt(mi);
>  	}
> -	
> +
> +	return mi;
> +}
> +
> +static int marble(Tex *tex, float *texvec)
> +{
> +	int rv=0;	/* return value, int:0, col:1, nor:2, everything:3 */
> +
> +	Tin = marble_int(tex, texvec[0], texvec[1], texvec[2]);
> +
> + if (tex->nor!=NULL) {
> +		/* calculate bumpnormal */
> +		tex->nor[0] = Tin - marble_int(tex, texvec[0] + b_ofs, texvec[1],  
> texvec[2]);
> +		tex->nor[1] = Tin - marble_int(tex, texvec[0], texvec[1] + b_ofs,  
> texvec[2]);
> +		tex->nor[2] = Tin - marble_int(tex, texvec[0], texvec[1], texvec[2]  
> + b_ofs);
> +		rv += 2;
> +	}
> +
>  	BRICON;
> -	if(tex->flag & TEX_COLORBAND)  return do_colorband(tex->coba);
> -	
> -	return 0;
> +	if (tex->flag & TEX_COLORBAND)  return (rv +  
> do_colorband(tex->coba));
> +
> +	return rv;
>  }
>
>  /*  
> ----------------------------------------------------------------------- 
> -- */
> @@ -341,7 +374,7 @@
>
>  	n= tex->noisedepth;
>  	turb= tex->turbul/5.0;
> -	
> +
>  	x=  sin( ( texvec[0]+texvec[1]+texvec[2])*5.0 );
>  	y=  cos( (-texvec[0]+texvec[1]-texvec[2])*5.0 );
>  	z= -cos( (-texvec[0]-texvec[1]+texvec[2])*5.0 );
> @@ -419,7 +452,7 @@
>  	else noisefunc= BLI_hnoisep;
>
>  	ofs= tex->turbul/200.0;
> -	
> +
>  	b2= noisefunc(tex->noisesize, texvec[0], texvec[1], texvec[2]);
>  	if(tex->stype) ofs*=(b2*b2);
>  	vec[0]= b2-noisefunc(tex->noisesize, texvec[0]+ofs, texvec[1],  
> texvec[2]);
> @@ -436,7 +469,7 @@
>  		tex->nor[1]= -vec[1];
>  		tex->nor[2]= -vec[2];
>  	}
> -	
> +
>  	return 2;
>  }
>
> @@ -471,13 +504,13 @@
>  {
>  	PluginTex *pit;
>  	int rgbnor=0;
> -	
> +
>  	Tin= 0.0;
>
>  	pit= tex->plugin;
>  	if(pit && pit->doit) {
>  		if(tex->nor) {
> -			VECCOPY(pit->result+5, tex->nor);
> +			VECCOPY(pit->result+5, tex->nor);
>  		}
>  		if(osatex) rgbnor= ((TexDoit)pit->doit)(tex->stype, pit->data,  
> texvec, dxt, dyt);
>  		else rgbnor= ((TexDoit)pit->doit)(tex->stype, pit->data, texvec, 0,  
> 0);
> @@ -531,7 +564,7 @@
>  		
>  		if(x==0.0 && y==0.0) *adr1= 0.0;	/* othwise domain error */
>  		else *adr1 = (1.0 - atan2(x,y)/M_PI )/2.0;
> -		
> +
>  		z/=len;
>  		*adr2 = 1.0- saacos(z)/M_PI;
>  	}
> @@ -551,7 +584,7 @@
>  		VECCOPY(nor, vlr->n);
>  	}
>  	MTC_Mat4Mul3Vecfl(R.viewinv, nor);
> -	
> +
>  	x1= fabs(nor[0]);
>  	y1= fabs(nor[1]);
>  	z1= fabs(nor[2]);
> @@ -942,11 +975,11 @@
>  				norvec[0]= norvec[1]= norvec[2]= 0.0;
>  			}
>  			else tex->nor= NULL;
> -			
> +
>  			if(tex->type==TEX_IMAGE) {
> -				
> +
>  				/* new: first swap coords, then map, then trans/scale */
> -				
> +
>  				/* placement */
>  				if(mtex->projx) texvec[0]= co[mtex->projx-1];
>  				else texvec[0]= 0.0;
> @@ -975,7 +1008,7 @@
>  				}
>
>  				do_2d_mapping(mtex, texvec, shi->vlr, dxt, dyt);
> -				
> +
>  				/* translate and scale */
>  				texvec[0]= mtex->size[0]*(texvec[0]-0.5) +mtex->ofs[0]+0.5;
>  				texvec[1]= mtex->size[1]*(texvec[1]-0.5) +mtex->ofs[1]+0.5;
> @@ -991,13 +1024,13 @@
>  				/* placement */
>  				if(mtex->projx) texvec[0]=  
> mtex->size[0]*(co[mtex->projx-1]+mtex->ofs[0]);
>  				else texvec[0]= mtex->size[0]*(mtex->ofs[0]);
> -				
> +
>  				if(mtex->projy) texvec[1]=  
> mtex->size[1]*(co[mtex->projy-1]+mtex->ofs[1]);
>  				else texvec[1]= mtex->size[1]*(mtex->ofs[1]);
> -				
> +
>  				if(mtex->projz) texvec[2]=  
> mtex->size[2]*(co[mtex->projz-1]+mtex->ofs[2]);
>  				else texvec[2]= mtex->size[2]*(mtex->ofs[2]);
> -				
> +
>  				if(shi->osatex) {
>  					if(mtex->projx) {
>  						dxt[0]= mtex->size[0]*dx[mtex->projx-1];
> @@ -1018,9 +1051,9 @@
>  			}
>
>  			rgbnor= multitex(tex, texvec, dxt, dyt, shi->osatex);
> -			
> +
>  			/* texture output */
> -			
> +
>  			if( (rgbnor & TEX_RGB) && (mtex->texflag & MTEX_RGBTOINT)) {
>  				Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
>  				rgbnor-= 1;
> @@ -1062,7 +1095,7 @@
>  					float co= 0.5*cos(Tin-0.5);
>  					float si= 0.5*sin(Tin-0.5);
>  					float f1, f2;
> -					
> +
>  					f1= shi->vn[0];
>  					f2= shi->vn[1];
>  					tex->nor[0]= f1*co+f2*si;
> @@ -1074,10 +1107,10 @@
>  				}
>  			}
>
> -			
> +
>  			/* mapping */
>  			if(mtex->mapto & (MAP_COL+MAP_COLSPEC+MAP_COLMIR)) {
> -				
> +
>  				if((rgbnor & TEX_RGB)==0) {
>  					Tr= mtex->r;
>  					Tg= mtex->g;
> @@ -1178,7 +1211,7 @@
>  					calc_R_ref(shi);
>  				}
>  			}
> -			
> +
>  			if( mtex->mapto & MAP_DISPLACE ) {
>  				/* we check for == here, not '&', to limit it to stucci for now */
>  				/* otherwise image texture bump is used, which is plain ugly */
> @@ -1186,7 +1219,7 @@
>  					if(tex->nor) {
>  						if(mtex->maptoneg & MAP_DISPLACE) tex->norfac= -mtex->norfac;
>  						else tex->norfac= mtex->norfac;
> -	
> +
>  						shi->displace[0]+= Tnor*tex->norfac*tex->nor[0];
>  						shi->displace[1]+= Tnor*tex->norfac*tex->nor[1];
>  						shi->displace[2]+= Tnor*tex->norfac*tex->nor[2];
> @@ -1204,7 +1237,7 @@
>  					else {
>  						factt= (Tin-0.5)*mtex->varfac; facmm= 1.0-factt;
>  					}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND) {
>  						shi->displace[0]= factt*shi->vn[0] + facmm*shi->displace[0];
>  						shi->displace[1]= factt*shi->vn[1] + facmm*shi->displace[1];
> @@ -1230,7 +1263,7 @@
>  					if(Talpha) Tin= Ta;
>  					else Tin= (0.35*Tr+0.45*Tg+0.2*Tb);
>  				}
> -				
> +
>  				fact= Tin*mtex->varfac;
>  				facm= 1.0-fact;
>  				if(mtex->blendtype==MTEX_MUL) facmul= 1.0-mtex->varfac;
> @@ -1239,7 +1272,7 @@
>  				if(mtex->mapto & MAP_REF) {
>  					if(mtex->maptoneg & MAP_REF) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->ref= factt*mtex->def_var+ facmm*mat_ref->ref;
>  					else if(mtex->blendtype==MTEX_MUL)
> @@ -1253,7 +1286,7 @@
>  				if(mtex->mapto & MAP_SPEC) {
>  					if(mtex->maptoneg & MAP_SPEC) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->spec= factt*mtex->def_var+ facmm*mat_spec->spec;
>  					else if(mtex->blendtype==MTEX_MUL)
> @@ -1267,7 +1300,7 @@
>  				if(mtex->mapto & MAP_EMIT) {
>  					if(mtex->maptoneg & MAP_EMIT) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->emit= factt*mtex->def_var+ facmm*mat_emit->emit;
>  					else if(mtex->blendtype==MTEX_MUL)
> @@ -1281,7 +1314,7 @@
>  				if(mtex->mapto & MAP_ALPHA) {
>  					if(mtex->maptoneg & MAP_ALPHA) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->alpha= factt*mtex->def_var+ facmm*mat_alpha->alpha;
>  					else if(mtex->blendtype==MTEX_MUL)
> @@ -1296,7 +1329,7 @@
>  				if(mtex->mapto & MAP_HAR) {
>  					if(mtex->maptoneg & MAP_HAR) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND) {
>  						shi->matren->har= 128.0*factt*mtex->def_var+ facmm*mat_har->har;
>  					} else if(mtex->blendtype==MTEX_MUL) {
> @@ -1310,7 +1343,7 @@
>  				if(mtex->mapto & MAP_RAYMIRR) {
>  					if(mtex->maptoneg & MAP_RAYMIRR) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->ray_mirror= factt*mtex->def_var+  
> facmm*mat_ray_mirr->ray_mirror;
>  					else if(mtex->blendtype==MTEX_MUL)
> @@ -1325,7 +1358,7 @@
>  				if(mtex->mapto & MAP_TRANSLU) {
>  					if(mtex->maptoneg & MAP_TRANSLU) {factt= facm; facmm= fact;}
>  					else {factt= fact; facmm= facm;}
> -					
> +
>  					if(mtex->blendtype==MTEX_BLEND)
>  						shi->matren->translucency= factt*mtex->def_var+  
> facmm*mat_translu->translucency;
>  					else if(mtex->blendtype==MTEX_MUL)
>
------------------------------------------------------------------------ 
--
Ton Roosendaal  Blender Foundation ton@blender.org  
http://www.blender.org