rj-action-library/Runtime/Shading/Generators/Spatial/Albedo/AlbedoModule.cs

126 lines
2.8 KiB
C#
Raw Normal View History

using Godot;
using System.Reflection;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class AlbedoModule:TextureModule
{
public AlbedoModule()
{
2025-09-26 12:00:59 +00:00
SetDomainNames( "albedo" );
2025-09-17 08:25:03 +00:00
_target = "ALBEDO";
_srgb = true;
2025-09-17 08:25:03 +00:00
_type = TextureChannelType.RGB;
scaleType = TextureChannelType.RGB;
}
2025-09-26 12:00:59 +00:00
[Export]
public TextureFilter filter = TextureFilter.Linear_MipMap_Anisotropic;
[Export]
public bool useTint = true;
[Export]
public bool srgb = true;
2025-09-17 08:25:03 +00:00
[Export]
2025-09-26 12:00:59 +00:00
public bool writeAlpha = false;
2025-09-17 08:25:03 +00:00
[Export]
public bool repeat = true;
2025-09-26 12:00:59 +00:00
[Export]
public string tintVarying = "";
2025-09-17 08:25:03 +00:00
[Export]
public string uvChannel = "UV";
[Export]
public TextureDefault textureDefault = TextureDefault.White;
2025-09-17 08:25:03 +00:00
[Export]
public AssignmentType assignmentType = AssignmentType.Set;
2025-09-26 12:00:59 +00:00
[Export]
public AlbedoOverlayLayer[] overlayLayers = [];
2025-09-17 08:25:03 +00:00
public override void GrabValues()
{
2025-09-17 08:25:03 +00:00
_domainMode = useTint ? DomainMode.Texture_Scale : DomainMode.Texture;
_textureFilter = filter;
_srgb = srgb;
_repeat = repeat;
_textureDefault = textureDefault;
2025-09-17 08:25:03 +00:00
_uvChannel = uvChannel;
_assignmentType = assignmentType;
}
public override List<ShaderVariant> GetVariants( ShaderGenerationContext context )
{
var variants = base.GetVariants( context );
2025-09-26 12:00:59 +00:00
if ( ShaderPhase.Fragment == context.phase )
2025-09-17 08:25:03 +00:00
{
2025-09-26 12:00:59 +00:00
if ( tintVarying != null && tintVarying != "" )
{
var tinting = $"ALBEDO *= {tintVarying}.rgb;\n";
variants = ShaderVariant.CombineVariants( variants, ToVariants( ToCode( tinting ) ) );
}
if ( writeAlpha )
{
var value = GetSampledName() + ".a" ;
if ( useTint )
{
value += " * albedo.a";
}
if ( tintVarying != null && tintVarying != "" )
{
value += $" * {tintVarying}.a";
}
var assignment = " ALPHA *= " + value + ";\n\n";
variants = ShaderVariant.CombineVariants( variants, ToVariants( ToCode( assignment ) ) );
}
2025-09-17 08:25:03 +00:00
}
2025-09-26 12:00:59 +00:00
if ( overlayLayers != null )
2025-09-17 08:25:03 +00:00
{
2025-09-26 12:00:59 +00:00
overlayLayers.ForEach(
( layer )=>
{
var layerName = "albedo" + ( overlayLayers.IndexOf( layer ) + 2 );
var uniformGroup = "albedo" + ( overlayLayers.IndexOf( layer ) + 2 );
layer.uniformGroup = uniformGroup;
var shaderCode = layer.GetOverlayCode( context, layerName, "ALBEDO", "ALBEDO" );
if ( shaderCode == null )
{
return;
}
variants = ShaderVariant.CombineVariants( variants, ToVariants( shaderCode ) );
}
);
2025-09-17 08:25:03 +00:00
}
2025-09-26 12:00:59 +00:00
return variants;
2025-09-17 08:25:03 +00:00
}
2025-09-17 08:25:03 +00:00
}
}