77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|   | shader_type spatial; | ||
|  | 
 | ||
|  | uniform vec4 metaBallA; | ||
|  | uniform vec4 metaBallB; | ||
|  | uniform vec4 metaBallC; | ||
|  | uniform vec4 metaBallD; | ||
|  | uniform vec4 metaBallE; | ||
|  | uniform vec4 metaBallF; | ||
|  | uniform float maxReach = 2; | ||
|  | uniform float metaSize = 1; | ||
|  | uniform float maxInfluence = 0.1; | ||
|  | uniform float dotInfluence:hint_range(0.0,1.0) = 0.1; | ||
|  | uniform sampler2D dotInfluenceCurve; | ||
|  | uniform float pointVSdirectionalAttraction:hint_range(0.0,1.0) = 0.5; | ||
|  | uniform sampler2D curve; | ||
|  | 
 | ||
|  | 
 | ||
|  | vec3 getInfluence( vec3 position, vec3 normal, vec4 metaBall, vec3 ownCenter ) | ||
|  | { | ||
|  |   vec3 metaPosition = metaBall.xyz; | ||
|  |   vec3 centerTowardsMeta = metaPosition - ownCenter; | ||
|  |    | ||
|  |   vec3 direction = length( centerTowardsMeta ) == 0.0 ? vec3( 0, 0, 0 ) : normalize( centerTowardsMeta ); | ||
|  |    | ||
|  |   vec3 towardsMeta  = position - metaPosition; | ||
|  |   float distance = length( towardsMeta ); | ||
|  |   vec3 directectedMetaPosition = position + direction * distance; | ||
|  |    | ||
|  |   vec3 influencePosition = mix( metaPosition, directectedMetaPosition, pointVSdirectionalAttraction ); | ||
|  |    | ||
|  |   float dotProduct  = max( 0, dot( normal, normalize( -towardsMeta ) ) ); | ||
|  |    | ||
|  |   dotProduct = texture( dotInfluenceCurve, vec2( dotProduct, 0.0 ) ).r; | ||
|  |    | ||
|  |   float sd = distance - metaSize; | ||
|  |    | ||
|  |   sd = sd/maxReach; | ||
|  |    | ||
|  |   sd = clamp( sd, 0.0, 1.0 ); | ||
|  |    | ||
|  |   float amount = 1.0 - texture( curve, vec2( sd, 0.0 ) ).r; | ||
|  |    | ||
|  |   vec3 influence = mix( influencePosition, position, amount ) - position; | ||
|  |   //influence = vec3( 0, 0, 0 ); | ||
|  |   return influence * ( mix( 1.0, dotProduct, dotInfluence ) ); | ||
|  | } | ||
|  | 
 | ||
|  | void vertex()  | ||
|  | { | ||
|  |   vec3 influence = vec3( 0, 0, 0 ); | ||
|  |   vec3 worldPosition = ( MODEL_MATRIX * vec4( VERTEX, 1.0 ) ).xyz; | ||
|  |   vec3 worldNormal   = NORMAL; | ||
|  |   vec3 ownCenter     = ( MODEL_MATRIX * vec4( 0.00000, 0.00000, 0.00000, 1.0 ) ).xyz; | ||
|  | 
 | ||
|  |     | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallA, ownCenter ); | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallB, ownCenter ); | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallC, ownCenter ); | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallD, ownCenter ); | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallE, ownCenter ); | ||
|  |   influence += getInfluence( worldPosition, worldNormal, metaBallF, ownCenter ); | ||
|  |    | ||
|  |   worldPosition += influence * maxInfluence; | ||
|  |    | ||
|  |   VERTEX = ( inverse( MODEL_MATRIX ) * vec4( worldPosition, 1.0 ) ).xyz;  | ||
|  | } | ||
|  | 
 | ||
|  | void fragment()  | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void light()  | ||
|  | { | ||
|  | 
 | ||
|  | } |