using Godot; using System.Reflection; using System.Collections.Generic; using Microsoft.VisualBasic; namespace Rokojori { [Tool] [GlobalClass] public partial class ShaderGenerationModule:Resource { public virtual List GetVariantNames() { return new List(){ "" }; } public virtual List GetCode( ShaderGenerationContext context ) { return new List(){}; } public List ToCode( params string[] values ) { return Lists.From( (ShaderCode)new StringShaderCode( Lists.From( values ).Join( "" ) ) ); } public List ToCode( string value ) { return Lists.From( (ShaderCode)new StringShaderCode( value ) ); } public List AsUniformGroup( string name, string value ) { var wideName = RegexUtility.UpperCaseAndWide( name ); var blockCode = value.Indent( " ", false ); var code = @$" // [ {wideName} ] group_uniforms {name}; {blockCode} group_uniforms; "; return ToCode( code.Indent( "" ) ); } public List ToInnerBlock( string name, string block ) { var wideName = RegexUtility.UpperCaseAndWide( name ); var blockCode = block.Indent( " ", false ); var code = @$" // [ {wideName} ] {blockCode} "; return ToCode( code.Indent( " " ) ); } public List ToCode( List values ) { return Lists.From( (ShaderCode)new StringShaderCode( Lists.From( values ).Join( "" ) ) ); } public string Uniform( Vector2Property property ) { var name = property.propertyName.propertyName; var x = property.value.X._G(); var y = property.value.Y._G(); return @$"uniform vec2 {name} = vec2( {x}, {y});"; } public string Uniform( string name, float value ) { return @$"uniform float {name} = {value._G()};"; } public string Uniform01( string name, float value ) { return Uniform( name, value, 0, 1 ); } public string Uniform( string name, float value, float min, float max ) { var mi = min._G(); var ma = max._G(); var v = value._G(); return @$"uniform float {name}:hint_range( {mi}, {ma}) = {v};"; } public string UniformSampler( string name, string hints ) { return @$"uniform sampler2D {name}:{hints};"; } public string Uniform( string name, Color color ) { var r = color.R._G(); var g = color.G._G(); var b = color.B._G(); var a = color.A._G(); return @$"uniform vec4 {name}:source_color = vec4( {r}, {g}, {b}, {a});"; } public string Uniform( string name, Vector3 vec ) { var x = vec.X._G(); var y = vec.Y._G(); var z = vec.Z._G(); return @$"uniform vec3 {name} = vec3( {x}, {y}, {z});"; } public string Uniform( string name, Vector4 vec ) { var x = vec.X._G(); var y = vec.Y._G(); var z = vec.Z._G(); var w = vec.W._G(); return @$"uniform vec4 {name} = vec4( {x}, {y}, {z}, {w});"; } } }