rj-action-library/Runtime/Shading/Generators/Spatial/TransparencyModule.cs

100 lines
3.3 KiB
C#

using Godot;
using System.Reflection;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class TransparencyModule:ShaderGenerationModule
{
[Export]
public BaseMaterial3D.TransparencyEnum transparency = BaseMaterial3D.TransparencyEnum.Disabled;
[ExportGroup( "Alpha Scissor")]
[Export]
public float alphaScissorTreshold = 0.5f;
[ExportGroup( "")]
[Export]
public BaseMaterial3D.BlendModeEnum blendMode = BaseMaterial3D.BlendModeEnum.Mix;
[Export]
public BaseMaterial3D.CullModeEnum cullMode = BaseMaterial3D.CullModeEnum.Back;
[Export]
public BaseMaterial3D.DepthDrawModeEnum depthDraw = BaseMaterial3D.DepthDrawModeEnum.OpaqueOnly;
[Export]
public bool noDepthTest = false;
public override List<ShaderCode> GetCode( ShaderGenerationContext context )
{
if ( ShaderPhase.Fragment == context.phase )
{
if ( BaseMaterial3D.TransparencyEnum.AlphaScissor == transparency )
{
return Lists.From( (ShaderCode) new StringShaderCode(
"ALPHA_SCISSOR_THRESHOLD = " + RegexUtility.NumberToString( alphaScissorTreshold )
) );
}
return null;
}
if ( ShaderPhase.RenderMode != context.phase )
{
return null;
}
var value = "";
var transparencyModes = new Dictionary<BaseMaterial3D.TransparencyEnum,string>();
transparencyModes[ BaseMaterial3D.TransparencyEnum.Disabled ] = "";
transparencyModes[ BaseMaterial3D.TransparencyEnum.Alpha ] = "";
transparencyModes[ BaseMaterial3D.TransparencyEnum.AlphaScissor ] = "";
transparencyModes[ BaseMaterial3D.TransparencyEnum.AlphaHash ] = "";
transparencyModes[ BaseMaterial3D.TransparencyEnum.AlphaDepthPrePass ] = "depth_prepass_alpha, ";
value += transparencyModes[ transparency ];
var blendModes = new Dictionary<BaseMaterial3D.BlendModeEnum,string>();
blendModes[ BaseMaterial3D.BlendModeEnum.Mix ] = "blend_mix";
blendModes[ BaseMaterial3D.BlendModeEnum.Add ] = "blend_add";
blendModes[ BaseMaterial3D.BlendModeEnum.Mul ] = "blend_mul";
blendModes[ BaseMaterial3D.BlendModeEnum.Sub ] = "blend_sub";
blendModes[ BaseMaterial3D.BlendModeEnum.PremultAlpha ] = "blend_premul_alpha";
value += blendModes[ blendMode ] + ", ";
var cullmodes = new Dictionary<BaseMaterial3D.CullModeEnum,string>();
cullmodes[ BaseMaterial3D.CullModeEnum.Disabled ] = "cull_disabled";
cullmodes[ BaseMaterial3D.CullModeEnum.Front ] = "cull_front";
cullmodes[ BaseMaterial3D.CullModeEnum.Back ] = "cull_back";
value += cullmodes[ cullMode ] + ", ";
var depthModes = new Dictionary<BaseMaterial3D.DepthDrawModeEnum,string>();
depthModes[ BaseMaterial3D.DepthDrawModeEnum.OpaqueOnly ] = "depth_draw_opaque";
depthModes[ BaseMaterial3D.DepthDrawModeEnum.Always ] = "depth_draw_always";
depthModes[ BaseMaterial3D.DepthDrawModeEnum.Disabled ] = "depth_draw_never";
value += depthModes[ depthDraw ] + ", ";
if ( noDepthTest )
{
value += "depth_test_disabled";
}
value = RegexUtility.Replace( value, @"\,\s*$", "" );
return Lists.From( (ShaderCode) new StringShaderCode( value ) );
}
}
}