rj-action-library/Runtime/Rendering/Objects/RokojoriCompositorContext.cs

185 lines
4.4 KiB
C#
Raw Normal View History

2025-04-23 12:00:43 +00:00
using Godot;
using System.Collections.Generic;
namespace Rokojori
{
public class RokojoriCompositorContext
{
protected RokojoriCompositorEffect _effect;
public RokojoriCompositorEffect effect => _effect;
protected RDShader _shader;
public RDShader shader => _shader;
protected RDPipeline _pipeline;
public RDPipeline pipeline => _pipeline;
public void SetShaderAndPipeline( RDShader shader, RDPipeline pipeline )
{
effect.Verbose( "Set Shader Pipeline", shader, pipeline );
_shader = shader;
_pipeline = pipeline;
}
protected int _view = -1;
public int view => _view;
protected int _effectCallbackType;
public int effectCallbackType => _effectCallbackType;
protected RenderData _renderData;
public RenderData renderData => _renderData;
protected RenderSceneBuffersRD _sceneBuffers;
public RenderSceneBuffersRD sceneBuffers => _sceneBuffers;
protected RenderSceneDataRD _sceneData;
public RenderSceneDataRD sceneData => _sceneData;
protected Vector3I _groups;
public Vector3I groups => _groups;
public Vector2I internalSize => _sceneBuffers.GetInternalSize();
public RDTexture GetScreenColorTexture()
{
return RDTexture.Color( this );
}
public RDTexture GetScreenDepthTexture()
{
return RDTexture.Depth( this );
}
public void Assign_ScreenColorTexture( RDSampler sampler = null, int setIndex = -1 )
{
AssignUniformSet_Texture( GetScreenColorTexture(), sampler, setIndex );
}
public void Assign_ScreenDepthTexture( RDSampler sampler = null, int setIndex = -1 )
{
AssignUniformSet_Texture( GetScreenDepthTexture(), sampler, setIndex );
}
public void AssignUniformSet_Texture( RDTexture texture, RDSampler sampler = null, int setIndex = -1 )
{
// effect.Verbose( "Incoming Uniform Index", setIndex );
if ( setIndex == -1 )
{
setIndex = _uniformSets.Count;
}
// effect.Verbose( "Set Uniform Index", setIndex );
if ( sampler == null )
{
// effect.Verbose( "Adding Image" );
AddUniformSet( RDUniformSet.Image( _effect, texture, setIndex ) );
}
else
{
// effect.Verbose( "Adding Sampler" );
AddUniformSet( RDUniformSet.Sampler( _effect, sampler,texture, setIndex ) );
}
}
List<RDUniformSet> _uniformSets = new List<RDUniformSet>();
public RDPushConstants pushConstants;
public void AddUniformSet( RDUniformSet uniformSet )
{
_uniformSets.Add( uniformSet );
}
public void Clear()
{
_uniformSets.Clear();
pushConstants = null;
}
2025-04-24 13:39:00 +00:00
public void SetGroups( Vector3I groups )
{
this._groups = groups;
}
2025-04-23 12:00:43 +00:00
2025-04-24 13:39:00 +00:00
public void ComputeGroups( int groupSize )
{
ComputeGroups( new Vector3I( groupSize, groupSize, 0 ) );
}
public void ComputeGroups( Vector3I groupSize )
{
var size = sceneBuffers.GetInternalSize();
var xGroups = Mathf.CeilToInt( size.X / (float) groupSize.X );
var yGroups = groupSize.Y == 0 ? 1 : Mathf.CeilToInt( size.Y / (float) groupSize.Y );
var zGroups = groupSize.Z == 0 ? 1 : Mathf.CeilToInt( size.Y / (float) groupSize.Y );
SetGroups( new Vector3I( xGroups, yGroups, zGroups ) );
}
2025-04-23 12:00:43 +00:00
public void Render()
{
try
{
var computeList = RDComputeList.Begin( _effect.rd );
computeList.BindPipeline( pipeline );
_uniformSets.ForEach(
( u )=>
{
computeList.BindUniformSet( u, u.setIndex );
}
);
if ( pushConstants != null )
{
computeList.SetPushConstants( pushConstants );
}
computeList.Dispatch( groups );
computeList.End();
}
catch( System.Exception e )
{
effect.Error( e );
}
Clear();
}
}
public class EditableRokojoriCompositorContext:RokojoriCompositorContext
{
public void SetEffect( RokojoriCompositorEffect effect )
{
this._effect = effect;
}
public void SetRenderData( RenderData renderData, RenderSceneBuffersRD buffers, RenderSceneDataRD sceneData )
{
this._renderData = renderData;
this._sceneBuffers = buffers;
this._sceneData = sceneData;
}
public void SetView( int view )
{
this._view = view;
}
2025-04-24 13:39:00 +00:00
2025-04-23 12:00:43 +00:00
}
}