You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			182 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			182 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
| // MIT License (MIT)
 | |
| // Copyright (c) 2020 Patrick Seeber
 | |
| //
 | |
| // xs_begin
 | |
| // author : '@rubikow'
 | |
| // arg : { id = '0'  name = 'Max Volume'  value = '4'  range = '0 100'  step = '1'  decimal = '0' }
 | |
| // arg : { id = '1'  name = 'Random Seed'  value = '123'  range = '0 10000'  step = '1'  decimal = '2' }
 | |
| // arg : { id = '2'  name = 'Growth Density'  value = '0.3'  range = '0 1'  step = '0.01'  decimal = '2' }
 | |
| // arg : { id = '3'  name = 'Addition Colors'  value = '0'  range = '0 255'  step = '1'  decimal = '0' }
 | |
| // xs_end
 | |
| 
 | |
| float thickness = float(iArgs[0]);
 | |
| float seed = float(iArgs[1]);
 | |
| float density = float(iArgs[2]);
 | |
| float colorRange = float(iArgs[3]);
 | |
| 
 | |
| bool isGrowColor(vec3 v){
 | |
| 	return voxel(v) >= min(i_color_index, i_color_index + colorRange) && voxel(v) <= max(i_color_index, i_color_index + colorRange);
 | |
| }
 | |
| 
 | |
| float random(vec3 v, float seed){
 | |
| 	float n = v.x*v.y*v.z + seed;
 | |
| 
 | |
| 	return abs(fract(sin(1./tan(n) + seed * 1235.342)));
 | |
| }
 | |
| 
 | |
| float minDistanceToWall(vec3 v, float distance){
 | |
| 	
 | |
| 	float minDistance = distance+1.;
 | |
| 	
 | |
| 	for(float x=-distance; x<=distance;x+=1.){
 | |
| 		for(float y=-distance; y<=distance;y+=1.){
 | |
| 			for(float z=-distance; z<=distance;z+=1.){								
 | |
| 				if(voxel(vec3(v.x+x,v.y+y,v.z+z)) != 0. && !isGrowColor(vec3(v.x+x,v.y+y,v.z+z))){
 | |
| 					float d = sqrt(pow(x,2.) + pow(y,2.) + pow(z,2.));
 | |
| 					if(minDistance > d){
 | |
| 						minDistance = d;
 | |
| 					}					
 | |
| 				}
 | |
| 			}			
 | |
| 		}		
 | |
| 	}
 | |
| 	
 | |
| 	return minDistance;
 | |
| }
 | |
| 
 | |
| float getCrowColor(vec3 v){
 | |
| 	float distance = minDistanceToWall(v, thickness);	
 | |
| 	return i_color_index + colorRange * (distance/sqrt(pow(thickness,2.)*3.));
 | |
| }
 | |
| 
 | |
| bool hasWallNextToIt(vec3 v, float distance){
 | |
| 	
 | |
| 	for(float x=-distance; x<=distance;x+=1.){
 | |
| 		for(float y=-distance; y<=distance;y+=1.){
 | |
| 			for(float z=-distance; z<=0;z+=1.){								
 | |
| 				if(voxel(vec3(v.x+x,v.y+y,v.z+z)) != 0. && !isGrowColor(vec3(v.x+x,v.y+y,v.z+z)) ){
 | |
| 					return true;
 | |
| 				}				
 | |
| 			}			
 | |
| 		}		
 | |
| 	}
 | |
| 	
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| int getFlatNeighbors(vec3 v){
 | |
| 	int neighbors = 0;
 | |
| 
 | |
| 	if(isGrowColor(vec3(v.x+1.,v.y+1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x+1.,v.y-1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x-1.,v.y+1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x-1.,v.y-1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x+1.,v.y,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x-1.,v.y,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y-1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y+1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 
 | |
| 	return neighbors;
 | |
| }
 | |
| 
 | |
| int getNeighbors(vec3 v){
 | |
| 	int neighbors = 0;
 | |
| 
 | |
| 	if(isGrowColor(vec3(v.x,v.y,v.z+1.))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y,v.z-1.))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x+1.,v.y,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x-1.,v.y,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y-1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y+1.,v.z))){							
 | |
| 		neighbors++;			
 | |
| 	}
 | |
| 
 | |
| 	return neighbors;
 | |
| }
 | |
| 
 | |
| bool growsDown(vec3 v){	
 | |
| 
 | |
| 	if(isGrowColor(vec3(v.x,v.y,v.z+1.))){							
 | |
| 		return true;
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x+1.,v.y,v.z))){							
 | |
| 		return true;
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x-1.,v.y,v.z))){							
 | |
| 		return true;
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y-1.,v.z))){							
 | |
| 		return true;
 | |
| 	}
 | |
| 	if(isGrowColor(vec3(v.x,v.y+1.,v.z))){							
 | |
| 		return true;
 | |
| 	}
 | |
| 	
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| bool grows(vec3 v){
 | |
| 	int n = getNeighbors(v);
 | |
| 	float r = random(v, seed+float(n));
 | |
| 	if(voxel(v) == 0.){				
 | |
| 		if(hasWallNextToIt(v, 1.) && isGrowColor(v+vec3(0,0,-1.))  && mod(v.x+v.y,13.) == 0.){
 | |
| 			return true;
 | |
| 		}
 | |
| 		if(hasWallNextToIt(v, 1.) && isGrowColor(v+vec3(0,0,1.)) && mod(v.x+v.y,27.) == 0.){
 | |
| 			return true;
 | |
| 		}
 | |
| 		if(hasWallNextToIt(v, 1.) && isGrowColor(v+vec3(0,0,-2.)) && mod(v.x+v.y,13.) == 0.){
 | |
| 			return true;
 | |
| 		}		
 | |
| 		if(hasWallNextToIt(v, 1.) && isGrowColor(v+vec3(0,0,2.)) && mod(v.x+v.y,27.) == 0.){
 | |
| 			return true;
 | |
| 		}
 | |
| 		
 | |
| 		if(hasWallNextToIt(v, 1.) && getFlatNeighbors(v) > 3){
 | |
| 			return true;
 | |
| 		}
 | |
| 		else if(r < (density) - (minDistanceToWall(v,thickness)/thickness)*(density/2.) && hasWallNextToIt(v, thickness) && n > 0 && (growsDown(v) || random(v, seed+5.567) < 0.3)) 
 | |
| 		{
 | |
| 			return true;
 | |
| 		}				
 | |
| 	}
 | |
| 	
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| float grow(vec3 v, float seed){	
 | |
| 	if( grows(v)){
 | |
| 		return getCrowColor(v);		
 | |
| 	}
 | |
| 	return voxel(v);
 | |
| }
 | |
| 
 | |
| float map(vec3 v) {
 | |
| 	return grow(v, seed);
 | |
| } |