using Godot; using Godot.Collections; namespace Rokojori { public class RDProgram { protected RDContext _context; public RDContext context => _context; public RDProgram( RDContext context ) { _context = context; } public enum Type { VertexFragment, Compute } protected Type _type; public Type type => _type; protected RDShader _shader; public RDShader shader => _shader; protected RDPipeline _pipeline; public RDPipeline pipeline => _pipeline; public static RDProgram ComputeFromPath( RDContext context, string path ) { var p = new RDProgram( context ); p._shader = RDShader.FromPath( context, path ); if ( p._shader == null || ! p._shader.rid.IsValid ) { context.Error( "Invalid shader", path ); return null; } p._pipeline = RDPipeline.CreateCompute( context, p._shader ); if ( p._pipeline == null || ! p._pipeline.rid.IsValid ) { context.Error( "Invalid pipeline", path ); return null; } return p; } } public static RDProgram RenderFromPath( RDContext context, string path, RDRenderPipelineSetup setup ) { var p = new RDProgram( context ); p._shader = RDShader.FromPath( context, path ); if ( p._shader == null || ! p._shader.rid.IsValid ) { context.Error( "Invalid shader", path ); return null; } p._pipeline = RDPipeline.CreateRender( context, p._shader, setup ); if ( p._pipeline == null || ! p._pipeline.rid.IsValid ) { context.Error( "Invalid pipeline", path ); return null; } return p; } } } }