using Godot; using System.Reflection; using System.Collections.Generic; namespace Rokojori { public class Shaders { public static List GetUniformMembersOfStandardMaterial() { var list = new List(); var m = new StandardMaterial3D(); list.AddRange( Lists.Map( ReflectionHelper.GetDataMemberInfos( m ), c => UniformMember.Create( c.Name, Variant.Type.Color ) ) ); list.AddRange( Lists.Map( ReflectionHelper.GetDataMemberInfos( m ), c => UniformMember.Create( c.Name, Variant.Type.Float ) ) ); return list; } public static List GetUniformMembers( Material material ) { if ( material is StandardMaterial3D ) { return GetUniformMembersOfStandardMaterial(); } var shaderMaterial = material as ShaderMaterial; return GetUniformMembers( shaderMaterial.Shader ); } public static List GetUniformMembers( Shader shader ) { var list = new List(); var uniforms = shader.GetShaderUniformList(); foreach ( var u in uniforms ) { var d = u.AsGodotDictionary(); var member = new UniformMember(); member.name = d[ "name" ].AsString(); member.type = (Variant.Type) d[ "type" ].AsInt32(); member.hint = (PropertyHint) d[ "hint" ].AsInt32(); member.hintString = d[ "hint_string" ].AsString(); member.usage = d[ "usage" ].AsInt32(); list.Add( member ); } return list; } public static List GetUniformNames( Shader shader ) { var list = new List(); var uniforms = shader.GetShaderUniformList(); foreach ( var p in uniforms ) { var d = p.AsGodotDictionary(); var name = d[ "name" ].ToString(); list.Add( name ); } return list; } } }