Пример #1
0
    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);
            }
        }
");
    }
Пример #2
0
    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();
            }}
        }}
");
    }
Пример #3
0
    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(@"        }");
    }
Пример #4
0
    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(@"        }
");
    }
Пример #5
0
    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;
        }
");
    }
Пример #6
0
    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();
            }}
        }}
");
    }