draft: texture button

This commit is contained in:
h z
2025-02-15 08:25:01 +00:00
parent a34fca7581
commit 24a74a6f80
3 changed files with 116 additions and 44 deletions

View File

@@ -53,6 +53,10 @@ public class GlobalRegistryGenerator : ISourceGenerator
.AppendLine(" public static PoloniumRegistry PoloniumRegistry => PoloniumRegistry.Instance;") .AppendLine(" public static PoloniumRegistry PoloniumRegistry => PoloniumRegistry.Instance;")
.AppendLine(" public static bool Paused { get; set; }") .AppendLine(" public static bool Paused { get; set; }")
.AppendLine(" public static HashSet<ITimeConsumer> TimeConsumers { get; } = new ();") .AppendLine(" public static HashSet<ITimeConsumer> TimeConsumers { get; } = new ();")
.AppendLine(" public static void Prepare() => PoloniumRegistry.Prepare();")
.AppendLine(" public static partial class TextureSets")
.AppendLine(" {")
.AppendLine(" }")
.AppendLine("}"); .AppendLine("}");
context.AddSource("GlobalRegistry.g.cs", sb.ToString()); context.AddSource("GlobalRegistry.g.cs", sb.ToString());
} }

View File

@@ -1,44 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
namespace Polonium.Generators.Generators;
[Generator]
public class ProxyNodeGenerator : AssetProcessGenerator
{
private INamedTypeSymbol? NodeProxy { get; set; }
private IEnumerable<INamedTypeSymbol> ProxyNodesInNamespace(INamespaceSymbol ns)
{
foreach (INamespaceOrTypeSymbol member in ns.GetMembers())
{
if (member is INamespaceSymbol nsx)
foreach (INamedTypeSymbol nsz in ProxyNodesInNamespace(nsx))
yield return nsz;
else if (member is INamedTypeSymbol nsu)
if (nsu.GetAttributes().Any(attr => SymbolEqualityComparer.Default.Equals(attr.AttributeClass, NodeProxy)))
yield return nsu;
}
}
public override void Execute(GeneratorExecutionContext context)
{
Compilation compilation = context.Compilation;
NodeProxy = compilation.GetTypeByMetadataName("Polonium.Attributes.ProxyNode");
foreach (INamedTypeSymbol node in ProxyNodesInNamespace(compilation.GlobalNamespace))
{
StringBuilder sb = new();
sb
.AppendLine($"namespace Polonium.Nodes;")
.AppendLine("using Godot;")
.AppendLine($"[GlobalClass]")
.AppendLine($"[Tool]")
.AppendLine($"public partial class {node.Name} : {node.ToDisplayString()}")
.AppendLine("{")
.AppendLine("}");
context.AddSource($"NodeProxy_{node.Name}.g.cs", sb.ToString());
}
}
}

View File

@@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
namespace Polonium.Generators.Generators;
[Generator]
public class TextureSetGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
}
public void Execute(GeneratorExecutionContext context)
{
AdditionalText? t = context.AdditionalFiles.FirstOrDefault(file => file.Path.EndsWith("textures_set.manifest"));
if (t is null)
return;
SourceText? ts = t.GetText();
if (ts is null)
return;
StringBuilder sb0 = new();
sb0
.AppendLine("using System;")
.AppendLine("using Polonium.DataStructures;")
.AppendLine("using System.Collections.Generic;")
.AppendLine("public static partial class GlobalRegistry")
.AppendLine("{")
.AppendLine(" public static Dictionary<TextureSetName, TextureSet> TextureSetMap = new();")
.AppendLine(" public enum TextureSetName")
.AppendLine(" {");
StringBuilder sb1 = new();
sb1
.AppendLine("using System;")
.AppendLine("using Polonium.Attributes;")
.AppendLine("[AutoRegister]")
.AppendLine("public class TextureSetMapRegister")
.AppendLine("{")
.AppendLine(" public static void Register()")
.AppendLine(" {");
foreach (string line in ts.ToString().Split('\n'))
{
if(line.Trim().Length == 0)
continue;
StringBuilder sb = new();
sb
.AppendLine("using System;")
.AppendLine("using Polonium.DataStructures;")
.AppendLine("public static partial class GlobalRegistry")
.AppendLine("{")
.AppendLine(" public static partial class TextureSets")
.AppendLine(" {");
StringBuilder sbx = new();
string[] paths = line.Split('/');
string folderName = paths[paths.Length - 1].Replace(".TextureSet", "");
string indent = " ";
HashSet<string> ignore = new HashSet<string> { "res:", "", "Resources", "ButtonTextureSet", paths[paths.Length - 1]};
string instancePath = "GlobalRegistry.TextureSets";
foreach (string path in paths)
{
if(ignore.Contains(path))
continue;
sb
.AppendLine($"{indent}public static partial class {path}")
.AppendLine($"{indent}{{");
sbx.Insert(0, $"{indent}}}\n");
instancePath += $".{path}";
indent += " ";
}
sb
.AppendLine($"{indent}public static readonly TextureSet {folderName} = new TextureSet(\"{line}\");")
.Append(sbx)
.AppendLine(" }")
.AppendLine("}");
instancePath += $".{folderName}";
string lName = $"{line.Replace("res://", "").Replace("Resources/ButtonTextureSet/", "").Replace('/', '_').Replace(".TextureSet", "").Replace(".", "")}";
sb0.AppendLine($" {lName},");
sb1.AppendLine($" GlobalRegistry.TextureSetMap[GlobalRegistry.TextureSetName.{lName}] = {instancePath};");
context.AddSource($"{lName}.g.cs", sb.ToString());
}
sb0
.AppendLine(" }")
.AppendLine("}");
sb1
.AppendLine(" }")
.AppendLine("}");
//context.AddSource("TextureSetNames.g.cs", sb0.ToString());
context.AddSource("TextureSetMap.g.cs", sb1.ToString());
}
private void ReportLog(string message, GeneratorExecutionContext context)
{
var diagnostic = Diagnostic.Create(
new DiagnosticDescriptor(
id: "TSG001",
title: "Source Generator Log",
messageFormat: message,
category: "SourceGenerator",
DiagnosticSeverity.Info,
isEnabledByDefault: true),
Location.None
);
context.ReportDiagnostic(diagnostic);
}
}