Texture Combiner
This commit is contained in:
parent
489199f37a
commit
756b1d2a9d
|
@ -2,8 +2,37 @@ using Godot;
|
||||||
|
|
||||||
namespace Rokojori
|
namespace Rokojori
|
||||||
{
|
{
|
||||||
public class ColorX
|
public static class ColorX
|
||||||
{
|
{
|
||||||
|
public static float AlphaMultipliedR( this Color c )
|
||||||
|
{
|
||||||
|
return c.R * c.A;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float AlphaMultipliedG( this Color c )
|
||||||
|
{
|
||||||
|
return c.G * c.A;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float AlphaMultipliedB( this Color c )
|
||||||
|
{
|
||||||
|
return c.B * c.A;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Color Blend( Color bottom, Color top )
|
||||||
|
{
|
||||||
|
var fade = ( 1f - top.A );
|
||||||
|
var a0 = top.A + bottom.A * fade;
|
||||||
|
|
||||||
|
var xR = top.AlphaMultipliedR() + bottom.AlphaMultipliedR() * fade;
|
||||||
|
var xG = top.AlphaMultipliedG() + bottom.AlphaMultipliedG() * fade;
|
||||||
|
var xB = top.AlphaMultipliedB() + bottom.AlphaMultipliedB() * fade;
|
||||||
|
|
||||||
|
var normalizer = 1f / a0;
|
||||||
|
|
||||||
|
return new Color( xR, xG, xB, 1 ) * normalizer;
|
||||||
|
}
|
||||||
|
|
||||||
public static Color Lerp( Color a, Color b, float amount )
|
public static Color Lerp( Color a, Color b, float amount )
|
||||||
{
|
{
|
||||||
return a.Lerp( b, amount );
|
return a.Lerp( b, amount );
|
||||||
|
@ -40,6 +69,12 @@ namespace Rokojori
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Color FadeAlpha( this Color color, float fade )
|
||||||
|
{
|
||||||
|
color.A = color.A * fade;
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
public static Color SetAlpha( Color color, float alpha )
|
public static Color SetAlpha( Color color, float alpha )
|
||||||
{
|
{
|
||||||
color.A = alpha;
|
color.A = alpha;
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
[Tool]
|
||||||
|
[GlobalClass]
|
||||||
|
public partial class TextureCombiner:Resource
|
||||||
|
{
|
||||||
|
[Export]
|
||||||
|
public TextureCombinerLayer[] layers;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public enum TextureCombinerBlendMode
|
||||||
|
{
|
||||||
|
Normal,
|
||||||
|
Add,
|
||||||
|
Multiply
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TextureCombinerBlendModeAlgorithm
|
||||||
|
{
|
||||||
|
public static void Blend( TextureCombinerBlendMode blendMode, int x, int y, int w, int h, float topOpacity,
|
||||||
|
TextureBuffer<Color> bottom, TextureBuffer<Color> top, TextureBuffer<Color> output
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ( TextureCombinerBlendMode.Normal == blendMode )
|
||||||
|
{
|
||||||
|
BlendNormal( x, y, w, h, topOpacity, bottom, top, output );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BlendNormal( int x, int y, int w, int h, float topOpacity,
|
||||||
|
TextureBuffer<Color> bottom, TextureBuffer<Color> top, TextureBuffer<Color> output )
|
||||||
|
{
|
||||||
|
for ( int i = 0; i < w; i++ )
|
||||||
|
{
|
||||||
|
var rx = x + i;
|
||||||
|
|
||||||
|
for ( int j = 0; j < h; j++ )
|
||||||
|
{
|
||||||
|
var ry = y + j;
|
||||||
|
|
||||||
|
var index = output.ComputeIndexFromPosition( rx, ry );
|
||||||
|
|
||||||
|
var topColor = top.GetIndexed( index ).FadeAlpha( topOpacity );
|
||||||
|
var bottomColor = bottom.GetIndexed( index );
|
||||||
|
|
||||||
|
var outputColor = bottomColor.Blend( topColor );
|
||||||
|
|
||||||
|
output.SetIndexed( index, outputColor );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class TextureBuffer<T>
|
||||||
|
{
|
||||||
|
int _width;
|
||||||
|
public int width => _width;
|
||||||
|
|
||||||
|
int _height;
|
||||||
|
public int height => _height;
|
||||||
|
|
||||||
|
T[] _pixels;
|
||||||
|
|
||||||
|
public static TextureBuffer<T> Create( int w, int h )
|
||||||
|
{
|
||||||
|
var tb = new TextureBuffer<T>();
|
||||||
|
tb._height = h;
|
||||||
|
tb._width = w;
|
||||||
|
tb._pixels = new T[ w * h ];
|
||||||
|
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ComputeIndexFromPosition( int x, int y )
|
||||||
|
{
|
||||||
|
return x + y * _width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAt( int x, int y, T value )
|
||||||
|
{
|
||||||
|
SetIndexed( ComputeIndexFromPosition( x, y ), value );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetIndexed( int index, T value )
|
||||||
|
{
|
||||||
|
_pixels[ index ] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetAt( int x, int y )
|
||||||
|
{
|
||||||
|
return GetIndexed( ComputeIndexFromPosition( x, y ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetIndexed( int index )
|
||||||
|
{
|
||||||
|
return _pixels[ index ];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
[Tool]
|
||||||
|
[GlobalClass]
|
||||||
|
public partial class TextureCombinerLayer:Resource
|
||||||
|
{
|
||||||
|
[Export]
|
||||||
|
public TextureCombinerBlendMode blendMode;
|
||||||
|
|
||||||
|
[Export( PropertyHint.Range, "0,1")]
|
||||||
|
public float opacity = 1;
|
||||||
|
|
||||||
|
public async Task Process( TextureCombinerProcessingRect processingRect )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class TextureCombinerContext
|
||||||
|
{
|
||||||
|
public TextureCombiner combiner;
|
||||||
|
public int imageWidth = 0;
|
||||||
|
public int imageHeight = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class TextureCombinerProcessingRect
|
||||||
|
{
|
||||||
|
public TextureCombinerContext context;
|
||||||
|
public int processingX = 0;
|
||||||
|
public int processingY = 0;
|
||||||
|
public int processingWidht = 0;
|
||||||
|
public int processingHeight = 0;
|
||||||
|
|
||||||
|
public TextureBuffer<Color> output;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue