Files
2026-07-13 13:13:17 +08:00

53 lines
1.8 KiB
C#

namespace Lib.render._dx11.api;
[Guid("fbd7f0f0-36a3-4fbb-91e1-cb33d4666d09")]
internal sealed class Rasterizer : Instance<Rasterizer>
{
[Output(Guid = "C723AD69-FF0C-47B2-9327-BD27C0D7B6D1")]
public readonly Slot<Command> Output = new(new Command());
public Rasterizer()
{
Output.UpdateAction += Update;
Output.Value.RestoreAction = Restore;
}
private void Update(EvaluationContext context)
{
var device = ResourceManager.Device;
var deviceContext = device.ImmediateContext;
var rasterizer = deviceContext.Rasterizer;
ScissorRectangles.GetValue(context);
_prevViewports = rasterizer.GetViewports<RawViewportF>();
Viewports.GetValues(ref _viewports, context);
_prevState = rasterizer.State;
var newState = RasterizerState.GetValue(context);
rasterizer.State = newState;
if (_viewports.Length > 0)
rasterizer.SetViewports(_viewports, _viewports.Length);
}
private void Restore(EvaluationContext context)
{
var deviceContext = ResourceManager.Device.ImmediateContext;
var rasterizer = deviceContext.Rasterizer;
rasterizer.SetViewports(_prevViewports, _prevViewports.Length);
rasterizer.State = _prevState;
}
private RawViewportF[] _viewports = new RawViewportF[0];
private RawViewportF[] _prevViewports;
[Input(Guid = "35A52074-1E82-4352-91C3-D8E464F73BC7")]
public readonly InputSlot<RasterizerState> RasterizerState = new();
[Input(Guid = "73945E5D-3C3C-4742-B341-A061B0DC116F")]
public readonly MultiInputSlot<RawViewportF> Viewports = new();
[Input(Guid = "3F71BE22-9DC2-4E47-8B3A-1EF3C9ECBD9D")]
public readonly MultiInputSlot<RawRectangle> ScissorRectangles = new();
private RasterizerState _prevState;
}