| 
									
										
										
										
											2025-01-03 12:09:23 +00:00
										 |  |  | vec4 triplanarTexture( sampler2D sampler, vec3 weights, vec3 triplanerPosition ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   vec4 sample = vec4( 0.0 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sample += texture( sampler, triplanerPosition.xy ) * weights.z; | 
					
						
							|  |  |  | 	sample += texture( sampler, triplanerPosition.xz ) * weights.y; | 
					
						
							|  |  |  | 	sample += texture( sampler, triplanerPosition.zy * vec2( -1.0, 1.0 ) ) * weights.x; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sample; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-03-27 15:05:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | vec2 heightMapUV( vec3 worldPosition, vec3 terrainSize, vec3 terrainOffset ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   vec3 inTerrain = worldPosition - terrainOffset; | 
					
						
							|  |  |  |   vec3 terrainUV = inTerrain / terrainSize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return vec2( terrainUV.x, terrainUV.z ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec4 fromHeightMap( sampler2D sampler, vec3 worldPosition, vec3 terrainSize, vec3 terrainOffset ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   vec3 inTerrain = worldPosition - terrainOffset; | 
					
						
							|  |  |  |   vec3 terrainUV = inTerrain / terrainSize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return texture( sampler, vec2( terrainUV.x, terrainUV.z ) ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec4 fromHeightMapSmoothed( sampler2D terrain, vec2 terrainUV, vec2 kernelSize, float weightSmoothing ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   vec4 output = vec4( 0, 0, 0, 0 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   float sumW = 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for ( int i = -1; i < 2; i++ )  | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     for ( int j= -1; j < 2; j++ ) | 
					
						
							|  |  |  |     {  | 
					
						
							|  |  |  |       vec2 offset = vec2( kernelSize.x * float(i), kernelSize.y * float(j) ); | 
					
						
							|  |  |  |       float w = 1.0 / ( weightSmoothing + length( offset ) ); | 
					
						
							|  |  |  |       output += texture( terrain, terrainUV + offset ) * w;  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sumW += w; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return output / sumW; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec3 heightMapDirection( sampler2D terrain, vec2 terrainUV, vec2 kernelSize, float normalScale ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   float hL = texture( terrain, terrainUV - vec2( kernelSize.x, 0 ) ).r * normalScale; | 
					
						
							|  |  |  |   float hR = texture( terrain, terrainUV + vec2( kernelSize.x, 0 ) ).r * normalScale; | 
					
						
							|  |  |  |   float hD = texture( terrain, terrainUV - vec2( 0, kernelSize.y ) ).r * normalScale; | 
					
						
							|  |  |  |   float hU = texture( terrain, terrainUV + vec2( 0, kernelSize.y ) ).r * normalScale; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-27 18:31:02 +00:00
										 |  |  |   return vec3( hL - hR, 2.0, hD - hU ); | 
					
						
							| 
									
										
										
										
											2025-03-27 15:05:28 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec3 heightMapNormal( sampler2D terrain, vec2 terrainUV, vec2 kernelSize, float normalScale ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return normalize( heightMapDirection( terrain, terrainUV, kernelSize, normalScale ) ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | vec3 heightMapNormalSmoothed( sampler2D terrain, vec2 terrainUV, vec2 kernelSize, float normalScale, float kernelSpread ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   vec3 n0 = heightMapDirection( terrain, terrainUV, kernelSize, normalScale );  | 
					
						
							|  |  |  |   vec3 n1 = heightMapDirection( terrain, terrainUV, kernelSize * kernelSpread, normalScale ) * 0.5; | 
					
						
							|  |  |  |   vec3 n2 = heightMapDirection( terrain, terrainUV, kernelSize * kernelSpread * kernelSpread, normalScale ) * 0.25; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return normalize( n0 + n1 + n2 ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |