93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using Godot;
 | 
						|
using System;
 | 
						|
using System.Threading.Tasks;
 | 
						|
 | 
						|
namespace Rokojori
 | 
						|
{
 | 
						|
  [Tool]
 | 
						|
  [GlobalClass]
 | 
						|
  public partial class TextureChannelMixer:Action
 | 
						|
  { 
 | 
						|
    [Export]
 | 
						|
    public string inputTexturePath;
 | 
						|
 | 
						|
    [Export]  
 | 
						|
    public string outputTexturePath;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public ImageSaveSettings outputFormat;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public TextureChannelMixerPreset preset;
 | 
						|
 | 
						|
    [ExportGroup("Channel Adjustments")]
 | 
						|
    [Export]
 | 
						|
    public float redMultiply = 1;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float redOffset = 0;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float greenMultiply = 1;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float greenOffset = 0;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float blueMultiply = 1;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float blueOffset = 0;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float alphaMultiply = 1;
 | 
						|
 | 
						|
    [Export]
 | 
						|
    public float alphaOffset = 0;
 | 
						|
 | 
						|
 | 
						|
    protected override void _OnTrigger()
 | 
						|
    {
 | 
						|
      if ( preset == null || 
 | 
						|
           preset.red == null ||
 | 
						|
           preset.green == null ||
 | 
						|
           preset.blue == null ||
 | 
						|
           preset.alpha == null 
 | 
						|
      )
 | 
						|
      { 
 | 
						|
        this.LogError( "The preset is not correctly setup for each channel. Add a preset and for each channel add a setting" );
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      var texture = ResourceLoader.Load<Texture2D>( inputTexturePath );
 | 
						|
      var sourceBuffer = TextureCombinerBuffer.From( texture );
 | 
						|
      var outputBuffer = TextureCombinerBuffer.Create( sourceBuffer.width, sourceBuffer.height );
 | 
						|
 | 
						|
      this.LogInfo( "Processing:", inputTexturePath, ">>", sourceBuffer.numPixels + " pixels" );
 | 
						|
 | 
						|
      for ( int i = 0; i < sourceBuffer.numPixels; i++ )
 | 
						|
      {
 | 
						|
        var sourceColor = sourceBuffer.GetIndexed( i );
 | 
						|
        var outputColor = new Color(
 | 
						|
          preset.red.GetValue( sourceColor ) * redMultiply + redOffset,
 | 
						|
          preset.green.GetValue( sourceColor ) * greenMultiply + greenOffset,
 | 
						|
          preset.blue.GetValue( sourceColor ) * blueMultiply + blueOffset,
 | 
						|
          preset.alpha.GetValue( sourceColor ) * alphaMultiply + redOffset
 | 
						|
        );
 | 
						|
 | 
						|
        outputBuffer.SetIndexed( i, outputColor );
 | 
						|
      }
 | 
						|
 | 
						|
      this.LogInfo( "Saving:", outputTexturePath );
 | 
						|
 | 
						|
      var it = outputBuffer.CreateImageTexture( preset.alpha.isAssigned, false );
 | 
						|
 | 
						|
      var image = it.GetImage();
 | 
						|
      outputFormat.Save( image, outputTexturePath );
 | 
						|
    
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
} |