static void BuildOutputDescription(StringBuilder sb, VeldridTypeInfo type, VeldridMemberInfo depth) { sb.AppendLine($@" public override OutputDescription? OutputDescription {{ get {{ OutputAttachmentDescription? depthAttachment = {(depth == null ? "null" : $"new(global::{depth.DepthAttachment.Format})")}; OutputAttachmentDescription[] colorAttachments = {{"); bool first = true; foreach (var color in type.Members.Where(x => x.ColorAttachment != null)) { if (!first) { sb.AppendLine(","); } sb.Append($" new(global::{color.ColorAttachment.Format})"); first = false; } sb.AppendLine(@" }; return new OutputDescription(depthAttachment, colorAttachments); } } "); }
static void GenerateSampler(StringBuilder sb, VeldridMemberInfo member, GenerationContext context) { if (member.Symbol is not IFieldSymbol field) { context.Report($"Resource set backing members must be fields (member {member.Symbol.ToDisplayString()} in " + $"{member.Symbol.ContainingType.ToDisplayString()} was a {member.Symbol.GetType().Name})"); return; } /* e.g. * public SamplerHolder Sampler * { * get => _sampler; * set * { * if (_sampler == value) return; * if (_sampler != null) _sampler.PropertyChanged -= PropertyDirty; * _sampler = value; * if (_sampler != null) _sampler.PropertyChanged += PropertyDirty; * Dirty(); * } * } */ var propertyName = VeldridGenUtil.UnderscoreToTitleCase(field.Name); sb.AppendLine($@" public {field.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {propertyName} {{ get => {field.Name}; set {{ if ({field.Name} == value) return; if ({field.Name} != null) {field.Name}.PropertyChanged -= PropertyDirty; {field.Name} = value; if ({field.Name} != null) {field.Name}.PropertyChanged += PropertyDirty; Dirty(); }} }} "); }
static void BuildDispose(StringBuilder sb, VeldridTypeInfo type, VeldridMemberInfo depth) { sb.AppendLine(@" protected override void Dispose(bool disposing) { base.Dispose(disposing);"); if (depth != null) { sb.AppendLine($@" {depth.Symbol.Name}.DeviceTexture?.Dispose();"); sb.AppendLine($@" {depth.Symbol.Name}.DeviceTexture = null;"); } foreach (var member in type.Members.Where(member => member.ColorAttachment != null)) { sb.AppendLine($@" {member.Symbol.Name}.DeviceTexture?.Dispose();"); sb.AppendLine($@" {member.Symbol.Name}.DeviceTexture = null;"); } sb.AppendLine(@" }"); }
static void BuildConstructor(StringBuilder sb, VeldridTypeInfo type, VeldridMemberInfo depth) { var typeName = type.Symbol.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat); sb.AppendLine( $@" public {typeName}(uint width, uint height, string name) : base(width, height, name) {{"); if (depth != null) { sb.AppendLine($@" {depth.Symbol.Name} = new global::UAlbion.Core.Veldrid.Textures.Texture2DHolder(name + "".{depth.Symbol.Name}"");"); } foreach (var color in type.Members.Where(member => member.ColorAttachment != null)) { sb.AppendLine($@" {color.Symbol.Name} = new global::UAlbion.Core.Veldrid.Textures.Texture2DHolder(name + "".{color.Symbol.Name}"");"); } sb.AppendLine(@" } "); }
static void BuildCreateFramebuffer(StringBuilder sb, VeldridTypeInfo type, VeldridMemberInfo depth) { sb.AppendLine(@" protected override Framebuffer CreateFramebuffer(global::Veldrid.GraphicsDevice device) { if (device == null) throw new System.ArgumentNullException(nameof(device));"); if (depth != null) { sb.AppendLine($@" {depth.Symbol.Name}.DeviceTexture = device.ResourceFactory.CreateTexture(new TextureDescription( Width, Height, 1, 1, 1, global::{depth.DepthAttachment.Format}, TextureUsage.DepthStencil, TextureType.Texture2D)); {depth.Symbol.Name}.DeviceTexture.Name = {depth.Symbol.Name}.Name; "); } foreach (var color in type.Members.Where(member => member.ColorAttachment != null)) { sb.AppendLine($@" {color.Symbol.Name}.DeviceTexture = device.ResourceFactory.CreateTexture(new TextureDescription( Width, Height, 1, 1, 1, global::{color.ColorAttachment.Format}, TextureUsage.RenderTarget | TextureUsage.Sampled, TextureType.Texture2D)); {color.Symbol.Name}.DeviceTexture.Name = {color.Symbol.Name}.Name; "); } sb.Append(" var description = new FramebufferDescription("); sb.Append(depth != null ? depth.Symbol.Name + ".DeviceTexture" : "null"); foreach (var member in type.Members.Where(member => member.ColorAttachment != null)) { sb.Append(", "); sb.Append(member.Symbol.Name); sb.Append(".DeviceTexture"); } sb.AppendLine(@"); var framebuffer = device.ResourceFactory.CreateFramebuffer(ref description); framebuffer.Name = Name; return framebuffer; } "); }
static void GenerateUniform(StringBuilder sb, VeldridMemberInfo member, GenerationContext context) { if (member.Symbol is not IFieldSymbol field) { context.Report($"Resource set backing members must be fields (member {member.Symbol.ToDisplayString()} in " + $"{member.Symbol.ContainingType.ToDisplayString()} was a {member.Symbol.GetType().Name})"); return; } /* e.g. * public SingleBuffer<GlobalInfo> GlobalInfo * { * get => _globalInfo; * set * { * if (_globalInfo == value) * return; * _globalInfo = value; * Dirty(); * } * }*/ var propertyName = VeldridGenUtil.UnderscoreToTitleCase(field.Name); sb.AppendLine($@" public {field.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)} {propertyName} {{ get => {field.Name}; set {{ if ({field.Name} == value) return; {field.Name} = value; Dirty(); }} }} "); }