rj-action-library/Runtime/Shading/Generators/Spatial/UV/UVScaleOffset.cs

81 lines
1.9 KiB
C#
Raw Normal View History

using Godot;
using System.Reflection;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class UVScaleOffset:UVModifier
{
[Export]
2025-09-26 12:00:59 +00:00
public bool uvScale = true;
[Export]
2025-09-26 12:00:59 +00:00
public bool uvUniScale = false;
[Export]
2025-09-26 12:00:59 +00:00
public bool uvOffset = true;
[Export]
2025-09-26 12:00:59 +00:00
public bool uvScrolling = true;
2025-09-21 07:35:17 +00:00
public override List<ShaderCode> ModifyUV( ShaderGenerationContext context, string uvTarget )
{
2025-09-26 12:00:59 +00:00
var uvScale = ! this.uvScale ? null : Vector2Property.Create( uvTarget + "_scale", Vector2.One );
var uvUniScale = ! this.uvUniScale ? null : FloatProperty.Create( uvTarget + "_scaleAll", 1f );
var uvOffset = ! this.uvOffset ? null : Vector2Property.Create( uvTarget + "_offset", Vector2.Zero );
var uvScrolling = ! this.uvScrolling ? null : Vector2Property.Create( uvTarget + "_scrolling", Vector2.Zero );
if ( ShaderPhase.Variables == context.phase )
{
var lines = new List<string>();
2025-09-26 12:00:59 +00:00
Lists.From<ShaderProperty>( uvScale, uvUniScale, uvOffset, uvScrolling ).FilterNulls().ForEach(
( p )=>
{
2025-09-26 12:00:59 +00:00
lines.Add( UniformFor( p ) + "\n" );
}
);
2025-09-26 12:00:59 +00:00
return AsUniformGroup( uvTarget, lines.Join( "" ) );
}
if ( ShaderPhase.Vertex == context.phase )
{
2025-09-26 12:00:59 +00:00
var expression = uvTarget + " = " + uvTarget;
if ( uvScale != null )
{
expression += " * " + uvScale.name;
}
2025-09-26 12:00:59 +00:00
if ( uvUniScale != null )
{
expression += " * " + uvUniScale.name;
}
if ( uvOffset != null )
{
expression += " + " + uvOffset.name;
}
if ( uvScrolling != null )
2025-09-26 12:00:59 +00:00
{
expression += " + TIME * " + uvScrolling.name;
}
2025-09-26 12:00:59 +00:00
expression += ";\n";
2025-09-26 12:00:59 +00:00
return ToUnsortableCode( expression.Indent( " " ) );
}
return null;
}
}
}