64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|   | #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc" | ||
|  | 
 | ||
|  | void computeNinePatchBorders( vec2 _TEXTURE_PIXEL_SIZE, vec2 renderSize, vec4 pixelBorders,  | ||
|  |                              out vec4 uvBorders, out vec4 scaledBorders ) | ||
|  | { | ||
|  |   vec2 texSize = vec2( 1.0 / _TEXTURE_PIXEL_SIZE.x, 1.0 / _TEXTURE_PIXEL_SIZE.y ); | ||
|  | 
 | ||
|  |   vec2 scale = texSize / renderSize; | ||
|  |   scale = max( scale, vec2( 1, 1 ) ); | ||
|  |    | ||
|  |   float scaling = max( scale.x, scale.y ); | ||
|  |    | ||
|  |   uvBorders = vec4  | ||
|  |   (  | ||
|  |     pixelBorders[ 0 ] / texSize.x,  ( texSize.x - pixelBorders[ 1 ] ) / texSize.x, | ||
|  |      | ||
|  |     pixelBorders[ 2 ] / texSize.y,  ( texSize.y - pixelBorders[ 1 ] ) / texSize.y | ||
|  |   ); | ||
|  |    | ||
|  |   scaledBorders = pixelBorders / scaling; | ||
|  |   scaledBorders[ 1 ] = renderSize.x - scaledBorders[ 1 ]; | ||
|  |   scaledBorders[ 3 ] = renderSize.y - scaledBorders[ 3 ]; | ||
|  | } | ||
|  | 
 | ||
|  | float ninePatchBorderRemap( float value, float borderStart, float borderEnd,  | ||
|  |                    float uvStart, float uvEnd, float maxSize ) | ||
|  | { | ||
|  |   float inMin = borderStart; | ||
|  |   float inMax = borderEnd; | ||
|  |   float outMin = uvStart; | ||
|  |   float outMax = uvEnd; | ||
|  |    | ||
|  |    | ||
|  |   if ( value < borderStart ) | ||
|  |   { | ||
|  |     inMin = 0.0; inMax = borderStart; | ||
|  |     outMin = 0.0; outMax = uvStart; | ||
|  |   } | ||
|  |   else if ( value > borderEnd ) | ||
|  |   { | ||
|  |     inMin = borderEnd; inMax = maxSize; | ||
|  |     outMin = uvEnd; outMax = 1.0; | ||
|  |   } | ||
|  |    | ||
|  |   return map( value, inMin, inMax, outMin, outMax ); | ||
|  |    | ||
|  | } | ||
|  | 
 | ||
|  | vec2 computeNinePatchUV( vec2 _UV, vec2 renderSize, vec4 uvBorders, vec4 scaledBorders ) | ||
|  | { | ||
|  |   vec2 pixelCoord = _UV * renderSize; | ||
|  |    | ||
|  |   float nU = ninePatchBorderRemap(  | ||
|  |     pixelCoord.x, scaledBorders[ 0 ], scaledBorders[ 1 ],  | ||
|  |     uvBorders[ 0 ], uvBorders[ 1 ], renderSize.x | ||
|  |   ); | ||
|  |      | ||
|  |   float nV = ninePatchBorderRemap(  | ||
|  |     pixelCoord.y, scaledBorders[ 2 ], scaledBorders[ 3 ],  | ||
|  |     uvBorders[ 2 ], uvBorders[ 3 ], renderSize.y | ||
|  |   ); | ||
|  |    | ||
|  |   return vec2( nU, nV );  | ||
|  | } |