rj-action-library/Runtime/Procedural/Baking/GrabTexture2.cs

135 lines
3.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Godot;
using System;
using System.Linq;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class GrabTexture2:Action
{
[Export]
public SubViewport viewport;
[Export]
public Texture2D target;
[Export]
public MeshInstance3D meshInstance3D;
[ExportToolButton( "Grab Texture")]
public Callable GrabButton => Callable.From(
() =>
{
Grab();
}
);
async void Grab()
{
var updateMode = viewport.RenderTargetUpdateMode;
if ( updateMode != SubViewport.UpdateMode.Always )
{
viewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Always;
await this.RequestNextFrame();
viewport.RenderTargetUpdateMode = updateMode;
}
var viewPortFormat = RDTextureFormats.GetDataFormat( viewport );
var viewPortData = viewport.GetTexture().GetImage().GetData();
var viewPortSize = viewport.Size;
this.LogInfo( "Creating context" );
var ctx = RDContext.Local();
ctx.computeSize = viewPortSize;
ctx.messageLogLevel = Messages.GetLevel( MessageType.Verbose );
this.LogInfo( "Creating textures" );
var outputTexture = RDTexture.Create( ctx, viewport.Size, viewPortFormat );
this.LogInfo( "Usage", RDTextureFormats.UsageInfo( outputTexture.format.UsageBits ) );
var inputTexture = RDTexture.Create( ctx, viewport.Size, viewPortFormat );
inputTexture.SetData( viewPortData );
var graph = CreateGraph( ctx, inputTexture, outputTexture );
graph.ProcessForView();
ctx.SubmitAndSync();
var width = outputTexture.width;
var height = outputTexture.height;
var format = outputTexture.imageFormat;
var data = outputTexture.GetData();
this.LogInfo( "Copying texture" );
ctx.SubmitAndSync();
await this.RequestNextFrame();
var image = Image.CreateFromData( width, height, false, format, data );
var buffer = TextureCombinerBuffer.From( ImageTexture.CreateFromImage( image ) );
target = buffer.CreateImageTexture();
var material3D = (StandardMaterial3D) meshInstance3D.MaterialOverride;
material3D.AlbedoTexture = target;
ctx.CleanUp();
await this.RequestNextFrame();
}
RDGraph CreateGraph( RDContext ctx, RDTexture it, RDTexture ot )
{
var graph = new RDGraph( ctx );
var viewTexture = CEG_BufferTexture.From( graph, it );
var bufferTexture = CEG_BufferTexture.From( graph, ot );
var copy = new CEG_Copy( graph );
var radialBlur = new CEG_RadialBlur( graph );
graph.InitializeNodes();
copy.SetTextureSlotInputs( viewTexture, bufferTexture );
radialBlur.SetTextureSlotInputs( copy.output, copy.input );
graph.SetProcessOrder(
viewTexture, bufferTexture,
copy, radialBlur
);
radialBlur.constants.Set(
new Vector2( 0.5f, 0.5f ),
0.5f,
0.5f,
16,
Vector2.Zero
);
return graph;
}
}
}