From 99e04c525a6869463cd577cee3dd583861559cb8 Mon Sep 17 00:00:00 2001 From: Tanasart <22589759+Ttanasart-pt@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:55:45 +0200 Subject: [PATCH] New log system, fix array loop/filter, image replace, ase tags. --- PixelComposer.resource_order | 1 + PixelComposer.yyp | 1 + objects/o_main/Create_0.gml | 5 +- scripts/__VFX/__VFX.gml | 2 + scripts/area_function/area_function.gml | 4 +- scripts/logger/logger.gml | 40 ++++++++++++++++ scripts/logger/logger.yy | 11 +++++ .../node_VFX_renderer/node_VFX_renderer.gml | 7 +-- .../node_ase_file_read/node_ase_file_read.gml | 8 ++-- scripts/node_collection/node_collection.gml | 25 ++++++---- scripts/node_data/node_data.gml | 36 ++++++++++----- .../node_group_output/node_group_output.gml | 4 +- scripts/node_iterate/node_iterate.gml | 6 ++- .../node_iterate_each/node_iterate_each.gml | 46 ++++++++++++++----- .../node_iterate_filter.gml | 37 ++++++++++----- .../node_iterator_each_output.gml | 46 ++++++++++++------- .../node_iterator_filter_output.gml | 46 ++++++++++++------- .../node_iterator_output.gml | 14 ++++-- scripts/node_lua_compute/node_lua_compute.gml | 24 ++++------ scripts/node_lua_surface/node_lua_surface.gml | 34 ++++---------- scripts/node_particle/node_particle.gml | 8 ++-- .../node_surface_replace.gml | 22 +++++---- scripts/node_tunnel_in/node_tunnel_in.gml | 1 - scripts/render_data/render_data.gml | 38 ++++++++++----- scripts/shader_functions/shader_functions.gml | 1 - .../sh_surface_replace_fast_find.fsh | 9 ++-- .../sh_surface_replace_find.fsh | 7 +-- 27 files changed, 320 insertions(+), 163 deletions(-) create mode 100644 scripts/logger/logger.gml create mode 100644 scripts/logger/logger.yy diff --git a/PixelComposer.resource_order b/PixelComposer.resource_order index c8f2618b2..f83f149cb 100644 --- a/PixelComposer.resource_order +++ b/PixelComposer.resource_order @@ -836,6 +836,7 @@ {"name":"render_data","order":3,"path":"scripts/render_data/render_data.yy",}, {"name":"o_dialog_graph_view","order":4,"path":"objects/o_dialog_graph_view/o_dialog_graph_view.yy",}, {"name":"fd_rectangle_get_velocity_height","order":22,"path":"scripts/fd_rectangle_get_velocity_height/fd_rectangle_get_velocity_height.yy",}, + {"name":"logger","order":1,"path":"scripts/logger/logger.yy",}, {"name":"s_node_blur_directional","order":11,"path":"sprites/s_node_blur_directional/s_node_blur_directional.yy",}, {"name":"s_node_average","order":50,"path":"sprites/s_node_average/s_node_average.yy",}, {"name":"s_node_sprite_sheet","order":1,"path":"sprites/s_node_sprite_sheet/s_node_sprite_sheet.yy",}, diff --git a/PixelComposer.yyp b/PixelComposer.yyp index 863034cc3..c6f3f2fee 100644 --- a/PixelComposer.yyp +++ b/PixelComposer.yyp @@ -1326,6 +1326,7 @@ {"id":{"name":"render_data","path":"scripts/render_data/render_data.yy",},}, {"id":{"name":"o_dialog_graph_view","path":"objects/o_dialog_graph_view/o_dialog_graph_view.yy",},}, {"id":{"name":"fd_rectangle_get_velocity_height","path":"scripts/fd_rectangle_get_velocity_height/fd_rectangle_get_velocity_height.yy",},}, + {"id":{"name":"logger","path":"scripts/logger/logger.yy",},}, {"id":{"name":"addon_key_displayer","path":"objects/addon_key_displayer/addon_key_displayer.yy",},}, {"id":{"name":"s_node_blur_directional","path":"sprites/s_node_blur_directional/s_node_blur_directional.yy",},}, {"id":{"name":"distance_to_line","path":"scripts/distance_to_line/distance_to_line.yy",},}, diff --git a/objects/o_main/Create_0.gml b/objects/o_main/Create_0.gml index ba4ac4f04..9cc705e0a 100644 --- a/objects/o_main/Create_0.gml +++ b/objects/o_main/Create_0.gml @@ -120,9 +120,12 @@ if(array_length(path) == 0) return; var type = "others"; + + if(array_length(path) == 1 && directory_exists(path[0])) + type = "image"; + for( var i = 0; i < array_length(path); i++ ) { var p = path[i]; - if(directory_exists(p)) continue; var ext = string_lower(filename_ext(p)); switch(ext) { diff --git a/scripts/__VFX/__VFX.gml b/scripts/__VFX/__VFX.gml index b9013620a..3ada72c45 100644 --- a/scripts/__VFX/__VFX.gml +++ b/scripts/__VFX/__VFX.gml @@ -218,6 +218,8 @@ function __part(_node) constructor { var cc = (col == -1)? c_white : col.eval(lifeRat); if(blend != c_white) cc = colorMultiply(blend, cc); alp_draw = alp * eval_curve_x(alp_fade, lifeRat); + + shader_set_f("sampleDimension", surface_get_width(ss), surface_get_height(ss)); draw_surface_ext_safe(ss, _xx, _yy, scx, scy, rot, cc, alp_draw); } diff --git a/scripts/area_function/area_function.gml b/scripts/area_function/area_function.gml index d63daa386..03bc0af6c 100644 --- a/scripts/area_function/area_function.gml +++ b/scripts/area_function/area_function.gml @@ -28,8 +28,10 @@ function area_get_random_point(area, distrib = AREA_DISTRIBUTION.area, scatter = case AREA_DISTRIBUTION.area : if(scatter == AREA_SCATTER.uniform) { var _col = ceil(sqrt(total)); + var _row = ceil(total / _col); + var _iwid = _area_w * 2 / _col; - var _ihig = _area_h * 2 / _col; + var _ihig = _area_h * 2 / _row; var _irow = floor(index / _col); var _icol = safe_mod(index, _col); diff --git a/scripts/logger/logger.gml b/scripts/logger/logger.gml new file mode 100644 index 000000000..767af2560 --- /dev/null +++ b/scripts/logger/logger.gml @@ -0,0 +1,40 @@ +#region globals + global.LOG_LEVEL = 0; + + function LOG_BLOCK_START() { + global.LOG_LEVEL++; + } + + function LOG(text) { + var s = ""; + repeat(global.LOG_LEVEL - 1) + s += " "; + s += "|- "; + + print(s + string(text)); + } + + function LOG_LINE(text) { + LOG_BLOCK_START(); + LOG(text); + LOG_BLOCK_END(); + } + + function LOG_IF(cond, text) { + if(!cond) return; + LOG(text); + } + + function LOG_LINE_IF(cond, text) { + if(!cond) return; + LOG_LINE(text); + } + + function LOG_BLOCK_END() { + global.LOG_LEVEL--; + } + + function LOG_END() { + global.LOG_LEVEL = 0; + } +#endregion \ No newline at end of file diff --git a/scripts/logger/logger.yy b/scripts/logger/logger.yy new file mode 100644 index 000000000..4f7a12a4f --- /dev/null +++ b/scripts/logger/logger.yy @@ -0,0 +1,11 @@ +{ + "resourceType": "GMScript", + "resourceVersion": "1.0", + "name": "logger", + "isCompatibility": false, + "isDnD": false, + "parent": { + "name": "debug", + "path": "folders/functions/debug.yy", + }, +} \ No newline at end of file diff --git a/scripts/node_VFX_renderer/node_VFX_renderer.gml b/scripts/node_VFX_renderer/node_VFX_renderer.gml index ccac24b2e..8ca2b93fd 100644 --- a/scripts/node_VFX_renderer/node_VFX_renderer.gml +++ b/scripts/node_VFX_renderer/node_VFX_renderer.gml @@ -19,6 +19,7 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr input_fix_len = ds_list_size(inputs); attribute_surface_depth(); + attribute_interpolation(); static createNewInput = function() { var index = ds_list_size(inputs); @@ -82,8 +83,8 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); outputs[| 0].setValue(_outSurf); - surface_set_target(_outSurf); - DRAW_CLEAR + surface_set_shader(_outSurf); + shader_set_interpolation(_outSurf); if(_blend == PARTICLE_BLEND_MODE.normal) BLEND_NORMAL; @@ -108,7 +109,7 @@ function Node_VFX_Renderer(_x, _y, _group = noone) : Node(_x, _y, _group) constr } BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); cacheCurrentFrame(_outSurf); } diff --git a/scripts/node_ase_file_read/node_ase_file_read.gml b/scripts/node_ase_file_read/node_ase_file_read.gml index 93e481d70..0c9483863 100644 --- a/scripts/node_ase_file_read/node_ase_file_read.gml +++ b/scripts/node_ase_file_read/node_ase_file_read.gml @@ -136,7 +136,9 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const if(_hover && point_in_rectangle(_m[0], _m[1], _x + 8, _yy, _x + _w - 8, _yy + hh)) { draw_sprite_stretched_ext(THEME.node_bg_name, 1, _x + 8, _yy, _w - 16, hh, c_white, 0.1); if(mouse_click(mb_left, _focus)) { - inputs[| 2].setValue(tag[? "Name"]); + var _currTag = inputs[| 2].getValue(); + var _tagName = tag[? "Name"]; + inputs[| 2].setValue(_currTag == _tagName? "" : _tagName); } } @@ -150,11 +152,11 @@ function Node_ASE_File_Read(_x, _y, _group = noone) : Node(_x, _y, _group) const tag_renderer.h = _h; return _h; }); - + input_display_list = [ ["File", true], 0, ["Layers", false], 1, layer_renderer, - ["Tags", false], tag_renderer, + ["Tags", false], 2, tag_renderer, ]; attributes[? "layer_visible"] = ds_list_create(); diff --git a/scripts/node_collection/node_collection.gml b/scripts/node_collection/node_collection.gml index d252d2914..c44db7016 100644 --- a/scripts/node_collection/node_collection.gml +++ b/scripts/node_collection/node_collection.gml @@ -136,20 +136,24 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc } static getNextNodes = function() { + LOG_BLOCK_START(); var nodes = []; for(var i = custom_input_index; i < ds_list_size(inputs); i++) { var _in = inputs[| i].from; if(!_in.renderActive) continue; array_push(nodes, _in); - printIf(global.RENDER_LOG, " >> Check complete, push " + _in.name + " to stack."); + LOG_IF(global.RENDER_LOG, "Check complete, push " + _in.name + " to stack."); } + LOG_BLOCK_END(); return nodes; } static setRenderStatus = function(result) { - printIf(global.RENDER_LOG, " >> Set render status for " + name + " : " + string(result)); + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Set render status for " + name + " : " + string(result)); + LOG_BLOCK_END(); rendered = result; if(result) { @@ -365,13 +369,18 @@ function Node_Collection(_x, _y, _group = noone) : Node(_x, _y, _group) construc node_list[| i].disable(); } - static resetAllRenderStatus = function() { - var node_list = getNodeList(); - for( var i = 0; i < ds_list_size(node_list); i++ ) { - node_list[| i].setRenderStatus(false); - if(variable_struct_exists(node_list[| i], "nodes")) - node_list[| i].resetAllRenderStatus(); + static resetRender = function() { + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Reset Render for collection " + name); + + for( var i = 0; i < ds_list_size(nodes); i++ ) { + LOG_IF(global.RENDER_LOG, "Reset Render for " + nodes[| i].name); + nodes[| i].rendered = false; } + + rendered = false; + + LOG_BLOCK_END(); } static setInstance = function(node) { diff --git a/scripts/node_data/node_data.gml b/scripts/node_data/node_data.gml index 405c9740a..ebbf51278 100644 --- a/scripts/node_data/node_data.gml +++ b/scripts/node_data/node_data.gml @@ -276,6 +276,8 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static doUpdate = function() { if(SAFE_MODE) return; var sBase = surface_get_target(); + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "DoUpdate called from " + name); for( var i = 0; i < ds_list_size(inputs); i++ ) { if(inputs[| i].type != VALUE_TYPE.trigger) continue; @@ -287,9 +289,12 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x try { var t = get_timer(); + if(!is_instanceof(self, Node_Collection)) + setRenderStatus(true); + update(); - setRenderStatus(true); - if(auto_render_time) + + if(!is_instanceof(self, Node_Collection)) render_time = get_timer() - t; } catch(exception) { var sCurr = surface_get_target(); @@ -308,6 +313,7 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x var trigger = inspectInput2.getValue(); if(trigger) onInspector2Update(); } + LOG_BLOCK_END(); } static valueUpdate = function(index) { @@ -321,16 +327,18 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x static onValueFromUpdate = function(index) {} static triggerRender = function() { - printIf(global.RENDER_LOG, " -> Trigger render for " + name + " (" + display_name + ")"); + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Trigger render for " + name + " (" + display_name + ")"); setRenderStatus(false); UPDATE |= RENDER_TYPE.partial; - var nodes = getNextNodes(); + var nodes = getNextNodesRaw(); for(var i = 0; i < array_length(nodes); i++) nodes[i].triggerRender(); + LOG_BLOCK_END(); } - + static isRenderable = function(log = false) { //Check if every input is ready (updated) if(!active) return false; if(!renderActive) return false; @@ -351,9 +359,15 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x return true; } + static getNextNodesRaw = function() { return getNextNodes(); } + static getNextNodes = function() { var nodes = []; + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Call get next node from: " + name); + LOG_BLOCK_START(); + for(var i = 0; i < ds_list_size(outputs); i++) { var _ot = outputs[| i]; @@ -361,25 +375,25 @@ function Node(_x, _y, _group = PANEL_GRAPH.getCurrentContext()) : __Node_Base(_x var _to = _ot.value_to[| j]; if(!_to.node.active || _to.value_from == noone) continue; - printIf(global.RENDER_LOG, " |--> Check render " + _to.node.name + " from " + _to.value_from.node.name); + LOG_IF(global.RENDER_LOG, "Check render " + _to.node.name + " from " + _to.value_from.node.name); if(_to.value_from.node != self) continue; - printIf(global.RENDER_LOG, " >> Check complete, push " + _to.node.name + " to stack."); + LOG_IF(global.RENDER_LOG, "Check complete, push " + _to.node.name + " to stack."); array_push(nodes, _to.node); } } + LOG_BLOCK_END(); + LOG_BLOCK_END(); return nodes; } static onInspect = function() {} static setRenderStatus = function(result) { - printIf(global.RENDER_LOG, " >> Set render status for " + name + " : " + string(result)); - rendered = result; + LOG_LINE_IF(global.RENDER_LOG, "Set render status for " + name + " : " + string(result)); - if(!result && group != noone) - group.setRenderStatus(result); + rendered = result; } static pointIn = function(_x, _y, _mx, _my, _s) { diff --git a/scripts/node_group_output/node_group_output.gml b/scripts/node_group_output/node_group_output.gml index 11442ad98..9f4790ce1 100644 --- a/scripts/node_group_output/node_group_output.gml +++ b/scripts/node_group_output/node_group_output.gml @@ -29,6 +29,7 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr //group.setRenderStatus(true); //printIf(global.RENDER_LOG, "Value to amount " + string(ds_list_size(outParent.value_to))); + LOG_BLOCK_START(); var nodes = []; for(var j = 0; j < ds_list_size(outParent.value_to); j++) { var _to = outParent.value_to[| j]; @@ -48,8 +49,9 @@ function Node_Group_Output(_x, _y, _group = noone) : Node(_x, _y, _group) constr //printIf(global.RENDER_LOG, "Group output ready " + string(_to.node.isRenderable())); array_push(nodes, _to.node); - printIf(global.RENDER_LOG, " >> Check complete, push " + _to.node.name + " to stack."); + LOG_IF(global.RENDER_LOG, "Check complete, push " + _to.node.name + " to stack."); } + LOG_BLOCK_END(); return nodes; } diff --git a/scripts/node_iterate/node_iterate.gml b/scripts/node_iterate/node_iterate.gml index f27f2c35a..b9a7b4002 100644 --- a/scripts/node_iterate/node_iterate.gml +++ b/scripts/node_iterate/node_iterate.gml @@ -27,6 +27,8 @@ function Node_Iterate(_x, _y, _group = noone) : Node_Collection(_x, _y, _group) } static initLoop = function() { + resetRender(); + iterated = 0; loop_start_time = get_timer(); var node_list = getNodeList(); @@ -37,7 +39,7 @@ function Node_Iterate(_x, _y, _group = noone) : Node_Collection(_x, _y, _group) n.initLoop(); } - printIf(global.RENDER_LOG, " > Loop begin"); + LOG_LINE_IF(global.RENDER_LOG, "Loop begin"); } static getNextNodes = function() { @@ -73,7 +75,7 @@ function Node_Iterate(_x, _y, _group = noone) : Node_Collection(_x, _y, _group) return ITERATION_STATUS.complete; } - resetAllRenderStatus(); + resetRender(); return ITERATION_STATUS.loop; } diff --git a/scripts/node_iterate_each/node_iterate_each.gml b/scripts/node_iterate_each/node_iterate_each.gml index aa9c51891..feba374f0 100644 --- a/scripts/node_iterate_each/node_iterate_each.gml +++ b/scripts/node_iterate_each/node_iterate_each.gml @@ -23,6 +23,10 @@ function Node_Iterate_Each(_x, _y, _group = noone) : Node_Collection(_x, _y, _gr output.inputs[| 0].setFrom(input.outputs[| 0]); } + static getNextNodesRaw = function() { + return __nodeLeafList(getNodeList()); + } + static getNextNodes = function() { initLoop(); return __nodeLeafList(getNodeList()); @@ -34,6 +38,7 @@ function Node_Iterate_Each(_x, _y, _group = noone) : Node_Collection(_x, _y, _gr } static initLoop = function() { + resetRender(); iterated = 0; loop_start_time = get_timer(); @@ -45,25 +50,44 @@ function Node_Iterate_Each(_x, _y, _group = noone) : Node_Collection(_x, _y, _gr outputs[| 0].setValue([]) } - printIf(global.RENDER_LOG, " > Loop begin"); + LOG_LINE_IF(global.RENDER_LOG, "Loop begin"); } - static iterationStatus = function() { - var iter = true; + static getIterationCount = function() { var arrIn = inputs[| 0].getValue(); var maxIter = is_array(arrIn)? array_length(arrIn) : 0; if(!is_real(maxIter)) maxIter = 1; - iterated++; - //print("Iterating " + string(iterated) + "/" + string(maxIter)) - - if(iterated >= maxIter) { - render_time = get_timer() - loop_start_time; - iterated = 0; - return ITERATION_STATUS.complete; + return maxIter; + } + + static iterationUpdate = function() { + var siz = ds_list_size(outputs); // check if every output is updated + for( var i = custom_output_index; i < siz; i++ ) { + var _o = outputs[| i]; + if(_o.node.rendered) return; } - resetAllRenderStatus(); + var maxIter = getIterationCount(); + iterated++; + + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Iteration update: " + string(iterated) + "/" + string(maxIter)); + + if(iterated >= maxIter) { + LOG_IF(global.RENDER_LOG, "Iteration complete"); + render_time = get_timer() - loop_start_time; + } else { + LOG_IF(global.RENDER_LOG, "Iteration not completed, reset render status."); + resetRender(); + } + + LOG_BLOCK_END(); + } + + static iterationStatus = function() { + if(iterated >= getIterationCount()) + return ITERATION_STATUS.complete; return ITERATION_STATUS.loop; } diff --git a/scripts/node_iterate_filter/node_iterate_filter.gml b/scripts/node_iterate_filter/node_iterate_filter.gml index 51f787341..4db91ca99 100644 --- a/scripts/node_iterate_filter/node_iterate_filter.gml +++ b/scripts/node_iterate_filter/node_iterate_filter.gml @@ -11,7 +11,7 @@ function Node_Iterate_Filter(_x, _y, _group = noone) : Node_Collection(_x, _y, _ inputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.input, VALUE_TYPE.any, [] ) .setVisible(true, true); - outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, [] ); + outputs[| 0] = nodeValue("Array", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, noone ); custom_input_index = ds_list_size(inputs); custom_output_index = ds_list_size(inputs); @@ -36,6 +36,7 @@ function Node_Iterate_Filter(_x, _y, _group = noone) : Node_Collection(_x, _y, _ } static initLoop = function() { + resetRender(); iterated = 0; loop_start_time = get_timer(); @@ -45,24 +46,38 @@ function Node_Iterate_Filter(_x, _y, _group = noone) : Node_Collection(_x, _y, _ surface_array_free(arrOut); outputs[| 0].setValue([]) - printIf(global.RENDER_LOG, " > Loop begin"); + LOG("Loop begin"); + var _val = outputs[| 0].getValue(); + LOG("Output original value " + string(_val)); } - static iterationStatus = function() { - var iter = true; + static getIterationCount = function() { var arrIn = inputs[| 0].getValue(); var maxIter = is_array(arrIn)? array_length(arrIn) : 0; if(!is_real(maxIter)) maxIter = 1; - iterated++; - - if(iterated >= maxIter) { - render_time = get_timer() - loop_start_time; - iterated = 0; - return ITERATION_STATUS.complete; + return maxIter; + } + + static iterationUpdate = function() { + var siz = ds_list_size(outputs); // check if every output is updated + for( var i = custom_output_index; i < siz; i++ ) { + var _o = outputs[| i]; + if(_o.node.rendered) return; } - resetAllRenderStatus(); + var maxIter = getIterationCount(); + iterated++; + + if(iterated >= maxIter) + render_time = get_timer() - loop_start_time; + else + resetRender(); + } + + static iterationStatus = function() { + if(iterated >= getIterationCount()) + return ITERATION_STATUS.complete; return ITERATION_STATUS.loop; } diff --git a/scripts/node_iterator_each_output/node_iterator_each_output.gml b/scripts/node_iterator_each_output/node_iterator_each_output.gml index 271476f69..030581575 100644 --- a/scripts/node_iterator_each_output/node_iterator_each_output.gml +++ b/scripts/node_iterator_each_output/node_iterator_each_output.gml @@ -10,31 +10,42 @@ function Node_Iterator_Each_Output(_x, _y, _group = noone) : Node(_x, _y, _group outputs[| 0] = nodeValue("Preview", self, JUNCTION_CONNECT.output, VALUE_TYPE.any, 0 ) .setVisible(false); + static getNextNodesRaw = function() { + var nodes = []; + + var _ot = group.outputs[| 0]; + for(var j = 0; j < ds_list_size(_ot.value_to); j++) { + var _to = _ot.value_to[| j]; + if(!_to.node.renderActive) continue; + + if(_to.node.active && _to.value_from != noone && _to.value_from.node == group) { + if(_to.node.isRenderable()) + array_push(nodes, _to.node); + } + } + + return nodes; + } + static getNextNodes = function() { if(!struct_has(group, "iterationStatus")) return []; var _ren = group.iterationStatus(); var nodes = []; - + + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Call get next node from loop output."); + if(_ren == ITERATION_STATUS.loop) { //Go back to the beginning of the loop, reset render status for leaf node inside? - printIf(global.RENDER_LOG, " > Loop restart: iteration " + string(group.iterated)); + LOG_IF(global.RENDER_LOG, "Loop restart: iteration " + string(group.iterated)); nodes = array_append(nodes, __nodeLeafList(group.getNodeList())); } else if(_ren == ITERATION_STATUS.complete) { //Go out of loop - printIf(global.RENDER_LOG, " > Loop completed"); + LOG_IF(global.RENDER_LOG, "Loop completed"); group.setRenderStatus(true); - - var _ot = group.outputs[| 0]; - for(var j = 0; j < ds_list_size(_ot.value_to); j++) { - var _to = _ot.value_to[| j]; - if(!_to.node.renderActive) continue; - - if(_to.node.active && _to.value_from != noone && _to.value_from.node == group) { - _to.node.triggerRender(); - if(_to.node.isRenderable()) - array_push(nodes, _to.node); - } - } + nodes = getNextNodesRaw(); } else - printIf(global.RENDER_LOG, " > Loop not ready"); + LOG_IF(global.RENDER_LOG, "Loop not ready"); + + LOG_BLOCK_END(); return nodes; } @@ -74,7 +85,8 @@ function Node_Iterator_Each_Output(_x, _y, _group = noone) : Node(_x, _y, _group _val[@ ind] = cloneValue(array_safe_get(_val, ind), inputs[| 0].getValue()); - group.outputs[| 0].setValue(_val); outputs[| 0].setValue(_val); + group.outputs[| 0].setValue(_val); + group.iterationUpdate(); } } \ No newline at end of file diff --git a/scripts/node_iterator_filter_output/node_iterator_filter_output.gml b/scripts/node_iterator_filter_output/node_iterator_filter_output.gml index 6e05b69c8..f3d714533 100644 --- a/scripts/node_iterator_filter_output/node_iterator_filter_output.gml +++ b/scripts/node_iterator_filter_output/node_iterator_filter_output.gml @@ -10,31 +10,42 @@ function Node_Iterator_Filter_Output(_x, _y, _group = noone) : Node(_x, _y, _gro inputs[| 1] = nodeValue("Result", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, false ) .setVisible(true, true); + static getNextNodesRaw = function() { + var nodes = []; + + var _ot = group.outputs[| 0]; + for(var j = 0; j < ds_list_size(_ot.value_to); j++) { + var _to = _ot.value_to[| j]; + if(!_to.node.renderActive) continue; + + if(_to.node.active && _to.value_from != noone && _to.value_from.node == group) { + if(_to.node.isRenderable()) + array_push(nodes, _to.node); + } + } + + return nodes; + } + static getNextNodes = function() { if(!struct_has(group, "iterationStatus")) return []; var _ren = group.iterationStatus(); var nodes = []; - + + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Call get next node from loop output."); + if(_ren == ITERATION_STATUS.loop) { //Go back to the beginning of the loop, reset render status for leaf node inside? - printIf(global.RENDER_LOG, " > Loop restart: iteration " + string(group.iterated)); + LOG_IF(global.RENDER_LOG, "Loop restart: iteration " + string(group.iterated)); nodes = array_append(nodes, __nodeLeafList(group.getNodeList())); } else if(_ren == ITERATION_STATUS.complete) { //Go out of loop - printIf(global.RENDER_LOG, " > Loop completed"); + LOG_IF(global.RENDER_LOG, "Loop completed"); group.setRenderStatus(true); - - var _ot = group.outputs[| 0]; - for(var j = 0; j < ds_list_size(_ot.value_to); j++) { - var _to = _ot.value_to[| j]; - if(!_to.node.renderActive) continue; - - if(_to.node.active && _to.value_from != noone && _to.value_from.node == group) { - _to.node.triggerRender(); - if(_to.node.isRenderable()) - array_push(nodes, _to.node); - } - } + nodes = getNextNodesRaw(); } else - printIf(global.RENDER_LOG, " > Loop not ready"); + LOG_IF(global.RENDER_LOG, "Loop not ready"); + + LOG_BLOCK_END(); return nodes; } @@ -67,6 +78,9 @@ function Node_Iterator_Filter_Output(_x, _y, _group = noone) : Node(_x, _y, _gro array_push(_val, _new_val); } + LOG("Value " + string(val) + " filter result " + string(res) + " to array " + string(_val)); + group.outputs[| 0].setValue(_val); + group.iterationUpdate(); } } \ No newline at end of file diff --git a/scripts/node_iterator_output/node_iterator_output.gml b/scripts/node_iterator_output/node_iterator_output.gml index ac4b968e7..08fc7ecca 100644 --- a/scripts/node_iterator_output/node_iterator_output.gml +++ b/scripts/node_iterator_output/node_iterator_output.gml @@ -37,11 +37,15 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y if(!struct_has(_node_it, "iterationStatus")) return nodes; var _ren = _node_it.iterationStatus(); + LOG_BLOCK_START(); + if(_ren == ITERATION_STATUS.loop) { //Go back to the beginning of the loop, reset render status for leaf node inside? - printIf(global.RENDER_LOG, " > Loop restart: iteration " + string(group.iterated)); + LOG_IF(global.RENDER_LOG, "Loop restart: iteration " + string(group.iterated)); + + group.resetRender(); nodes = array_append(nodes, __nodeLeafList(group.getNodeList())); } else if(_ren == ITERATION_STATUS.complete) { //Go out of loop - printIf(global.RENDER_LOG, " > Loop completed"); + LOG_IF(global.RENDER_LOG, "Loop completed"); group.setRenderStatus(true); var _ot = outParent; for(var j = 0; j < ds_list_size(_ot.value_to); j++) { @@ -54,8 +58,10 @@ function Node_Iterator_Output(_x, _y, _group = noone) : Node_Group_Output(_x, _y } } } else - printIf(global.RENDER_LOG, " > Loop not ready"); - + LOG_IF(global.RENDER_LOG, "Loop not ready"); + + LOG_BLOCK_END(); + return nodes; } diff --git a/scripts/node_lua_compute/node_lua_compute.gml b/scripts/node_lua_compute/node_lua_compute.gml index e7c00807a..68b60e31b 100644 --- a/scripts/node_lua_compute/node_lua_compute.gml +++ b/scripts/node_lua_compute/node_lua_compute.gml @@ -106,6 +106,15 @@ function Node_Lua_Compute(_x, _y, _group = noone) : Node(_x, _y, _group) constru if(inputs[| i + 2].editWidget != noone) inputs[| i + 2].editWidget.interactable = true; + var type = inputs[| i + 1].getValue(); + switch(type) { + case 0 : inputs[| i + 2].type = VALUE_TYPE.float; break; + case 1 : inputs[| i + 2].type = VALUE_TYPE.text; break; + case 2 : inputs[| i + 2].type = VALUE_TYPE.surface; break; + case 3 : inputs[| i + 2].type = VALUE_TYPE.struct; break; + } + + inputs[| i + 2].setDisplay(VALUE_DISPLAY._default); array_push(input_display_list, i + 2); } else { delete inputs[| i + 0]; @@ -139,24 +148,9 @@ function Node_Lua_Compute(_x, _y, _group = noone) : Node(_x, _y, _group) constru compiled = false; } - if(index < input_fix_len) return; if(LOADING || APPENDING) return; compiled = false; - - if(safe_mod(index - input_fix_len, data_length) == 1) { //Variable type - var type = inputs[| index].getValue(); - - switch(type) { - case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break; - case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break; - case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break; - case 3 : inputs[| index + 1].type = VALUE_TYPE.struct; break; - } - - inputs[| index + 1].setDisplay(VALUE_DISPLAY._default); - } - refreshDynamicInput(); } diff --git a/scripts/node_lua_surface/node_lua_surface.gml b/scripts/node_lua_surface/node_lua_surface.gml index c0a885a12..db9eb1cdf 100644 --- a/scripts/node_lua_surface/node_lua_surface.gml +++ b/scripts/node_lua_surface/node_lua_surface.gml @@ -100,18 +100,15 @@ function Node_Lua_Surface(_x, _y, _group = noone) : Node(_x, _y, _group) constru if(inputs[| i + 2].editWidget != noone) inputs[| i + 2].editWidget.interactable = true; - if(LOADING || APPENDING) { - var type = inputs[| i + 1].getValue(); - switch(type) { - case 0 : inputs[| i + 2].type = VALUE_TYPE.float; break; - case 1 : inputs[| i + 2].type = VALUE_TYPE.text; break; - case 2 : inputs[| i + 2].type = VALUE_TYPE.surface; break; - case 3 : inputs[| i + 2].type = VALUE_TYPE.struct; break; - } - - inputs[| i + 2].setDisplay(VALUE_DISPLAY._default); + var type = inputs[| i + 1].getValue(); + switch(type) { + case 0 : inputs[| i + 2].type = VALUE_TYPE.float; break; + case 1 : inputs[| i + 2].type = VALUE_TYPE.text; break; + case 2 : inputs[| i + 2].type = VALUE_TYPE.surface; break; + case 3 : inputs[| i + 2].type = VALUE_TYPE.struct; break; } - + + inputs[| i + 2].setDisplay(VALUE_DISPLAY._default); array_push(input_display_list, i + 2); } else { delete inputs[| i + 0]; @@ -145,24 +142,9 @@ function Node_Lua_Surface(_x, _y, _group = noone) : Node(_x, _y, _group) constru compiled = false; } - if(index < input_fix_len) return; if(LOADING || APPENDING) return; compiled = false; - - if(safe_mod(index - input_fix_len, data_length) == 1) { //Variable type - var type = inputs[| index].getValue(); - - switch(type) { - case 0 : inputs[| index + 1].type = VALUE_TYPE.float; break; - case 1 : inputs[| index + 1].type = VALUE_TYPE.text; break; - case 2 : inputs[| index + 1].type = VALUE_TYPE.surface; break; - case 3 : inputs[| index + 1].type = VALUE_TYPE.struct; break; - } - - inputs[| index + 1].setDisplay(VALUE_DISPLAY._default); - } - refreshDynamicInput(); } diff --git a/scripts/node_particle/node_particle.gml b/scripts/node_particle/node_particle.gml index bf35d52e5..df5ef3d1e 100644 --- a/scripts/node_particle/node_particle.gml +++ b/scripts/node_particle/node_particle.gml @@ -15,6 +15,7 @@ function Node_Particle(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _ outputs[| 0] = nodeValue("Surface out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); attribute_surface_depth(); + attribute_interpolation(); array_insert(input_display_list, 0, ["Output", true], input_len + 0); array_push(input_display_list, input_len + 1, input_len + 2); @@ -74,9 +75,8 @@ function Node_Particle(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _ _outSurf = surface_verify(_outSurf, _dim[0], _dim[1], attrDepth()); outputs[| 0].setValue(_outSurf); - surface_set_target(_outSurf); - DRAW_CLEAR - + surface_set_shader(_outSurf); + shader_set_interpolation(_outSurf); if(_blend == PARTICLE_BLEND_MODE.normal) BLEND_NORMAL; else if(_blend == PARTICLE_BLEND_MODE.alpha) @@ -91,7 +91,7 @@ function Node_Particle(_x, _y, _group = noone) : Node_VFX_Spawner_Base(_x, _y, _ parts[i].draw(_exact, surf_w, surf_h); BLEND_NORMAL; - surface_reset_target(); + surface_reset_shader(); if(ANIMATOR.is_playing) cacheCurrentFrame(_outSurf); diff --git a/scripts/node_surface_replace/node_surface_replace.gml b/scripts/node_surface_replace/node_surface_replace.gml index d32120140..6710bd939 100644 --- a/scripts/node_surface_replace/node_surface_replace.gml +++ b/scripts/node_surface_replace/node_surface_replace.gml @@ -10,29 +10,33 @@ function Node_Surface_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _ inputs[| 2] = nodeValue("Replacement Image", self, JUNCTION_CONNECT.input, VALUE_TYPE.surface, noone ) .setArrayDepth(1); - inputs[| 3] = nodeValue("Threshold", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1 ) + inputs[| 3] = nodeValue("Color Threshold", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1, "How similiar the color need to be in order to be count as matched." ) .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); inputs[| 4] = nodeValue("Draw Base Image", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ) inputs[| 5] = nodeValue("Fast Mode", self, JUNCTION_CONNECT.input, VALUE_TYPE.boolean, true ) + inputs[| 6] = nodeValue("Pixel Threshold", self, JUNCTION_CONNECT.input, VALUE_TYPE.float, 0.1, "How many pixel need to me matched to replace with replacement image." ) + .setDisplay(VALUE_DISPLAY.slider, [ 0, 1, 0.01 ]); + outputs[| 0] = nodeValue("Surface Out", self, JUNCTION_CONNECT.output, VALUE_TYPE.surface, noone); input_display_list = [ ["Surface", true], 0, 1, 2, - ["Searching", false], 5, 3, + ["Searching", false], 5, 3, 6, ["Render", false], 4, ]; temp_surface = [ surface_create(1, 1) ]; - static matchTemplate = function(_index, _surf, _base, _target, _thr, _fst) { + static matchTemplate = function(_index, _surf, _base, _target, _cthr, _pthr, _fst) { surface_set_shader(_surf, _fst? sh_surface_replace_fast_find : sh_surface_replace_find, false); shader_set_f("dimension", surface_get_width(_base), surface_get_height(_base)); shader_set_surface("target", _target); shader_set_f("target_dim", surface_get_width(_target), surface_get_height(_target)); - shader_set_f("threshold", _thr); + shader_set_f("colorThreshold", _cthr); + shader_set_f("pixelThreshold", _pthr); shader_set_f("index", _index); BLEND_ADD @@ -41,7 +45,7 @@ function Node_Surface_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _ surface_reset_shader(); } - static replaceTemplate = function(_index, _surf, _base, _res, _replace, _thr, _fst) { + static replaceTemplate = function(_index, _surf, _base, _res, _replace, _fst) { surface_set_shader(_surf, _fst? sh_surface_replace_fast_replace : sh_surface_replace_replace, false, BLEND.normal); shader_set_f("dimension", surface_get_width(_base), surface_get_height(_base)); shader_set_surface("replace", _replace); @@ -57,10 +61,12 @@ function Node_Surface_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _ var _bas = _data[0]; var _tar = _data[1]; var _rep = _data[2]; - var _thr = _data[3]; var _drw = _data[4]; var _fst = _data[5]; + var _cthr = _data[3]; + var _pthr = _data[6]; + if(!is_array(_tar)) _tar = [ _tar ]; if(!is_array(_rep)) _rep = [ _rep ]; @@ -71,7 +77,7 @@ function Node_Surface_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _ var amo = array_length(_tar); for( var i = 0; i < amo; i++ ) - matchTemplate(i / amo, temp_surface[0], _bas, _tar[i], _thr, _fst); + matchTemplate(i / amo, temp_surface[0], _bas, _tar[i], _cthr, _pthr, _fst); _outSurf = surface_verify(_outSurf, surface_get_width(_bas), surface_get_height(_bas)); surface_set_target(_outSurf); @@ -81,7 +87,7 @@ function Node_Surface_Replace(_x, _y, _group = noone) : Node_Processor(_x, _y, _ var amo = array_length(_rep); for( var i = 0; i < amo; i++ ) - replaceTemplate(i / amo, _outSurf, _bas, temp_surface[0], _rep[i], _thr, _fst, _drw); + replaceTemplate(i / amo, _outSurf, _bas, temp_surface[0], _rep[i], _fst, _drw); return _outSurf; } } \ No newline at end of file diff --git a/scripts/node_tunnel_in/node_tunnel_in.gml b/scripts/node_tunnel_in/node_tunnel_in.gml index af43bf173..3ce1a8465 100644 --- a/scripts/node_tunnel_in/node_tunnel_in.gml +++ b/scripts/node_tunnel_in/node_tunnel_in.gml @@ -127,7 +127,6 @@ function Node_Tunnel_In(_x, _y, _group = noone) : Node(_x, _y, _group) construct repeat(amo) { if(TUNNELS_OUT[? k] == _key) { - NODE_MAP[? k].triggerRender(); array_push(nodes, NODE_MAP[? k]); } diff --git a/scripts/render_data/render_data.gml b/scripts/render_data/render_data.gml index 42cd42abb..f7550406e 100644 --- a/scripts/render_data/render_data.gml +++ b/scripts/render_data/render_data.gml @@ -13,20 +13,21 @@ enum RENDER_TYPE { function __nodeLeafList(_list) { var nodes = []; + LOG_BLOCK_START(); for( var i = 0; i < ds_list_size(_list); i++ ) { var _node = _list[| i]; if(!_node.active) continue; if(!_node.renderActive) continue; - _node.triggerRender(); var _startNode = _node.isRenderable(); if(_startNode) { array_push(nodes, _node); - printIf(global.RENDER_LOG, " > Push node " + _node.name + " to stack"); + LOG_IF(global.RENDER_LOG, "Push node " + _node.name + " to stack"); } } + LOG_BLOCK_END(); return nodes; } @@ -52,7 +53,8 @@ function __nodeInLoop(_node) { function Render(partial = false, runAction = false) { var t = current_time; - printIf(global.RENDER_LOG, "=== RENDER START [frame " + string(ANIMATOR.current_frame) + "] ==="); + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "=== RENDER START [frame " + string(ANIMATOR.current_frame) + "] ==="); try { var rendering = noone; @@ -80,33 +82,43 @@ function Render(partial = false, runAction = false) { if(is_undefined(_node)) continue; if(!is_struct(_node)) continue; if(array_exists(global.group_inputs, instanceof(_node))) continue; - + if(!_node.active) continue; if(!_node.renderActive) continue; if(_node.rendered) { - printIf(global.RENDER_LOG, " > Skip rendered " + _node.name + " (" + _node.display_name + ")"); + LOG_IF(global.RENDER_LOG, "Skip rendered " + _node.name + " (" + _node.display_name + ")"); continue; } if(__nodeInLoop(_node)) continue; + LOG_BLOCK_START(); + var _startNode = _node.isRenderable(global.RENDER_LOG); if(_startNode) { - printIf(global.RENDER_LOG, " > Found leaf " + _node.name + " (" + _node.display_name + ")"); + LOG_IF(global.RENDER_LOG, "Found leaf " + _node.name + " (" + _node.display_name + ")"); _node.triggerRender(); ds_queue_enqueue(RENDER_QUEUE, _node); } else - printIf(global.RENDER_LOG, " > Skip leaf " + _node.name + " (" + _node.display_name + ")"); + LOG_IF(global.RENDER_LOG, "Skip non-leaf " + _node.name + " (" + _node.display_name + ")"); + + LOG_BLOCK_END(); } + + LOG_IF(global.RENDER_LOG, "Get leaf complete: found " + string(ds_queue_size(RENDER_QUEUE)) + " leaves."); + LOG_IF(global.RENDER_LOG, "Start rendering..."); // render forward while(!ds_queue_empty(RENDER_QUEUE)) { rendering = ds_queue_dequeue(RENDER_QUEUE); - - var txt = rendering.rendered? " [Skip]" : " [Update]"; - if(!rendering.rendered) { + LOG_BLOCK_START(); + LOG_IF(global.RENDER_LOG, "Rendering " + rendering.name + " (" + rendering.display_name + ")"); + + var txt = rendering.isRenderable()? " [Update]" : " [Skip]"; + + if(rendering.isRenderable()) { rendering.doUpdate(); var nextNodes = rendering.getNextNodes(); @@ -117,12 +129,14 @@ function Render(partial = false, runAction = false) { rendering.inspector1Update(); } - printIf(global.RENDER_LOG, "Rendered " + rendering.name + " (" + rendering.display_name + ") [" + string(instanceof(rendering)) + "]" + txt); + LOG_IF(global.RENDER_LOG, "Rendered " + rendering.name + " (" + rendering.display_name + ") [" + string(instanceof(rendering)) + "]" + txt); + LOG_BLOCK_END(); } } catch(e) noti_warning(exception_print(e)); - printIf(global.RENDER_LOG, "=== RENDER COMPLETE IN {" + string(current_time - t) + "ms} ===\n"); + LOG_IF(global.RENDER_LOG, "=== RENDER COMPLETE IN {" + string(current_time - t) + "ms} ===\n"); + LOG_END(); } function __renderListReset(list) { diff --git a/scripts/shader_functions/shader_functions.gml b/scripts/shader_functions/shader_functions.gml index 5e96db14e..110b3af27 100644 --- a/scripts/shader_functions/shader_functions.gml +++ b/scripts/shader_functions/shader_functions.gml @@ -67,7 +67,6 @@ function shader_set_surface(sampler, surface) { } function shader_set_interpolation(surface) { - var shader = shader_current(); var intp = ds_map_try_get(attributes, "interpolation", 0); gpu_set_tex_filter(intp); diff --git a/shaders/sh_surface_replace_fast_find/sh_surface_replace_fast_find.fsh b/shaders/sh_surface_replace_fast_find/sh_surface_replace_fast_find.fsh index 2971fa0af..f242075a6 100644 --- a/shaders/sh_surface_replace_fast_find/sh_surface_replace_fast_find.fsh +++ b/shaders/sh_surface_replace_fast_find/sh_surface_replace_fast_find.fsh @@ -7,7 +7,8 @@ varying vec4 v_vColour; uniform vec2 dimension; uniform sampler2D target; uniform vec2 target_dim; -uniform float threshold; +uniform float colorThreshold; +uniform float pixelThreshold; uniform float index; void main() { @@ -19,7 +20,7 @@ void main() { vec2 px = v_vTexcoord * dimension; float pixels_count = target_dim.x * target_dim.y; - float target_pixels = pixels_count * (1. - threshold); + float target_pixels = pixels_count * (1. - pixelThreshold); float content_px = 0.; float match = 0.; vec2 baseTx = 1. / dimension; @@ -36,7 +37,7 @@ void main() { vec4 base = texture2D( gm_BaseTexture, bpx * baseTx ); content_px++; - if(distance(base, targ) <= 2. * threshold) { + if(distance(base, targ) <= 2. * colorThreshold) { match++; if(match >= target_pixels) { gl_FragColor = vec4(1., index, 0., 1.); @@ -45,7 +46,7 @@ void main() { } } - if(match / content_px >= (1. - threshold)) { + if(match / content_px >= (1. - pixelThreshold)) { gl_FragColor = vec4(1., index, 0., 1.); return; } diff --git a/shaders/sh_surface_replace_find/sh_surface_replace_find.fsh b/shaders/sh_surface_replace_find/sh_surface_replace_find.fsh index 0f12fb618..f82cb74f2 100644 --- a/shaders/sh_surface_replace_find/sh_surface_replace_find.fsh +++ b/shaders/sh_surface_replace_find/sh_surface_replace_find.fsh @@ -7,7 +7,8 @@ varying vec4 v_vColour; uniform vec2 dimension; uniform sampler2D target; uniform vec2 target_dim; -uniform float threshold; +uniform float colorThreshold; +uniform float pixelThreshold; uniform float index; float random (in vec2 st) { @@ -29,7 +30,7 @@ float matchTemplate(vec2 pos) { vec4 base = texture2D( gm_BaseTexture, bpx * baseTx ); content_px++; - if(distance(base, targ) <= 2. * threshold) + if(distance(base, targ) <= 2. * colorThreshold) match++; } @@ -63,5 +64,5 @@ void main() { } } - gl_FragColor = match >= (1. - threshold)? vec4(matchPos, index, 1.) : vec4(vec3(0.), 0.); + gl_FragColor = match >= (1. - pixelThreshold)? vec4(matchPos, index, 1.) : vec4(vec3(0.), 0.); }