- [Canvas] Fix surface dimension reset to default when copying from other nodes.

This commit is contained in:
Tanasart 2024-08-07 09:58:01 +07:00
parent f951f279c9
commit 62c6fbe89e
4 changed files with 92 additions and 94 deletions

View file

@ -286,7 +286,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
.setToolObject([ tool_sel_rectangle, tool_sel_ellipse, tool_sel_freeform, tool_sel_brush ]),
new NodeTool( "Magic Selection", THEME.canvas_tools_magic_selection )
.setSetting(tool_thrs, tool_fil8)
.setSetting(tool_thrs)
.setSetting(tool_fil8)
.setToolObject(tool_sel_magic),
new NodeTool( "Pencil", THEME.canvas_tools_pencil)
@ -306,7 +307,8 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
.setToolObject(tool_ellipse),
new NodeTool( "Iso Cube", [ THEME.canvas_tools_iso_cube, THEME.canvas_tools_iso_cube_wire, THEME.canvas_tools_iso_cube_fill ])
.setSetting(tool_size, tool_iso_settings)
.setSetting(tool_size)
.setSetting(tool_iso_settings)
.setToolObject(tool_iso_cube),
new NodeTool( "Curve", THEME.canvas_tool_curve_icon)
@ -373,11 +375,11 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
/* 0 */ -1,
/* 1 */ new NodeTool( "Make/Reset Brush", THEME.canvas_tools_pencil ).setToolFn( __action_make_brush ),
/* 2 */ -1,
/* 3 */ new NodeTool( "Outline", THEME.canvas_tools_outline ).setSetting(tool_thrs, tool_fil8).setToolObject( new canvas_tool_outline() ),
/* 4 */ new NodeTool( "Extrude", THEME.canvas_tools_extrude ).setSetting(tool_thrs, tool_fil8).setToolObject( new canvas_tool_extrude() ),
/* 5 */ new NodeTool( "Inset", THEME.canvas_tools_inset ).setSetting(tool_thrs, tool_fil8).setToolObject( new canvas_tool_inset() ),
/* 6 */ new NodeTool( "Skew", THEME.canvas_tools_skew ).setSetting(tool_thrs, tool_fil8).setToolObject( new canvas_tool_skew() ),
/* 7 */ new NodeTool( "Corner", THEME.canvas_tools_corner ).setSetting(tool_thrs, tool_fil8).setToolObject( new canvas_tool_corner() ),
/* 3 */ new NodeTool( "Outline", THEME.canvas_tools_outline ).setSetting(tool_thrs).setSetting(tool_fil8).setToolObject( new canvas_tool_outline() ),
/* 4 */ new NodeTool( "Extrude", THEME.canvas_tools_extrude ).setSetting(tool_thrs).setSetting(tool_fil8).setToolObject( new canvas_tool_extrude() ),
/* 5 */ new NodeTool( "Inset", THEME.canvas_tools_inset ).setSetting(tool_thrs).setSetting(tool_fil8).setToolObject( new canvas_tool_inset() ),
/* 6 */ new NodeTool( "Skew", THEME.canvas_tools_skew ).setSetting(tool_thrs).setSetting(tool_fil8).setToolObject( new canvas_tool_skew() ),
/* 7 */ new NodeTool( "Corner", THEME.canvas_tools_corner ).setSetting(tool_thrs).setSetting(tool_fil8).setToolObject( new canvas_tool_corner() ),
];
rightTools_not_selection = [
@ -415,7 +417,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
else brush.colors[color_3d_selected - 1] = color;
}
static drawTools = function(_mx, _my, xx, yy, tool_size, hover, focus) { #region
static drawTools = function(_mx, _my, xx, yy, tool_size, hover, focus) {
var _sx0 = xx - tool_size / 2;
var _sx1 = xx + tool_size / 2;
var hh = ui(8);
@ -501,9 +503,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_sprite_stretched_ext(THEME.palette_selecting, 0, _sel[0] - _pd, _sel[1] - _pd, _cw + _pd * 2, _ch + _pd * 2, c_white, 1);
return hh + ui(4);
} #endregion
}
static removeFrame = function(index = 0) { #region
static removeFrame = function(index = 0) {
if(attributes.frames <= 1) return;
if(preview_index == attributes.frames)
@ -513,9 +515,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
array_delete(canvas_surface, index, 1);
array_delete(canvas_buffer, index, 1);
update();
} #endregion
}
static refreshFrames = function() { #region
static refreshFrames = function() {
var fr = attributes.frames;
var _dim = attributes.dimension;
@ -539,13 +541,13 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
array_resize(canvas_buffer, fr);
}
} #endregion
}
function getCanvasSurface(index = preview_index) { INLINE return array_safe_get_fast(canvas_surface, index); }
function setCanvasSurface(surface, index = preview_index) { INLINE canvas_surface[index] = surface; }
static storeAction = function() { #region
static storeAction = function() {
var action = recordAction(ACTION_TYPE.custom, function(data) {
if(tool_selection.is_selected) tool_selection.apply();
@ -559,14 +561,14 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
data.surface = _canvas;
}, { surface: surface_clone(getCanvasSurface(preview_index)), tooltip: $"Modify canvas {preview_index}", index: preview_index });
} #endregion
}
static apply_surfaces = function() { #region
static apply_surfaces = function() {
for( var i = 0; i < attributes.frames; i++ )
apply_surface(i);
} #endregion
}
function apply_surface(index = preview_index) { #region
function apply_surface(index = preview_index) {
var _dim = attributes.dimension;
var cDep = attrDepth();
@ -593,14 +595,14 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
drawing_surface = surface_verify(drawing_surface, _dim[0], _dim[1], cDep);
surface_clear(drawing_surface);
} #endregion
}
static surface_store_buffers = function(index = preview_index) { #region
static surface_store_buffers = function(index = preview_index) {
for( var i = 0; i < attributes.frames; i++ )
surface_store_buffer(i);
} #endregion
}
static surface_store_buffer = function(index = preview_index) { #region
static surface_store_buffer = function(index = preview_index) {
if(index >= attributes.frames) return;
buffer_delete_safe(canvas_buffer[index]);
@ -615,7 +617,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
triggerRender();
apply_surface(index);
} #endregion
}
static tool_pick_color = function(_x, _y) {
tool_attribute.pickColor = tool_selection.is_selected?
@ -623,7 +625,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_get_pixel_ext(getCanvasSurface(), _x, _y);
}
function apply_draw_surface(_applyAlpha = true) { #region
function apply_draw_surface(_applyAlpha = true) {
var _can = getCanvasSurface();
var _drw = drawing_surface;
var _dim = attributes.dimension;
@ -711,19 +713,19 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_store_buffer();
}
} #endregion
}
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) { #region
static drawOverlay = function(hover, active, _x, _y, _s, _mx, _my, _snx, _sny) {
if(instance_exists(o_dialog_color_picker)) return;
brush.node = self;
brush.step(hover, active, _x, _y, _s, _mx, _my, _snx, _sny);
if(!tool_selection.is_selected && active && key_mod_press(ALT)) { #region color selector
if(!tool_selection.is_selected && active && key_mod_press(ALT)) { // color selector
var dialog = instance_create(0, 0, o_dialog_color_picker);
dialog.onApply = setToolColor;
dialog.def_c = CURRENT_COLOR;
} #endregion
}
var _canvas_surface = getCanvasSurface();
if(!surface_exists(_canvas_surface)) return;
@ -816,7 +818,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
draw_set_color(isUsingTool("Eraser")? c_white : CURRENT_COLOR);
draw_set_alpha(1);
if(_tool) { #region tool step
if(_tool) { // tool step
_tool.drawing_surface = drawing_surface;
_tool._canvas_surface = _canvas_surface;
@ -846,7 +848,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
brush.sizing(hover, active, _x, _y, _s, _mx, _my, _snx, _sny);
}
} #endregion
}
#region preview
if(tool_selection.is_selected) tool_selection.drawOverlay(hover, active, _x, _y, _s, _mx, _my, _snx, _sny);
@ -979,7 +981,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
#endregion
if(DRAGGING && hover&& mouse_release(mb_left)) { #region drag n drop
if(DRAGGING && hover&& mouse_release(mb_left)) { //drag n drop
if(DRAGGING.type == "Color") {
var mouse_cur_x = round((_mx - _x) / _s - 0.5);
var mouse_cur_y = round((_my - _y) / _s - 0.5);
@ -996,11 +998,11 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
surface_reset_target();
surface_store_buffer();
}
} #endregion
}
} #endregion
}
static step = function() { #region
static step = function() {
var fram = attributes.frames;
var brush = getInputData(6);
var anim = getInputData(12);
@ -1017,9 +1019,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
if(atype == 0) preview_index = safe_mod(CURRENT_FRAME * anims, fram);
else preview_index = min(CURRENT_FRAME * anims, fram - 1);
}
} #endregion
}
static update = function(frame = CURRENT_FRAME) { #region
static update = function(frame = CURRENT_FRAME) {
var _dim = getInputData(0);
var _bg = getInputData(8);
var _bga = getInputData(9);
@ -1037,6 +1039,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
if(is_surface(_bgDim)) _dim = surface_get_dimension(_bgDim);
}
attributes.dimension = _dim;
apply_surfaces();
var _frames = attributes.frames;
@ -1101,9 +1104,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
_fileO.refreshThumbnail();
}
} #endregion
}
static doSerialize = function(_map) { #region
static doSerialize = function(_map) {
surface_store_buffers();
var _buff = array_create(attributes.frames);
@ -1113,9 +1116,9 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
_map.surfaces = _buff;
} #endregion
}
static doApplyDeserialize = function() { #region
static doApplyDeserialize = function() {
var _dim = struct_has(attributes, "dimension")? attributes.dimension : getInputData(0);
if(!struct_has(load_map, "surfaces")) {
@ -1139,20 +1142,20 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
}
apply_surfaces();
} #endregion
}
static onCleanUp = function() { #region
static onCleanUp = function() {
surface_array_free(canvas_surface);
} #endregion
}
///////////////////////////////////
on_drop_file = function(path) { #region
on_drop_file = function(path) {
loadImagePath(path);
return true;
} #endregion
}
static loadImagePath = function(path) { #region
static loadImagePath = function(path) {
if(!file_exists_empty(path)) return noone;
var _spr = sprite_add(path, 0, 0, 0, 0, 0);
@ -1177,7 +1180,7 @@ function Node_Canvas(_x, _y, _group = noone) : Node(_x, _y, _group) constructor
live_target = path;
return self;
} #endregion
}
static dropPath = function(path) {
if(is_array(path)) path = array_safe_get(path, 0);
@ -1211,7 +1214,6 @@ function timelineItemNode_Canvas(node) : timelineItemNode(node) constructor {
static drawDopesheet = function(_x, _y, _s, _msx, _msy) {
if(!is_instanceof(node, Node_Canvas)) return;
if(!node.attributes.show_timeline) return;
}
static drawDopesheetOver = function(_x, _y, _s, _msx, _msy, _hover, _focus) {

View file

@ -32,7 +32,7 @@ function NodeTool(name, spr, contextString = instanceof(other)) constructor {
return new tooltipHotkey(_nme).setKey(_key.getName());
}
static setSetting = function() { for(var i = 0; i < argument_count; i++) array_push(settings, argument[i]); return self; }
static setSetting = function(setting) { for(var i = 0; i < argument_count; i++) array_push(settings, argument[i]); return self; }
static addSetting = function(name, type, onEdit, keyAttr, val) {
var w;

View file

@ -594,7 +594,8 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(_dim && array_equals(def_val, DEF_SURF)) {
value_tag = "dimension";
node.attributes.use_project_dimension = true;
editWidget.side_button = button(function() {
editWidget.side_button = button(function() /*=>*/ {
node.attributes.use_project_dimension = !node.attributes.use_project_dimension;
node.triggerRender();
}).setIcon(THEME.node_use_project, 0, COLORS._main_icon).setTooltip("Use project dimension");
@ -1095,9 +1096,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
value = applyUnit? unit.apply(value, arrIndex) : value;
if(value_tag == "dimension")
for( var i = 0, n = array_length(value); i < n; i++ ) value[i] = clamp(value[i], 0, 8192);
if(value_tag == "dimension") for( var i = 0, n = array_length(value); i < n; i++ ) value[i] = clamp(value[i], 0, 8192);
if(validator != noone) value = validator.validate(value);
return value;
@ -1283,8 +1282,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
static __getAnimValue = function(_time = CURRENT_FRAME) {
if(value_tag == "dimension" && node.attributes.use_project_dimension)
return PROJECT.attributes.surface_dimension;
if(value_tag == "dimension" && node.attributes.use_project_dimension) return PROJECT.attributes.surface_dimension;
if(!is_anim) {
if(sep_axis) {
@ -1522,8 +1520,7 @@ function NodeValue(_name, _node, _connect, _type, _value, _tooltip = "") constru
if(!updated) return false;
if(value_tag == "dimension")
node.attributes.use_project_dimension = false;
if(value_tag == "dimension") node.attributes.use_project_dimension = false;
draw_junction_index = type;
if(type == VALUE_TYPE.surface) {

View file

@ -495,13 +495,13 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
//// =========== Get Set ===========
function setCurrentPreview(_node = getFocusingNode()) { #region
function setCurrentPreview(_node = getFocusingNode()) {
if(!_node) return;
PANEL_PREVIEW.setNodePreview(_node);
} #endregion
}
function setCurrentExport(_node = getFocusingNode()) { #region
function setCurrentExport(_node = getFocusingNode()) {
if(DEMO) return;
if(!_node) return;
@ -522,9 +522,35 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
_export.inputs[| 1].setFrom(_path);
_export.inputs[| 0].setFrom(_outp);
} #endregion
}
function setCurrentCanvas(_node = getFocusingNode()) { #region
function setTriggerPreview() {
__temp_show = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_show = !node.previewable;
node.previewable = __temp_show;
node.refreshNodeDisplay();
});
}
function setTriggerParameter() {
__temp_show = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_show = !node.show_parameter;
node.show_parameter = __temp_show;
node.refreshNodeDisplay();
});
}
function setTriggerRender() {
__temp_active = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_active = !node.renderActive;
node.renderActive = __temp_active;
});
}
function setCurrentCanvas(_node = getFocusingNode()) {
if(!_node) return;
var _outp = -1;
@ -541,45 +567,18 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
if(_outp == -1) return;
if(!is_array(surf)) surf = [ surf ];
var _canvas = nodeBuild("Node_Canvas", _node.x + _node.w + 64, _node.y);
var _canvas = nodeBuild("Node_Canvas", _node.x + _node.w + 64, _node.y).skipDefault();
var _dim = surface_get_dimension(surf[0]);
_canvas.inputs[| 0].setValue(_dim);
_canvas.attributes.dimension = _dim;
_canvas.attributes.frames = array_length(surf);
_canvas.canvas_surface = surface_array_clone(surf);
_canvas.inputs[| 0].setValue(_dim);
_canvas.apply_surfaces();
}
} #endregion
function setTriggerPreview() { #region
__temp_show = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_show = !node.previewable;
node.previewable = __temp_show;
node.refreshNodeDisplay();
});
} #endregion
function setTriggerParameter() { #region
__temp_show = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_show = !node.show_parameter;
node.show_parameter = __temp_show;
node.refreshNodeDisplay();
});
} #endregion
function setTriggerRender() { #region
__temp_active = false;
array_foreach(nodes_selecting, function(node, index) {
if(index == 0) __temp_active = !node.renderActive;
node.renderActive = __temp_active;
});
} #endregion
function setCurrentCanvasBlend(_node = getFocusingNode()) { #region
function setCurrentCanvasBlend(_node = getFocusingNode()) {
if(!_node) return;
var _outp = -1;
@ -607,7 +606,7 @@ function Panel_Graph(project = PROJECT) : PanelContent() constructor {
var _blend = new Node_Blend(_node.x + _node.w + 64, _node.y, getCurrentContext()).skipDefault();
_blend.inputs[| 0].setFrom(_outp);
_blend.inputs[| 1].setFrom(_canvas.outputs[| 0]);
} #endregion
}
function getFocusingNode() { return array_empty(nodes_selecting)? noone : nodes_selecting[0]; }