#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Textures.gdshaderinc"

uniform vec4 albedo : source_color;
uniform sampler2D texture_albedo : source_color, filter_linear_mipmap_anisotropic, repeat_enable;
uniform sampler2D texture_opacity:hint_default_white;
uniform float opacity: hint_range(0, 5) = 1;

#ifdef USE_ALPHA_SCISSOR
uniform float alphaScissorTreshold:hint_range(0,1) = 0.4;
#endif

#ifdef USE_ALPHA_DISCARD
uniform float alphaDiscardTreshold:hint_range(0,1) = 0.4;
#endif

uniform sampler2D texture_normal : hint_roughness_normal, filter_linear_mipmap_anisotropic, repeat_enable;
uniform float normal_scale : hint_range(0, 5.0) = 1.0;

uniform sampler2D texture_roughness : hint_roughness_r, filter_linear_mipmap_anisotropic, repeat_enable;
uniform float roughness : hint_range(0.0, 1.0) = 1.0;
uniform float roughnessOffset : hint_range(-1.0, 1.0) = 0.0;

uniform sampler2D texture_metallic : hint_default_black, filter_linear_mipmap_anisotropic, repeat_enable;
uniform float metallic : hint_range(0.0, 1.0, 0.01) = 1.0;
uniform float metallicOffset : hint_range(-1.0, 1.0) = 0.0;

uniform float specular : hint_range(0.0, 1.0);

uniform sampler2D texture_ambient_occlusion : hint_default_white, filter_linear_mipmap_anisotropic, repeat_enable;
uniform float ao_light_affect : hint_range(0.0, 1.0) = 1.0;
uniform float ambientOcclusionAmount : hint_range(0.0, 2.0) = 1.0;
uniform float ambientOcclusionOffset : hint_range(-1.0, 1.0) = 0.0;

uniform float rim : hint_range(0.0, 1.0);
uniform float rim_tint : hint_range(0.0, 1.0);

uniform sampler2D texture_emission : source_color, hint_default_black, filter_linear_mipmap_anisotropic, repeat_enable;
uniform vec4 emission : source_color;
uniform float emission_energy : hint_range(0.0, 100.0);


uniform vec3 uv1_scale;
uniform vec3 uv1_offset;

void vertex() 
{
	UV = UV * uv1_scale.xy + uv1_offset.xy;
}

void fragment() 
{
	
	ALPHA *= sampleAlpha( texture_opacity, texture_albedo, UV, albedo, opacity );
  
  #ifdef USE_ALPHA_SCISSOR

    ALPHA_SCISSOR_THRESHOLD = alphaScissorTreshold;

  #endif

  #ifdef USE_ALPHA_DISCARD
  
    if ( ALPHA < alphaDiscardTreshold )
    {
      discard;
    }
  
  #endif

  ALBEDO = sampleRGB( texture_albedo, UV, albedo );
  

	METALLIC  = sampleRed( texture_metallic, UV, metallic, metallicOffset );
	SPECULAR  = specular;
  ROUGHNESS = sampleRed( texture_roughness, UV, roughness, roughnessOffset );

	NORMAL_MAP = sampleRGB( texture_normal, UV );
	NORMAL_MAP_DEPTH = normal_scale;

	EMISSION = sampleEmission( texture_emission, UV, emission_energy, emission );  
  
	RIM = rim;
	RIM_TINT = rim_tint;

	AO = sampleOcclusion( texture_ambient_occlusion, UV, ambientOcclusionAmount, ambientOcclusionOffset );
	AO_LIGHT_AFFECT = ao_light_affect;

}
