rj-action-library/Runtime/Shading/Properties/FloatPropertyName.cs

155 lines
3.5 KiB
C#

using Godot;
using System.Reflection;
using System.Collections.Generic;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class FloatPropertyName : ShaderPropertyName
{
public bool isComponent
{
get
{
if ( propertyName == null || propertyName.Length < 3 )
{
return false;
}
if ( propertyName[ propertyName.Length - 2 ] != '.' )
{
return false;
}
var lastCharacter = propertyName[ propertyName.Length - 1 ] + "";
return "xyzwrgba".IndexOf( lastCharacter.ToLower() ) != -1;
}
}
string GetComponentParentName()
{
if ( ! isComponent )
{
return propertyName;
}
return propertyName.Substring( 0, propertyName.Length - 2 );
}
int componentIndex
{
get
{
if ( ! isComponent )
{
return -1;
}
var lastCharacter = ( propertyName[ propertyName.Length - 1 ] + "" ).ToLower();
return Mathf.Max( "xyzw".IndexOf( lastCharacter ), "rgba".IndexOf( lastCharacter ) );
}
}
public void Set( Material material, float value )
{
if ( isComponent )
{
var member = Shaders.GetUniformMemberByName( material, GetComponentParentName() );
if ( member == null )
{
return;
}
var materialValue = member.Get<Variant>( material );
if ( Variant.Type.Vector2 == materialValue.VariantType )
{
var v2 = materialValue.AsVector3();
v2[ componentIndex ] = value;
member.Set( material, v2 );
}
else if ( Variant.Type.Vector3 == materialValue.VariantType )
{
var v3 = materialValue.AsVector3();
v3[ componentIndex ] = value;
member.Set( material, v3 );
}
else if ( Variant.Type.Vector4 == materialValue.VariantType )
{
var v4 = materialValue.AsVector4();
v4[ componentIndex ] = value;
member.Set( material, v4 );
}
else if ( Variant.Type.Color == materialValue.VariantType )
{
var color = materialValue.AsColor();
color[ componentIndex ] = value;
member.Set( material, color );
}
return;
}
_Set( material, value );
}
public float Get( Material material )
{
if ( isComponent )
{
var member = Shaders.GetUniformMemberByName( material, GetComponentParentName() );
if ( member == null )
{
return 0;
}
var materialValue = member.Get<Variant>( material );
if ( Variant.Type.Vector2 == materialValue.VariantType )
{
var v2 = materialValue.AsVector3();
return v2[ componentIndex ];
}
else if ( Variant.Type.Vector3 == materialValue.VariantType )
{
var v3 = materialValue.AsVector3();
return v3[ componentIndex ];
}
else if ( Variant.Type.Vector4 == materialValue.VariantType )
{
var v4 = materialValue.AsVector4();
return v4[ componentIndex ];
}
else if ( Variant.Type.Color == materialValue.VariantType )
{
var color = materialValue.AsColor();
return color[ componentIndex ];
}
}
return _Get( material, 0f );
}
public static FloatPropertyName Create( string name )
{
var fp = new FloatPropertyName();
fp.propertyName = name;
return fp;
}
}
}