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

83 lines
1.8 KiB
C#

using Godot;
using System.Reflection;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class VertexUVSource:UVSource
{
[Export]
public VertexTransformSpace space;
[Export]
public VertexSwizzleType dimensions;
[Export]
public string sizeCustomName;
[Export]
public string centerCustomName;
public override List<ShaderCode> GetUV( ShaderGenerationContext context, string target, int offsetIndex )
{
var size = sizeCustomName == null ? "vertexUVSourceSize" : sizeCustomName;
var center = centerCustomName == null ? "vertexUVSourceCenter" : centerCustomName;
var suffix = offsetIndex == 0 ? "" : ( "_" + ( offsetIndex + 1 ) );
size += suffix;
center += suffix;
if ( ShaderPhase.Includes == context.phase )
{
return ShaderGenerationModule.IncludeUVLibrary();
}
else if ( ShaderPhase.Variables == context.phase )
{
var uniforms =
@$"
uniform vec2 {size};
uniform vec2 {center};
";
return ShaderGenerationModule.ToCode( uniforms.Indent( "" ) );
}
if ( ShaderPhase.Vertex != context.phase )
{
return null;
}
var member = ( dimensions + "" ).ToLower();
var vertex = "VERTEX";
if ( VertexTransformSpace.World == space )
{
vertex = "localToWorld( VERTEX, MODEL_MATRIX )";
}
else if ( VertexTransformSpace.View == space )
{
vertex = "localToView( VERTEX, MODELVIEW_MATRIX )";
}
var code =
@$"
{{
vec3 vertex = {vertex};
{target} = mapUV( vertex.{member}, {size}, {center} );
}}
";
return ShaderGenerationModule.ToCode( code.Indent( " ") );
}
}
}