From 3cf7e8715577370e27d3add15527d59db0835b1d Mon Sep 17 00:00:00 2001 From: BladiCreator <51289587+BladiCreator@users.noreply.github.com> Date: Wed, 9 Jun 2021 19:00:13 +0200 Subject: [PATCH 1/2] New some blend mode Exclusion Hard light Soft light Color dodge Color burn Linear burn --- src/lib/library/v1/blend.ts | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/lib/library/v1/blend.ts b/src/lib/library/v1/blend.ts index 97b3263f..97d0a83a 100644 --- a/src/lib/library/v1/blend.ts +++ b/src/lib/library/v1/blend.ts @@ -18,7 +18,14 @@ export class BlendNode extends GpuDesignerNode { "Min", "Switch", "Overlay", - "Screen" + "Screen", + // News blend mode + "Exclusion", + "Hard light", + "Soft light", + "Color dodge", + "Color burn", + "Linear burn" ]); this.addFloatProperty("opacity", "Opacity", 1.0, 0.0, 1.0, 0.01); @@ -72,6 +79,38 @@ export class BlendNode extends GpuDesignerNode { col.b = screen(colA.b, colB.b); } + if (prop_type==9){ // exclusion + col.rgb = colB.rgb + colA.rgb - 2.0 * colB.rgb * colA.rgb; + } + // a = colB; b = colA + if (prop_type==10){ // Hard light + if(colB.r < 0.5) col.r = (2.0 * colB.r * colA.r); else col.r = (1.0 - 2.0 * (1.0 - colB.r) * (1.0 - colA.r)); + if(colB.g < 0.5) col.g = (2.0 * colB.g * colA.g); else col.g = (1.0 - 2.0 * (1.0 - colB.g) * (1.0 - colA.g)); + if(colB.b < 0.5) col.b = (2.0 * colB.b * colA.b); else col.b = (1.0 - 2.0 * (1.0 - colB.b) * (1.0 - colA.b)); + //if b < 0.5 ? (2.0 * a * b) : (1.0 - 2.0 * (1.0 - a) * (1.0 - b)) + } + + if (prop_type==11){ // Soft light + if(colB.r < 0.5) col.r = 2.0 * colB.r * colA.r + colB.r * colB.r * (1.0 - 2.0 * colA.r); else col.r = sqrt(colB.r) * (2.0 * colA.r - 1.0) + (2.0 * colB.r) * (1.0 - colA.r); + if(colB.g < 0.5) col.g = 2.0 * colB.g * colA.g + colB.g * colB.g * (1.0 - 2.0 * colA.g); else col.g = sqrt(colB.g) * (2.0 * colA.g - 1.0) + (2.0 * colB.g) * (1.0 - colA.g); + if(colB.b < 0.5) col.b = 2.0 * colB.b * colA.b + colB.b * colB.b * (1.0 - 2.0 * colA.b); else col.b = sqrt(colB.b) * (2.0 * colA.b - 1.0) + (2.0 * colB.b) * (1.0 - colA.b); + //b < 0.5 ? (2.0 * a * b + a * a * (1.0 - 2.0 * b)) : (sqrt(a) * (2.0 * b - 1.0) + (2.0 * a) * (1.0 - b)) + } + + if (prop_type==12){ // Color dodge + col.rgb = colB.rgb / (1.0 - colA.rgb); + } + + if (prop_type==13){ // Color burn + col.rgb = 1.0 - (1.0 - colB.rgb) / colA.rgb; + } + + if (prop_type==14){ // Linear burn + col.rgb = colB.rgb + colA.rgb - 1.0; + } + + + // apply opacity col.rgb = mix(colB.rgb, col.rgb, vec3(finalOpacity)); From 770caad1ce58214a677609ba1ca05437166a7c83 Mon Sep 17 00:00:00 2001 From: Vladimir Almonte Date: Fri, 11 Jun 2021 17:27:29 +0200 Subject: [PATCH 2/2] otimisation for conditionals Some otimisation for conditionals --- src/lib/library/v1/blend.ts | 28 ++++++++++++++-------------- src/lib/library/v1/mirror.ts | 6 +++--- src/lib/library/v2/extractchannel.ts | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/lib/library/v1/blend.ts b/src/lib/library/v1/blend.ts index 97d0a83a..a53e3cca 100644 --- a/src/lib/library/v1/blend.ts +++ b/src/lib/library/v1/blend.ts @@ -48,64 +48,64 @@ export class BlendNode extends GpuDesignerNode { if (prop_type==0){ // multiply col.rgb = colA.rgb * colB.rgb; } - if (prop_type==1) // add + else if (prop_type==1) // add col.rgb = colA.rgb + colB.rgb; - if (prop_type==2) // subtract + else if (prop_type==2) // subtract col.rgb = colB.rgb - colA.rgb; - if (prop_type==3) // divide + else if (prop_type==3) // divide col.rgb = colB.rgb / colA.rgb; // if (prop_type==4) {// add sub // if (colA.r > 0.5) col.r = colB.r + colA.r; else col.r = colB.r - colA.r; // if (colA.g > 0.5) col.g = colB.g + colA.g; else col.g = colB.g - colA.g; // if (colA.b > 0.5) col.b = colB.b + colA.b; else col.b = colB.b - colA.b; // } - if (prop_type==4) { // max + else if (prop_type==4) { // max col.rgb = max(colA.rgb, colB.rgb); } - if (prop_type==5) { // min + else if (prop_type==5) { // min col.rgb = min(colA.rgb, colB.rgb); } - if (prop_type==6) { // switch + else if (prop_type==6) { // switch col.rgb = colA.rgb; } - if (prop_type==7) { // overlay + else if (prop_type==7) { // overlay if (colB.r < 0.5) col.r = colB.r * colA.r; else col.r = screen(colB.r, colA.r); if (colB.g < 0.5) col.g = colB.g * colA.g; else col.g = screen(colB.g, colA.g); if (colB.b < 0.5) col.b = colB.b * colA.b; else col.b = screen(colB.b, colA.b); } - if (prop_type==8) { // screen + else if (prop_type==8) { // screen col.r = screen(colA.r, colB.r); col.g = screen(colA.g, colB.g); col.b = screen(colA.b, colB.b); } - if (prop_type==9){ // exclusion + else if (prop_type==9){ // exclusion col.rgb = colB.rgb + colA.rgb - 2.0 * colB.rgb * colA.rgb; } // a = colB; b = colA - if (prop_type==10){ // Hard light + else if (prop_type==10){ // Hard light if(colB.r < 0.5) col.r = (2.0 * colB.r * colA.r); else col.r = (1.0 - 2.0 * (1.0 - colB.r) * (1.0 - colA.r)); if(colB.g < 0.5) col.g = (2.0 * colB.g * colA.g); else col.g = (1.0 - 2.0 * (1.0 - colB.g) * (1.0 - colA.g)); if(colB.b < 0.5) col.b = (2.0 * colB.b * colA.b); else col.b = (1.0 - 2.0 * (1.0 - colB.b) * (1.0 - colA.b)); //if b < 0.5 ? (2.0 * a * b) : (1.0 - 2.0 * (1.0 - a) * (1.0 - b)) } - if (prop_type==11){ // Soft light + else if (prop_type==11){ // Soft light if(colB.r < 0.5) col.r = 2.0 * colB.r * colA.r + colB.r * colB.r * (1.0 - 2.0 * colA.r); else col.r = sqrt(colB.r) * (2.0 * colA.r - 1.0) + (2.0 * colB.r) * (1.0 - colA.r); if(colB.g < 0.5) col.g = 2.0 * colB.g * colA.g + colB.g * colB.g * (1.0 - 2.0 * colA.g); else col.g = sqrt(colB.g) * (2.0 * colA.g - 1.0) + (2.0 * colB.g) * (1.0 - colA.g); if(colB.b < 0.5) col.b = 2.0 * colB.b * colA.b + colB.b * colB.b * (1.0 - 2.0 * colA.b); else col.b = sqrt(colB.b) * (2.0 * colA.b - 1.0) + (2.0 * colB.b) * (1.0 - colA.b); //b < 0.5 ? (2.0 * a * b + a * a * (1.0 - 2.0 * b)) : (sqrt(a) * (2.0 * b - 1.0) + (2.0 * a) * (1.0 - b)) } - if (prop_type==12){ // Color dodge + else if (prop_type==12){ // Color dodge col.rgb = colB.rgb / (1.0 - colA.rgb); } - if (prop_type==13){ // Color burn + else if (prop_type==13){ // Color burn col.rgb = 1.0 - (1.0 - colB.rgb) / colA.rgb; } - if (prop_type==14){ // Linear burn + else if (prop_type==14){ // Linear burn col.rgb = colB.rgb + colA.rgb - 1.0; } diff --git a/src/lib/library/v1/mirror.ts b/src/lib/library/v1/mirror.ts index 10aaab53..f1a11794 100644 --- a/src/lib/library/v1/mirror.ts +++ b/src/lib/library/v1/mirror.ts @@ -24,17 +24,17 @@ export class MirrorNode extends GpuDesignerNode { uv.x = prop_offset - (uv.x - prop_offset); // right to left - if (prop_mode == 1) + else if (prop_mode == 1) if (uv.x < prop_offset) uv.x = prop_offset + (prop_offset - uv.x); // bottom to top - if (prop_mode == 2) + else if (prop_mode == 2) if (uv.y < prop_offset) uv.y = prop_offset + (prop_offset - uv.y); // top to bottom - if (prop_mode == 3) + else if (prop_mode == 3) if (uv.y > prop_offset) uv.y = prop_offset - (uv.y - prop_offset); diff --git a/src/lib/library/v2/extractchannel.ts b/src/lib/library/v2/extractchannel.ts index e0e69c32..372b697d 100644 --- a/src/lib/library/v2/extractchannel.ts +++ b/src/lib/library/v2/extractchannel.ts @@ -22,10 +22,10 @@ export class ExtractChannel extends GpuDesignerNode { float getChannel(vec4 inputData, int mode) { if (mode == 0) return inputData.r; - if (mode == 1) return inputData.g; - if (mode == 2) return inputData.b; - if (mode == 3) return inputData.a; - if (mode == 4) { + else if (mode == 1) return inputData.g; + else if (mode == 2) return inputData.b; + else if (mode == 3) return inputData.a; + else if (mode == 4) { return (inputData.r + inputData.g + inputData.b) * 0.3333333; }