diff --git a/Libraries/shaderlib/Sources/arm/shader/MaterialParser.hx b/Libraries/shaderlib/Sources/arm/shader/MaterialParser.hx index 59828662..7456f8c8 100644 --- a/Libraries/shaderlib/Sources/arm/shader/MaterialParser.hx +++ b/Libraries/shaderlib/Sources/arm/shader/MaterialParser.hx @@ -517,10 +517,43 @@ class MaterialParser { var gamma = parse_value_input(node.inputs[1]); return 'pow($out_col, ' + to_vec3('$gamma') + ")"; } + + else if(node.type == "DIRECT_WARP"){ + // Already fetched + if (parsed.indexOf(res_var_name(node, node.outputs[0])) >= 0) { + var varname = store_var_name(node); + } + + // Load the warp mask + var mask_name = node_name(node); + var tex = make_texture(node, mask_name); + // Initialize the grayscale value in case no mask registered + curshader.write('float gray = 0;'); + if (tex != null) { + var texstore = texture_store(node, tex, mask_name, true); + // Get the relevant mask-fragment grayscale value + curshader.write('vec3 color = texture($mask_name, texCoord).rgb;'); + curshader.write('gray = dot(color, vec3(0.299, 0.587, 0.114));'); + } + + // Load the current exisitng material texture and transform it + if (blur_passthrough) return parse_vector_input(node.inputs[0]); + var strength = Std.parseFloat(parse_value_input(node.inputs[1])) * 500; + var tex_name = "texblur_" + node_name(node); + curshader.add_uniform("sampler2D " + tex_name, "_" + tex_name); + var angle_rad = Std.parseFloat(parse_value_input(node.inputs[2])) * (Math.PI / 180); + var x = Math.cos(angle_rad) * strength; + var y = Math.sin(angle_rad) * strength; + curshader.write('vec3 res1 = vec3(0.0, 0.0, 0.0);'); + curshader.write('res1 += texture($tex_name, texCoord + vec2($x, $y) * gray / vec2(textureSize($tex_name, 0))).rgb;'); + + return "res1"; + } + else if (node.type == "BLUR") { if (blur_passthrough) return parse_vector_input(node.inputs[0]); var strength = parse_value_input(node.inputs[1]); - if (strength == "0.0") return "vec3(0.0, 0.0, 0.0)"; + if (strength == "0") return "vec3(0.0, 0.0, 0.0)"; var steps = 'int($strength * 10 + 1)'; var tex_name = "texblur_" + node_name(node); curshader.add_uniform("sampler2D " + tex_name, "_" + tex_name); diff --git a/Libraries/shaderlib/Sources/arm/shader/NodesMaterial.hx b/Libraries/shaderlib/Sources/arm/shader/NodesMaterial.hx index 3678f443..22adb45c 100644 --- a/Libraries/shaderlib/Sources/arm/shader/NodesMaterial.hx +++ b/Libraries/shaderlib/Sources/arm/shader/NodesMaterial.hx @@ -1279,6 +1279,62 @@ class NodesMaterial { } ], [ // Color + { + id: 0, + name: _tr("Warp"), + type: "DIRECT_WARP", // extension + x: 0, + y: 0, + color: 0xff448c6d, + inputs: [ + { + id: 0, + node_id: 0, + name: _tr("Color"), + type: "RGBA", + color: 0xffc7c729, + default_value: f32([0.8, 0.8, 0.8, 1.0]) + }, + { + id: 0, + node_id: 0, + name: _tr("Strength"), + type: "VALUE", + color: 0xffa1a1a1, + default_value: 0.5, + min: 0.0, + max: 1.0 + }, + { + id: 0, + node_id: 0, + name: _tr("Angle"), + type: "VALUE", + color: 0xffa1a1a1, + default_value: 0.0, + min: 0.0, + max: 360.0 + } + ], + outputs: [ + { + id: 0, + node_id: 0, + name: _tr("Color"), + type: "RGBA", + color: 0xffc7c729, + default_value: f32([0.8, 0.8, 0.8, 1.0]) + } + ], + buttons: [ + { + name: _tr("File"), + type: "ENUM", + default_value: 0, + data: "" + } + ] + }, { id: 0, name: _tr("Blur"), diff --git a/Sources/arm/App.hx b/Sources/arm/App.hx index 5e6ee704..21608a4f 100644 --- a/Sources/arm/App.hx +++ b/Sources/arm/App.hx @@ -571,7 +571,7 @@ class App { } public static function enumTexts(nodeType: String): Array { - if (nodeType == "TEX_IMAGE") { + if (nodeType == "TEX_IMAGE" || nodeType == "DIRECT_WARP") { return Project.assetNames.length > 0 ? Project.assetNames : [""]; } else if (nodeType == "LAYER" || nodeType == "LAYER_MASK") { diff --git a/Sources/arm/node/MakeMaterial.hx b/Sources/arm/node/MakeMaterial.hx index fdadf323..33c0182b 100644 --- a/Sources/arm/node/MakeMaterial.hx +++ b/Sources/arm/node/MakeMaterial.hx @@ -181,7 +181,7 @@ class MakeMaterial { Context.nodePreviewsBlur = null; } for (node in UINodes.inst.getCanvasMaterial().nodes) { - if (node.type == "BLUR") { + if (node.type == "BLUR" || node.type == "DIRECT_WARP") { if (Context.nodePreviewsBlur == null) { Context.nodePreviewsBlur = new Map(); }