[Palette Extract] Improve performance

This commit is contained in:
Tanasart 2024-10-29 13:01:22 +07:00
parent 38940de773
commit 4277f0998b
9 changed files with 257 additions and 52 deletions

View file

@ -31,6 +31,7 @@
{"name":"dynamic_surface","order":8,"path":"folders/functions/surface/dynamic_surface.yy",}, {"name":"dynamic_surface","order":8,"path":"folders/functions/surface/dynamic_surface.yy",},
{"name":"svg","order":47,"path":"folders/functions/svg.yy",}, {"name":"svg","order":47,"path":"folders/functions/svg.yy",},
{"name":"main","order":147,"path":"folders/main.yy",}, {"name":"main","order":147,"path":"folders/main.yy",},
{"name":"binder","order":2,"path":"folders/main/binder.yy",},
{"name":"misc","order":148,"path":"folders/misc.yy",}, {"name":"misc","order":148,"path":"folders/misc.yy",},
{"name":"nodes","order":149,"path":"folders/nodes.yy",}, {"name":"nodes","order":149,"path":"folders/nodes.yy",},
{"name":"__base__","order":2,"path":"folders/nodes/__base__.yy",}, {"name":"__base__","order":2,"path":"folders/nodes/__base__.yy",},

View file

@ -115,6 +115,7 @@
{"$GMFolder":"","%Name":"window","folderPath":"folders/functions/window.yy","name":"window","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"window","folderPath":"folders/functions/window.yy","name":"window","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"main","folderPath":"folders/main.yy","name":"main","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"main","folderPath":"folders/main.yy","name":"main","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"components","folderPath":"folders/main/components.yy","name":"components","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"components","folderPath":"folders/main/components.yy","name":"components","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"binder","folderPath":"folders/main/binder.yy","name":"binder","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"misc","folderPath":"folders/misc.yy","name":"misc","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"misc","folderPath":"folders/misc.yy","name":"misc","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"fx","folderPath":"folders/misc/fx.yy","name":"fx","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"fx","folderPath":"folders/misc/fx.yy","name":"fx","resourceType":"GMFolder","resourceVersion":"2.0",},
{"$GMFolder":"","%Name":"nodes","folderPath":"folders/nodes.yy","name":"nodes","resourceType":"GMFolder","resourceVersion":"2.0",}, {"$GMFolder":"","%Name":"nodes","folderPath":"folders/nodes.yy","name":"nodes","resourceType":"GMFolder","resourceVersion":"2.0",},
@ -409,6 +410,7 @@
{"$GMIncludedFile":"","%Name":"nodes.json","CopyToMask":-1,"filePath":"datafiles/data","name":"nodes.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"nodes.json","CopyToMask":-1,"filePath":"datafiles/data","name":"nodes.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"Nodes.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Nodes.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Nodes.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Nodes.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"related_node.json","CopyToMask":-1,"filePath":"datafiles/data","name":"related_node.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"related_node.json","CopyToMask":-1,"filePath":"datafiles/data","name":"related_node.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"tileset_gamemaker2_room.yy","CopyToMask":-1,"filePath":"datafiles/data/TemplateStrings","name":"tileset_gamemaker2_room.yy","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"Theme.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Theme.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Theme.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Theme.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"Tooltip.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Tooltip.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Tooltip.zip","CopyToMask":-1,"filePath":"datafiles/data","name":"Tooltip.zip","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
{"$GMIncludedFile":"","%Name":"Node_2D_light.png","CopyToMask":-1,"filePath":"datafiles/data/Tooltip","name":"Node_2D_light.png","resourceType":"GMIncludedFile","resourceVersion":"2.0",}, {"$GMIncludedFile":"","%Name":"Node_2D_light.png","CopyToMask":-1,"filePath":"datafiles/data/Tooltip","name":"Node_2D_light.png","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
@ -941,6 +943,7 @@
{"id":{"name":"BBMOD_Vec3","path":"scripts/BBMOD_Vec3/BBMOD_Vec3.yy",},}, {"id":{"name":"BBMOD_Vec3","path":"scripts/BBMOD_Vec3/BBMOD_Vec3.yy",},},
{"id":{"name":"BBMOD_Vec4","path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",},}, {"id":{"name":"BBMOD_Vec4","path":"scripts/BBMOD_Vec4/BBMOD_Vec4.yy",},},
{"id":{"name":"bin_function","path":"scripts/bin_function/bin_function.yy",},}, {"id":{"name":"bin_function","path":"scripts/bin_function/bin_function.yy",},},
{"id":{"name":"binder_gamemaker","path":"scripts/binder_gamemaker/binder_gamemaker.yy",},},
{"id":{"name":"biterator","path":"scripts/biterator/biterator.yy",},}, {"id":{"name":"biterator","path":"scripts/biterator/biterator.yy",},},
{"id":{"name":"blurSurface","path":"scripts/blurSurface/blurSurface.yy",},}, {"id":{"name":"blurSurface","path":"scripts/blurSurface/blurSurface.yy",},},
{"id":{"name":"boneObject","path":"scripts/boneObject/boneObject.yy",},}, {"id":{"name":"boneObject","path":"scripts/boneObject/boneObject.yy",},},

View file

@ -0,0 +1,76 @@
{
"isDnd": false,
"volume": 1.0,
"parentRoom": null,
"views": [
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
{"inherit":false,"visible":false,"xview":0,"yview":0,"wview":1366,"hview":768,"xport":0,"yport":0,"wport":1366,"hport":768,"hborder":32,"vborder":32,"hspeed":-1,"vspeed":-1,"objectId":null,},
],
"layers": [
{
"tilesetId": {
"name": "{{name}}",
"path": "tilesets/{{name}}/{{name}}.yy",
},
"x": 0,
"y": 0,
"tiles": {
"SerialiseWidth": 1,
"SerialiseHeight": 1,
"TileSerialiseData": null,
},
"visible": true,
"depth": 0,
"userdefinedDepth": false,
"inheritLayerDepth": false,
"inheritLayerSettings": false,
"gridX": 0,
"gridY": 0,
"layers": [],
"hierarchyFrozen": false,
"resourceVersion": "1.0",
"name": "{{tileName}}",
"tags": [],
"resourceType": "GMRTileLayer",
},
],
"inheritLayers": false,
"creationCodeFile": "",
"inheritCode": false,
"instanceCreationOrder": [],
"inheritCreationOrder": false,
"sequenceId": null,
"roomSettings": {
"inheritRoomSettings": false,
"Width": 480,
"Height": 320,
"persistent": false,
},
"viewSettings": {
"inheritViewSettings": false,
"enableViews": false,
"clearViewBackground": false,
"clearDisplayBuffer": true,
},
"physicsSettings": {
"inheritPhysicsSettings": false,
"PhysicsWorld": false,
"PhysicsWorldGravityX": 0.0,
"PhysicsWorldGravityY": 10.0,
"PhysicsWorldPixToMetres": 0.1,
},
"parent": {
"name": "{{roomname}}",
"path": "folders/{{roomname}}.yy",
},
"resourceVersion": "1.0",
"name": "gamemaker2",
"tags": [],
"resourceType": "GMRoom",
}

View file

@ -0,0 +1,3 @@
function __Binder_Gamemaker(path) constructor {
}

View file

@ -0,0 +1,13 @@
{
"$GMScript":"v1",
"%Name":"binder_gamemaker",
"isCompatibility":false,
"isDnD":false,
"name":"binder_gamemaker",
"parent":{
"name":"binder",
"path":"folders/main/binder.yy",
},
"resourceType":"GMScript",
"resourceVersion":"2.0",
}

View file

@ -8,12 +8,12 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor {
expanded = false; expanded = false;
edit_color_index = -1; edit_color_index = -1;
function apply(value) { #region function apply(value) {
if(!interactable) return; if(!interactable) return;
onApply(value); onApply(value);
} #endregion }
static trigger = function() { #region static trigger = function() {
var dialog = dialogCall(o_dialog_palette, WIN_W / 2, WIN_H / 2); var dialog = dialogCall(o_dialog_palette, WIN_W / 2, WIN_H / 2);
dialog.setDefault(current_palette); dialog.setDefault(current_palette);
dialog.onApply = apply; dialog.onApply = apply;
@ -22,9 +22,9 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor {
if(parentDialog) if(parentDialog)
parentDialog.addChildren(dialog); parentDialog.addChildren(dialog);
} #endregion }
static triggerSingle = function(_index) { #region static triggerSingle = function(_index) {
edit_color_index = _index; edit_color_index = _index;
current_palette = array_clone(current_palette); current_palette = array_clone(current_palette);
@ -33,17 +33,17 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor {
dialog.selector.onApply = editColor; dialog.selector.onApply = editColor;
dialog.onApply = editColor; dialog.onApply = editColor;
dialog.interactable = interactable; dialog.interactable = interactable;
} #endregion }
function editColor(col) { #region function editColor(col) {
if(edit_color_index == -1) return; if(edit_color_index == -1) return;
current_palette[edit_color_index] = col; current_palette[edit_color_index] = col;
apply(current_palette); apply(current_palette);
} #endregion }
static drawParam = function(params) { return draw(params.x, params.y, params.w, params.h, params.data, params.m); } static drawParam = function(params) { return draw(params.x, params.y, params.w, params.h, params.data, params.m); }
static draw = function(_x, _y, _w, _h, _color, _m) { #region static draw = function(_x, _y, _w, _h, _color, _m) {
x = _x; x = _x;
y = _y; y = _y;
w = _w; w = _w;
@ -183,39 +183,43 @@ function buttonPalette(_onApply, dialog = noone) : widget() constructor {
resetFocus(); resetFocus();
return h; return h;
} #endregion }
static clone = function() { #region static clone = function() {
var cln = new buttonPalette(onApply, parentDialog); var cln = new buttonPalette(onApply, parentDialog);
return cln; return cln;
} #endregion }
} }
function drawPalette(_pal, _x, _y, _w, _h, _a = 1) { #region function drawPalette(_pal, _x, _y, _w, _h, _a = 1) {
var aa = array_length(_pal); var am = array_length(_pal);
if(aa == 1) { if(am == 1) {
draw_sprite_stretched_ext(THEME.palette_mask, 1, _x, _y, _w, _h, _pal[0], _a); draw_sprite_stretched_ext(THEME.palette_mask, 1, _x, _y, _w, _h, _pal[0], _a);
return; return;
} }
var aa = min(am, 64);
var st = am / aa;
var ww = _w / aa; var ww = _w / aa;
var _x0 = _x; var _x0 = _x;
var _in; var _in;
for(var i = 0; i < aa; i++) { for(var i = 0; i < am; i += st) {
if(!is_numeric(_pal[i])) continue; var _p = _pal[floor(i)];
if(!is_numeric(_p)) continue;
if(i == 0) _in = 2; if(i == 0) _in = 2;
else if(i == aa - 1) _in = 3; else if(i == aa - 1) _in = 3;
else _in = 0; else _in = 0;
var _ca = _color_get_alpha(_pal[i]); var _ca = _color_get_alpha(_p);
if(_ca == 1) { if(_ca == 1) {
draw_sprite_stretched_ext(THEME.palette_mask, _in, floor(_x0), _y, ceil(ww), _h, _pal[i], _a); draw_sprite_stretched_ext(THEME.palette_mask, _in, floor(_x0), _y, ceil(ww), _h, _p, _a);
} else { } else {
draw_sprite_stretched_ext(THEME.palette_mask, _in, floor(_x0), _y, ceil(ww), _h - ui(8), _pal[i], _a); draw_sprite_stretched_ext(THEME.palette_mask, _in, floor(_x0), _y, ceil(ww), _h - ui(8), _p, _a);
draw_sprite_stretched_ext(THEME.palette_mask, 1, floor(_x0), _y + _h - ui(6), ceil(ww), ui(6), c_black, _a); draw_sprite_stretched_ext(THEME.palette_mask, 1, floor(_x0), _y + _h - ui(6), ceil(ww), ui(6), c_black, _a);
draw_sprite_stretched_ext(THEME.palette_mask, 1, floor(_x0), _y + _h - ui(6), ceil(ww) * _ca, ui(6), c_white, _a); draw_sprite_stretched_ext(THEME.palette_mask, 1, floor(_x0), _y + _h - ui(6), ceil(ww) * _ca, ui(6), c_white, _a);
@ -223,9 +227,9 @@ function drawPalette(_pal, _x, _y, _w, _h, _a = 1) { #region
_x0 += ww; _x0 += ww;
} }
} #endregion }
function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) {
var c_color = struct_try_get(params, "color", -1); var c_color = struct_try_get(params, "color", -1);
var _stretch = struct_try_get(params, "stretch", true); var _stretch = struct_try_get(params, "stretch", true);
var _mx = struct_try_get(params, "mx", -1); var _mx = struct_try_get(params, "mx", -1);
@ -301,4 +305,4 @@ function drawPaletteGrid(_pal, _x, _y, _w, _gs = 24, params = {}) { #region
hoverColor: _hcc, hoverColor: _hcc,
hoverBBOX: [ hvx, hvy, hvw, hvh ], hoverBBOX: [ hvx, hvy, hvw, hvh ],
}; };
} #endregion }

View file

@ -28,7 +28,11 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
] ]
current_palette = []; current_palette = [];
current_color = 0; current_color = 0;
extraction_step = 0;
extraction_total = 0;
extraction_current = 0;
attribute_surface_depth(); attribute_surface_depth();
@ -73,8 +77,8 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
draw_surface_stretched_safe(_surfFull, 0, 0, ww, hh); draw_surface_stretched_safe(_surfFull, 0, 0, ww, hh);
surface_reset_shader(); surface_reset_shader();
var c_buffer = buffer_create(ww * hh * 4, buffer_fixed, 2); var c_buffer = buffer_create(ww * hh * 4, buffer_fixed, 4);
var colors = []; var colors = array_create(ww * hh), ind = 0;
buffer_get_surface(c_buffer, _surf, 0); buffer_get_surface(c_buffer, _surf, 0);
buffer_seek(c_buffer, buffer_seek_start, 0); buffer_seek(c_buffer, buffer_seek_start, 0);
@ -95,17 +99,18 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
case 2 : col = [ _color_get_hue(c), _color_get_saturation(c), _color_get_value(c), 0 ]; break; case 2 : col = [ _color_get_hue(c), _color_get_saturation(c), _color_get_value(c), 0 ]; break;
} }
array_push(colors, col); colors[ind++] = col;
_min[0] = min(_min[0], col[0]); _max[0] = max(_max[0], col[0]); _min[0] = min(_min[0], col[0]); _max[0] = max(_max[0], col[0]);
_min[1] = min(_min[1], col[1]); _max[1] = max(_max[1], col[1]); _min[1] = min(_min[1], col[1]); _max[1] = max(_max[1], col[1]);
_min[2] = min(_min[2], col[2]); _max[2] = max(_max[2], col[2]); _min[2] = min(_min[2], col[2]); _max[2] = max(_max[2], col[2]);
} }
array_resize(colors, ind);
buffer_delete(c_buffer); buffer_delete(c_buffer);
random_set_seed(_seed); random_set_seed(_seed);
cnt = array_create_ext(_size, function() /*=>*/ {return [ random(1), random(1), random(1), 0 ]}); var cnt = array_create_ext(_size, function() /*=>*/ {return [ random(1), random(1), random(1), 0 ]});
repeat(8) { repeat(8) {
// var _cnt = array_create_ext(_size, (i) => [ cnt[i][0], cnt[i][1], cnt[i][2], 0 ]); // var _cnt = array_create_ext(_size, (i) => [ cnt[i][0], cnt[i][1], cnt[i][2], 0 ]);
@ -152,7 +157,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
// if(del < 0.001) break; // if(del < 0.001) break;
} }
var palette = []; var palette = array_create(_size), ind = 0;
var clr; var clr;
for( var i = 0; i < _size; i++ ) { for( var i = 0; i < _size; i++ ) {
@ -178,10 +183,13 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
case 2 : clr = make_color_hsva(_cc[0] * 255, _cc[1] * 255, _cc[2] * 255, 255); break; case 2 : clr = make_color_hsva(_cc[0] * 255, _cc[1] * 255, _cc[2] * 255, 255); break;
} }
array_push_unique(palette, clr); palette[ind++] = clr;
} }
surface_free(_surf); surface_free(_surf);
var palLen = array_unique_ext(palette, 0, ind);
array_resize(palette, palLen);
sortPalette(palette); sortPalette(palette);
return palette; return palette;
@ -191,25 +199,25 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
var ww = surface_get_width_safe(_surfFull); var ww = surface_get_width_safe(_surfFull);
var hh = surface_get_height_safe(_surfFull); var hh = surface_get_height_safe(_surfFull);
var c_buffer = buffer_create(ww * hh * 4, buffer_fixed, 2); var c_buffer = buffer_create(ww * hh * 4, buffer_fixed, 4);
buffer_get_surface(c_buffer, _surfFull, 0); buffer_get_surface(c_buffer, _surfFull, 0);
buffer_seek(c_buffer, buffer_seek_start, 0); buffer_seek(c_buffer, buffer_seek_start, 0);
var palette = []; var amo = ww * hh;
var palette = array_create(amo), ind = 0;
var bm = 0b11111111 << 24;
for( var i = 0; i < ww * hh; i++ ) { for( var i = 0; i < amo; i++ ) {
var b = buffer_read(c_buffer, buffer_u32); var c = buffer_read(c_buffer, buffer_u32);
var c = b; if(c & bm == 0) continue;
var a = b & (0b11111111 << 24); palette[ind++] = c;
if(a == 0) continue;
c = make_color_rgba(color_get_red(c), color_get_green(c), color_get_blue(c), color_get_alpha(c));
if(!array_exists(palette, c))
array_push(palette, c);
} }
buffer_delete(c_buffer); buffer_delete(c_buffer);
var palLen = array_unique_ext(palette, 0, ind);
array_resize(palette, palLen);
return palette; return palette;
} }
@ -261,7 +269,7 @@ function Node_Palette_Extract(_x, _y, _group = noone) : Node_Processor(_x, _y, _
var amo = min(_size, ds_priority_size(pr)); var amo = min(_size, ds_priority_size(pr));
var pal = array_create(amo), ind = 0; var pal = array_create(amo), ind = 0;
repeat(amo) { pal[ind++] = ds_priority_delete_max(pr); } repeat(amo) { pal[ind++] = ds_priority_delete_max(pr); }
ds_priority_destroy(pr); ds_priority_destroy(pr);
ds_map_destroy(clrs); ds_map_destroy(clrs);

View file

@ -7,21 +7,44 @@ function Node_Tile_Tilemap_Export(_x, _y, _group = noone) : Node(_x, _y, _group)
.setDisplay(VALUE_DISPLAY.path_save, { filter: "" }) .setDisplay(VALUE_DISPLAY.path_save, { filter: "" })
.setVisible(true); .setVisible(true);
export_format = [ "CSV", "JSON" ]; export_format = [ "CSV", "GameMaker" ];
newInput( 2, nodeValue_Enum_Scroll("Format", self, 0, export_format)); newInput( 2, nodeValue_Enum_Scroll("Format", self, 0, export_format));
newInput( 3, nodeValue_Enum_Scroll("GM Export Type", self, 0, [ "Room" ]));
newInput( 4, nodeValue_Path("GM Room", self, ""))
.setDisplay(VALUE_DISPLAY.path_load, { filter: "GameMaker room|*.yy" })
.setVisible(false, false);
newInput( 5, nodeValue_Text("GM Room Name", self, "rmRoom"));
newInput( 6, nodeValue_Text("GM Layer Name", self, "Tiles_1"));
newInput( 7, nodeValue_Tileset("Tileset", self, noone))
.setVisible(true, true);
newInput( 8, nodeValue_Path("GD Scene", self, ""))
.setDisplay(VALUE_DISPLAY.path_load, { filter: "Godot scene|*.tscn" })
.setVisible(false, false);
input_display_list = [ 7, 0,
["Output", false], 1, 2,
["GameMaker", true], 3, 4, 5, 6,
["Godot", true], 8,
];
insp1UpdateTooltip = "Export"; insp1UpdateTooltip = "Export";
insp1UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ]; insp1UpdateIcon = [ THEME.sequence_control, 1, COLORS._main_value_positive ];
static onInspector1Update = function(_fromValue = false) { static onInspector1Update = function(_fromValue = false) { export(); }
export();
}
static export = function() { static export = function() {
var tilemap = inputs[0].getValue(); var tilemap = inputs[0].getValue();
var path = inputs[1].getValue(); var path = inputs[1].getValue();
var format = inputs[2].getValue(); var format = inputs[2].getValue();
var tileset = inputs[7].getValue();
if(tileset == noone) return;
if(!is_surface(tilemap)) return; if(!is_surface(tilemap)) return;
var _form = surface_get_format(tilemap); var _form = surface_get_format(tilemap);
@ -30,6 +53,9 @@ function Node_Tile_Tilemap_Export(_x, _y, _group = noone) : Node(_x, _y, _group)
return; return;
} }
var tileSize = tileset.tileSize;
var tileName = tileset.getDisplayName();
var _dim = surface_get_dimension(tilemap); var _dim = surface_get_dimension(tilemap);
var _buff = buffer_from_surface(tilemap, false); buffer_to_start(_buff); var _buff = buffer_from_surface(tilemap, false); buffer_to_start(_buff);
var _data = array_create(_dim[1]); var _data = array_create(_dim[1]);
@ -72,11 +98,69 @@ function Node_Tile_Tilemap_Export(_x, _y, _group = noone) : Node(_x, _y, _group)
noti.path = filename_dir(path); noti.path = filename_dir(path);
noti.setOnClick(function() /*=>*/ { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer); noti.setOnClick(function() /*=>*/ { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
} else {
} }
break; break;
case "GameMaker":
var gmType = inputs[3].getValue();
var gmRoom = inputs[4].getValue();
var gmRname = inputs[5].getValue();
var gmLname = inputs[6].getValue();
// inputs[5].setVisible(gmType == 0);
// inputs[6].setVisible(gmType == 1);
var _tile_arr = array_create(_dim[0] * _dim[1]), ind = 0;
for( var i = 0; i < _dim[0]; i++ )
for( var j = 0; j < _dim[1]; j++ ) {
_tile_arr[ind++] = _data[i][j];
}
var _templateDir = filepath_resolve("%APP%/data/TemplateStrings/");
if(gmType == 0) {
var _template_str = file_read_all(_templateDir + "tileset_gamemaker2_room.yy");
var _template_map = json_try_parse(_template_str);
if(_template_map == -1) return;
_template_map.parent.name = gmRname;
_template_map.parent.path = $"folders/{gmRname}.yy";
var _layer = _template_map.layers[0];
_layer.name = gmLname;
_layer.gridX = tileSize[0] / 2;
_layer.gridY = tileSize[1] / 2;
_layer.tilesetId.name = tileName;
_layer.tilesetId.path = $"tilesets/{tileName}/{tileName}.yy";
_layer.tiles.SerialiseWidth = _dim[0];
_layer.tiles.SerialiseHeight = _dim[1];
_layer.tiles.TileSerialiseData = _tile_arr;
path = filename_change_ext(path, ".yy");
if(file_exists_empty(path)) file_delete(path);
file_text_write_all(path, json_stringify(_template_map, true));
var _txt = $"Export GameMaker room complete.";
logNode(_txt);
var noti = log_message("EXPORT", _txt, THEME.noti_icon_tick, COLORS._main_value_positive, false);
noti.path = filename_dir(path);
noti.setOnClick(function() /*=>*/ { shellOpenExplorer(self.path); }, "Open in explorer", THEME.explorer);
}
break;
case "Godot":
var gdScene = inputs[8].getValue();
if(!file_exists_empty(gdScene)) return;
var _gdData = file_read_all(gdScene);
break;
} }
} }

View file

@ -36,9 +36,8 @@
globalNode = new Node_Global(); globalNode = new Node_Global();
nodeController = new __Node_Controller(self); nodeController = new __Node_Controller(self);
load_layout = false; load_layout = false;
previewNode = "";
previewNode = "";
inspectingNode = ""; inspectingNode = "";
previewGrid = { previewGrid = {
@ -89,6 +88,14 @@
tunnels_in_map = ds_map_create(); tunnels_in_map = ds_map_create();
tunnels_out = ds_map_create(); tunnels_out = ds_map_create();
#region ===================== BINDERS ====================
bind_gamemaker_path = "";
bind_godot_path = "";
bind_gamemaker = noone;
bind_godot = noone;
#endregion
#region =================== ATTRIBUTES =================== #region =================== ATTRIBUTES ===================
attributes = variable_clone(PROJECT_ATTRIBUTES); attributes = variable_clone(PROJECT_ATTRIBUTES);
@ -259,6 +266,9 @@
} }
_map.addon = _addon; _map.addon = _addon;
_map.bind_gamemaker_path = bind_gamemaker_path;
_map.bind_godot_path = bind_godot_path;
return _map; return _map;
} }
@ -313,6 +323,9 @@
var _node = nodeMap[? inspectingNode]; var _node = nodeMap[? inspectingNode];
if(_node) PANEL_INSPECTOR.setInspecting(_node); if(_node) PANEL_INSPECTOR.setInspecting(_node);
} }
if(struct_has(_map, "bind_gamemaker_path")) bind_gamemaker_path = _map.bind_gamemaker_path;
if(struct_has(_map, "bind_godot_path")) bind_godot_path = _map.bind_godot_path;
} }
static postDeserialize = function() { static postDeserialize = function() {