2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* tile_set_editor_plugin.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
2018-01-01 14:40:08 +01:00
/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) */
2014-02-10 02:10:30 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2014-02-10 02:10:30 +01:00
# include "tile_set_editor_plugin.h"
2017-01-16 08:04:19 +01:00
2018-07-29 23:54:12 +02:00
# include "core/os/input.h"
# include "core/os/keyboard.h"
2017-10-22 03:42:23 +02:00
# include "editor/plugins/canvas_item_editor_plugin.h"
2014-02-10 02:10:30 +01:00
# include "scene/2d/physics_body_2d.h"
2017-03-05 16:44:50 +01:00
# include "scene/2d/sprite.h"
2017-01-16 08:04:19 +01:00
2017-03-05 16:44:50 +01:00
void TileSetEditor : : edit ( const Ref < TileSet > & p_tileset ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
tileset = p_tileset ;
2018-02-17 12:08:44 +01:00
tileset - > add_change_receptor ( this ) ;
2018-07-29 23:54:12 +02:00
texture_list - > clear ( ) ;
texture_map . clear ( ) ;
update_texture_list ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-05-19 23:49:37 +02:00
void TileSetEditor : : _import_node ( Node * p_node , Ref < TileSet > p_library ) {
2014-02-10 02:10:30 +01:00
2017-05-19 23:49:37 +02:00
for ( int i = 0 ; i < p_node - > get_child_count ( ) ; i + + ) {
2014-02-10 02:10:30 +01:00
2017-05-19 23:49:37 +02:00
Node * child = p_node - > get_child ( i ) ;
2014-02-10 02:10:30 +01:00
2017-08-24 22:58:51 +02:00
if ( ! Object : : cast_to < Sprite > ( child ) ) {
2017-03-05 16:44:50 +01:00
if ( child - > get_child_count ( ) > 0 ) {
2017-05-19 23:49:37 +02:00
_import_node ( child , p_library ) ;
}
2014-02-10 02:10:30 +01:00
2017-05-19 23:49:37 +02:00
continue ;
2015-03-09 06:34:56 +01:00
}
2014-02-10 02:10:30 +01:00
2017-08-24 22:58:51 +02:00
Sprite * mi = Object : : cast_to < Sprite > ( child ) ;
2017-03-05 16:44:50 +01:00
Ref < Texture > texture = mi - > get_texture ( ) ;
2017-06-22 17:15:50 +02:00
Ref < Texture > normal_map = mi - > get_normal_map ( ) ;
2017-04-07 04:36:37 +02:00
Ref < ShaderMaterial > material = mi - > get_material ( ) ;
2015-03-09 06:34:56 +01:00
if ( texture . is_null ( ) )
2014-02-10 02:10:30 +01:00
continue ;
2015-03-09 06:34:56 +01:00
int id = p_library - > find_tile_by_name ( mi - > get_name ( ) ) ;
2017-03-05 16:44:50 +01:00
if ( id < 0 ) {
2015-03-09 06:34:56 +01:00
2017-03-05 16:44:50 +01:00
id = p_library - > get_last_unused_tile_id ( ) ;
2015-03-09 06:34:56 +01:00
p_library - > create_tile ( id ) ;
2017-03-05 16:44:50 +01:00
p_library - > tile_set_name ( id , mi - > get_name ( ) ) ;
2015-03-09 06:34:56 +01:00
}
2017-03-05 16:44:50 +01:00
p_library - > tile_set_texture ( id , texture ) ;
2017-06-22 17:15:50 +02:00
p_library - > tile_set_normal_map ( id , normal_map ) ;
2017-03-05 16:44:50 +01:00
p_library - > tile_set_material ( id , material ) ;
2015-03-09 06:34:56 +01:00
2017-03-05 16:44:50 +01:00
p_library - > tile_set_modulate ( id , mi - > get_modulate ( ) ) ;
2016-11-30 14:33:39 +01:00
2015-03-09 06:34:56 +01:00
Vector2 phys_offset ;
2016-07-05 20:40:22 +02:00
Size2 s ;
2015-03-09 06:34:56 +01:00
if ( mi - > is_region ( ) ) {
2017-03-05 16:44:50 +01:00
s = mi - > get_region_rect ( ) . size ;
p_library - > tile_set_region ( id , mi - > get_region_rect ( ) ) ;
2016-07-05 20:40:22 +02:00
} else {
const int frame = mi - > get_frame ( ) ;
const int hframes = mi - > get_hframes ( ) ;
2017-03-05 16:44:50 +01:00
s = texture - > get_size ( ) / Size2 ( hframes , mi - > get_vframes ( ) ) ;
p_library - > tile_set_region ( id , Rect2 ( Vector2 ( frame % hframes , frame / hframes ) * s , s ) ) ;
2016-07-05 20:40:22 +02:00
}
2017-03-05 16:44:50 +01:00
2016-07-05 20:40:22 +02:00
if ( mi - > is_centered ( ) ) {
2017-03-05 16:44:50 +01:00
phys_offset + = - s / 2 ;
2015-03-09 06:34:56 +01:00
}
2017-07-01 19:56:51 +02:00
Vector < TileSet : : ShapeData > collisions ;
2015-03-09 06:34:56 +01:00
Ref < NavigationPolygon > nav_poly ;
Ref < OccluderPolygon2D > occluder ;
2017-07-01 19:56:51 +02:00
bool found_collisions = false ;
2015-03-09 06:34:56 +01:00
2017-03-05 16:44:50 +01:00
for ( int j = 0 ; j < mi - > get_child_count ( ) ; j + + ) {
2015-03-09 06:34:56 +01:00
Node * child2 = mi - > get_child ( j ) ;
2017-08-24 22:58:51 +02:00
if ( Object : : cast_to < NavigationPolygonInstance > ( child2 ) )
nav_poly = Object : : cast_to < NavigationPolygonInstance > ( child2 ) - > get_navigation_polygon ( ) ;
2015-03-09 06:34:56 +01:00
2017-08-24 22:58:51 +02:00
if ( Object : : cast_to < LightOccluder2D > ( child2 ) )
occluder = Object : : cast_to < LightOccluder2D > ( child2 ) - > get_occluder_polygon ( ) ;
2015-03-09 06:34:56 +01:00
2017-08-24 22:58:51 +02:00
if ( ! Object : : cast_to < StaticBody2D > ( child2 ) )
2015-03-09 06:34:56 +01:00
continue ;
2017-07-01 19:56:51 +02:00
found_collisions = true ;
2017-08-24 22:58:51 +02:00
StaticBody2D * sb = Object : : cast_to < StaticBody2D > ( child2 ) ;
2017-06-24 04:30:43 +02:00
List < uint32_t > shapes ;
sb - > get_shape_owners ( & shapes ) ;
for ( List < uint32_t > : : Element * E = shapes . front ( ) ; E ; E = E - > next ( ) ) {
2017-07-01 19:56:51 +02:00
if ( sb - > is_shape_owner_disabled ( E - > get ( ) ) ) continue ;
2017-06-24 04:30:43 +02:00
2018-06-03 15:32:23 +02:00
Transform2D shape_transform = sb - > get_transform ( ) * sb - > shape_owner_get_transform ( E - > get ( ) ) ;
2017-06-25 20:47:30 +02:00
bool one_way = sb - > is_shape_owner_one_way_collision_enabled ( E - > get ( ) ) ;
2018-06-03 15:32:23 +02:00
shape_transform [ 2 ] - = phys_offset ;
2017-07-01 19:56:51 +02:00
2017-06-24 04:30:43 +02:00
for ( int k = 0 ; k < sb - > shape_owner_get_shape_count ( E - > get ( ) ) ; k + + ) {
2017-07-01 19:56:51 +02:00
Ref < Shape2D > shape = sb - > shape_owner_get_shape ( E - > get ( ) , k ) ;
TileSet : : ShapeData shape_data ;
shape_data . shape = shape ;
shape_data . shape_transform = shape_transform ;
shape_data . one_way_collision = one_way ;
collisions . push_back ( shape_data ) ;
2015-10-25 23:13:46 +01:00
}
2014-04-19 21:46:52 +02:00
}
2015-03-09 06:34:56 +01:00
}
2014-02-10 02:10:30 +01:00
2017-07-01 19:56:51 +02:00
if ( found_collisions ) {
p_library - > tile_set_shapes ( id , collisions ) ;
}
2017-03-05 16:44:50 +01:00
p_library - > tile_set_texture_offset ( id , mi - > get_offset ( ) ) ;
p_library - > tile_set_navigation_polygon ( id , nav_poly ) ;
p_library - > tile_set_light_occluder ( id , occluder ) ;
p_library - > tile_set_occluder_offset ( id , - phys_offset ) ;
p_library - > tile_set_navigation_polygon_offset ( id , - phys_offset ) ;
2018-02-17 11:58:07 +01:00
p_library - > tile_set_z_index ( id , mi - > get_z_index ( ) ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-08-12 18:52:50 +02:00
void TileSetEditor : : _import_scene ( Node * p_scene , Ref < TileSet > p_library , bool p_merge ) {
2017-05-19 23:49:37 +02:00
if ( ! p_merge )
p_library - > clear ( ) ;
2017-08-12 18:52:50 +02:00
_import_node ( p_scene , p_library ) ;
2017-05-19 23:49:37 +02:00
}
2017-03-05 16:44:50 +01:00
Error TileSetEditor : : update_library_file ( Node * p_base_scene , Ref < TileSet > ml , bool p_merge ) {
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
_import_scene ( p_base_scene , ml , p_merge ) ;
2014-02-10 02:10:30 +01:00
return OK ;
}
void TileSetEditor : : _bind_methods ( ) {
2018-11-24 05:38:26 +01:00
2018-07-29 23:54:12 +02:00
ClassDB : : bind_method ( " _on_tileset_toolbar_button_pressed " , & TileSetEditor : : _on_tileset_toolbar_button_pressed ) ;
ClassDB : : bind_method ( " _on_textures_added " , & TileSetEditor : : _on_textures_added ) ;
ClassDB : : bind_method ( " _on_tileset_toolbar_confirm " , & TileSetEditor : : _on_tileset_toolbar_confirm ) ;
ClassDB : : bind_method ( " _on_texture_list_selected " , & TileSetEditor : : _on_texture_list_selected ) ;
2018-02-17 12:08:44 +01:00
ClassDB : : bind_method ( " _on_edit_mode_changed " , & TileSetEditor : : _on_edit_mode_changed ) ;
2018-07-29 23:54:12 +02:00
ClassDB : : bind_method ( " _on_workspace_mode_changed " , & TileSetEditor : : _on_workspace_mode_changed ) ;
2018-03-02 12:36:18 +01:00
ClassDB : : bind_method ( " _on_workspace_overlay_draw " , & TileSetEditor : : _on_workspace_overlay_draw ) ;
2018-07-29 23:54:12 +02:00
ClassDB : : bind_method ( " _on_workspace_process " , & TileSetEditor : : _on_workspace_process ) ;
2018-02-17 12:08:44 +01:00
ClassDB : : bind_method ( " _on_workspace_draw " , & TileSetEditor : : _on_workspace_draw ) ;
ClassDB : : bind_method ( " _on_workspace_input " , & TileSetEditor : : _on_workspace_input ) ;
ClassDB : : bind_method ( " _on_tool_clicked " , & TileSetEditor : : _on_tool_clicked ) ;
ClassDB : : bind_method ( " _on_priority_changed " , & TileSetEditor : : _on_priority_changed ) ;
2018-07-02 15:39:39 +02:00
ClassDB : : bind_method ( " _on_z_index_changed " , & TileSetEditor : : _on_z_index_changed ) ;
2018-02-17 12:08:44 +01:00
ClassDB : : bind_method ( " _on_grid_snap_toggled " , & TileSetEditor : : _on_grid_snap_toggled ) ;
2018-07-29 23:54:12 +02:00
ClassDB : : bind_method ( " _set_snap_step " , & TileSetEditor : : _set_snap_step ) ;
ClassDB : : bind_method ( " _set_snap_off " , & TileSetEditor : : _set_snap_off ) ;
ClassDB : : bind_method ( " _set_snap_sep " , & TileSetEditor : : _set_snap_sep ) ;
2018-11-24 05:38:26 +01:00
ClassDB : : bind_method ( " _zoom_in " , & TileSetEditor : : _zoom_in ) ;
ClassDB : : bind_method ( " _zoom_out " , & TileSetEditor : : _zoom_out ) ;
ClassDB : : bind_method ( " _zoom_reset " , & TileSetEditor : : _zoom_reset ) ;
2014-02-10 02:10:30 +01:00
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _notification ( int p_what ) {
2018-11-24 05:38:26 +01:00
switch ( p_what ) {
case NOTIFICATION_READY : {
add_constant_override ( " autohide " , 1 ) ; // Fixes the dragger always showing up.
} break ;
case NOTIFICATION_ENTER_TREE :
case NOTIFICATION_THEME_CHANGED : {
tileset_toolbar_buttons [ TOOL_TILESET_ADD_TEXTURE ] - > set_icon ( get_icon ( " ToolAddNode " , " EditorIcons " ) ) ;
tileset_toolbar_buttons [ TOOL_TILESET_REMOVE_TEXTURE ] - > set_icon ( get_icon ( " Remove " , " EditorIcons " ) ) ;
tileset_toolbar_tools - > set_icon ( get_icon ( " Tools " , " EditorIcons " ) ) ;
tool_workspacemode [ WORKSPACE_EDIT ] - > set_icon ( get_icon ( " Edit " , " EditorIcons " ) ) ;
tool_workspacemode [ WORKSPACE_CREATE_SINGLE ] - > set_icon ( get_icon ( " AddSingleTile " , " EditorIcons " ) ) ;
tool_workspacemode [ WORKSPACE_CREATE_AUTOTILE ] - > set_icon ( get_icon ( " AddAutotile " , " EditorIcons " ) ) ;
tool_workspacemode [ WORKSPACE_CREATE_ATLAS ] - > set_icon ( get_icon ( " AddAtlasTile " , " EditorIcons " ) ) ;
tools [ TOOL_SELECT ] - > set_icon ( get_icon ( " ToolSelect " , " EditorIcons " ) ) ;
tools [ BITMASK_COPY ] - > set_icon ( get_icon ( " Duplicate " , " EditorIcons " ) ) ;
tools [ BITMASK_PASTE ] - > set_icon ( get_icon ( " Override " , " EditorIcons " ) ) ;
tools [ BITMASK_CLEAR ] - > set_icon ( get_icon ( " Clear " , " EditorIcons " ) ) ;
tools [ SHAPE_NEW_POLYGON ] - > set_icon ( get_icon ( " CollisionPolygon2D " , " EditorIcons " ) ) ;
tools [ SHAPE_DELETE ] - > set_icon ( get_icon ( " Remove " , " EditorIcons " ) ) ;
tools [ SHAPE_KEEP_INSIDE_TILE ] - > set_icon ( get_icon ( " Snap " , " EditorIcons " ) ) ;
tools [ TOOL_GRID_SNAP ] - > set_icon ( get_icon ( " SnapGrid " , " EditorIcons " ) ) ;
tools [ ZOOM_OUT ] - > set_icon ( get_icon ( " ZoomLess " , " EditorIcons " ) ) ;
tools [ ZOOM_1 ] - > set_icon ( get_icon ( " ZoomReset " , " EditorIcons " ) ) ;
tools [ ZOOM_IN ] - > set_icon ( get_icon ( " ZoomMore " , " EditorIcons " ) ) ;
tools [ VISIBLE_INFO ] - > set_icon ( get_icon ( " InformationSign " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_REGION ] - > set_icon ( get_icon ( " RegionEdit " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_COLLISION ] - > set_icon ( get_icon ( " StaticBody2D " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_OCCLUSION ] - > set_icon ( get_icon ( " LightOccluder2D " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_NAVIGATION ] - > set_icon ( get_icon ( " Navigation2D " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_BITMASK ] - > set_icon ( get_icon ( " PackedDataContainer " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_PRIORITY ] - > set_icon ( get_icon ( " MaterialPreviewLight1 " , " EditorIcons " ) ) ;
tool_editmode [ EDITMODE_ICON ] - > set_icon ( get_icon ( " LargeTexture " , " EditorIcons " ) ) ;
2018-07-02 15:39:39 +02:00
tool_editmode [ EDITMODE_Z_INDEX ] - > set_icon ( get_icon ( " Sort " , " EditorIcons " ) ) ;
2018-11-24 05:38:26 +01:00
scroll - > add_style_override ( " bg " , get_stylebox ( " bg " , " Tree " ) ) ;
} break ;
2017-10-22 03:42:23 +02:00
}
2014-02-10 02:10:30 +01:00
}
2018-07-29 23:54:12 +02:00
TileSetEditor : : TileSetEditor ( EditorNode * p_editor ) {
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
editor = p_editor ;
2018-11-24 05:38:26 +01:00
current_tile = - 1 ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
VBoxContainer * left_container = memnew ( VBoxContainer ) ;
2018-11-24 05:38:26 +01:00
add_child ( left_container ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
texture_list = memnew ( ItemList ) ;
left_container - > add_child ( texture_list ) ;
texture_list - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
texture_list - > set_custom_minimum_size ( Size2 ( 200 , 0 ) ) ;
texture_list - > connect ( " item_selected " , this , " _on_texture_list_selected " ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
HBoxContainer * tileset_toolbar_container = memnew ( HBoxContainer ) ;
left_container - > add_child ( tileset_toolbar_container ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
tileset_toolbar_buttons [ TOOL_TILESET_ADD_TEXTURE ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tileset_toolbar_buttons [ TOOL_TILESET_ADD_TEXTURE ] - > connect ( " pressed " , this , " _on_tileset_toolbar_button_pressed " , varray ( TOOL_TILESET_ADD_TEXTURE ) ) ;
2018-07-29 23:54:12 +02:00
tileset_toolbar_container - > add_child ( tileset_toolbar_buttons [ TOOL_TILESET_ADD_TEXTURE ] ) ;
2018-11-24 05:38:26 +01:00
tileset_toolbar_buttons [ TOOL_TILESET_ADD_TEXTURE ] - > set_tooltip ( TTR ( " Add Texture(s) to TileSet. " ) ) ;
2018-07-29 23:54:12 +02:00
tileset_toolbar_buttons [ TOOL_TILESET_REMOVE_TEXTURE ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tileset_toolbar_buttons [ TOOL_TILESET_REMOVE_TEXTURE ] - > connect ( " pressed " , this , " _on_tileset_toolbar_button_pressed " , varray ( TOOL_TILESET_REMOVE_TEXTURE ) ) ;
2018-07-29 23:54:12 +02:00
tileset_toolbar_container - > add_child ( tileset_toolbar_buttons [ TOOL_TILESET_REMOVE_TEXTURE ] ) ;
2018-11-24 05:38:26 +01:00
tileset_toolbar_buttons [ TOOL_TILESET_REMOVE_TEXTURE ] - > set_tooltip ( TTR ( " Remove selected Texture from TileSet. " ) ) ;
2018-07-29 23:54:12 +02:00
Control * toolbar_separator = memnew ( Control ) ;
toolbar_separator - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tileset_toolbar_container - > add_child ( toolbar_separator ) ;
tileset_toolbar_tools = memnew ( MenuButton ) ;
2018-11-24 05:38:26 +01:00
tileset_toolbar_tools - > set_text ( TTR ( " Tools " ) ) ;
2018-07-29 23:54:12 +02:00
tileset_toolbar_tools - > get_popup ( ) - > add_item ( TTR ( " Create from Scene " ) , TOOL_TILESET_CREATE_SCENE ) ;
tileset_toolbar_tools - > get_popup ( ) - > add_item ( TTR ( " Merge from Scene " ) , TOOL_TILESET_MERGE_SCENE ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
tileset_toolbar_tools - > get_popup ( ) - > connect ( " id_pressed " , this , " _on_tileset_toolbar_button_pressed " ) ;
tileset_toolbar_container - > add_child ( tileset_toolbar_tools ) ;
//---------------
VBoxContainer * right_container = memnew ( VBoxContainer ) ;
right_container - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2018-11-24 05:38:26 +01:00
add_child ( right_container ) ;
2017-10-22 03:42:23 +02:00
dragging_point = - 1 ;
creating_shape = false ;
2017-12-28 06:57:37 +01:00
snap_step = Vector2 ( 32 , 32 ) ;
2018-07-29 23:54:12 +02:00
snap_offset = WORKSPACE_MARGIN ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
set_custom_minimum_size ( Size2 ( 0 , 150 ) ) ;
2017-10-22 03:42:23 +02:00
VBoxContainer * main_vb = memnew ( VBoxContainer ) ;
2018-07-29 23:54:12 +02:00
right_container - > add_child ( main_vb ) ;
main_vb - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2017-10-22 03:42:23 +02:00
HBoxContainer * tool_hb = memnew ( HBoxContainer ) ;
Ref < ButtonGroup > g ( memnew ( ButtonGroup ) ) ;
2018-07-29 23:54:12 +02:00
String workspace_label [ WORKSPACE_MODE_MAX ] = { " Edit " , " New Single Tile " , " New Autotile " , " New Atlas " } ;
for ( int i = 0 ; i < ( int ) WORKSPACE_MODE_MAX ; i + + ) {
tool_workspacemode [ i ] = memnew ( Button ) ;
2018-11-24 05:38:26 +01:00
tool_workspacemode [ i ] - > set_text ( TTR ( workspace_label [ i ] ) ) ;
2018-07-29 23:54:12 +02:00
tool_workspacemode [ i ] - > set_toggle_mode ( true ) ;
tool_workspacemode [ i ] - > set_button_group ( g ) ;
2018-11-24 05:38:26 +01:00
tool_workspacemode [ i ] - > connect ( " pressed " , this , " _on_workspace_mode_changed " , varray ( i ) ) ;
2018-07-29 23:54:12 +02:00
tool_hb - > add_child ( tool_workspacemode [ i ] ) ;
}
2018-08-13 01:24:20 +02:00
Control * spacer = memnew ( Control ) ;
spacer - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tool_hb - > add_child ( spacer ) ;
2018-11-24 05:38:26 +01:00
tool_hb - > move_child ( spacer , WORKSPACE_CREATE_SINGLE ) ;
2018-08-13 01:24:20 +02:00
2018-07-29 23:54:12 +02:00
tool_workspacemode [ WORKSPACE_EDIT ] - > set_pressed ( true ) ;
workspace_mode = WORKSPACE_EDIT ;
main_vb - > add_child ( tool_hb ) ;
main_vb - > add_child ( memnew ( HSeparator ) ) ;
tool_hb = memnew ( HBoxContainer ) ;
g = Ref < ButtonGroup > ( memnew ( ButtonGroup ) ) ;
2018-07-02 15:39:39 +02:00
String label [ EDITMODE_MAX ] = { " Region " , " Collision " , " Occlusion " , " Navigation " , " Bitmask " , " Priority " , " Icon " , " Z Index " } ;
2017-10-22 03:42:23 +02:00
for ( int i = 0 ; i < ( int ) EDITMODE_MAX ; i + + ) {
tool_editmode [ i ] = memnew ( Button ) ;
tool_editmode [ i ] - > set_text ( label [ i ] ) ;
tool_editmode [ i ] - > set_toggle_mode ( true ) ;
tool_editmode [ i ] - > set_button_group ( g ) ;
2018-11-24 05:38:26 +01:00
tool_editmode [ i ] - > connect ( " pressed " , this , " _on_edit_mode_changed " , varray ( i ) ) ;
2017-10-22 03:42:23 +02:00
tool_hb - > add_child ( tool_editmode [ i ] ) ;
}
2018-02-17 12:08:44 +01:00
tool_editmode [ EDITMODE_COLLISION ] - > set_pressed ( true ) ;
edit_mode = EDITMODE_COLLISION ;
2017-10-22 03:42:23 +02:00
main_vb - > add_child ( tool_hb ) ;
2018-08-13 01:24:20 +02:00
separator_editmode = memnew ( HSeparator ) ;
main_vb - > add_child ( separator_editmode ) ;
2017-10-22 03:42:23 +02:00
toolbar = memnew ( HBoxContainer ) ;
Ref < ButtonGroup > tg ( memnew ( ButtonGroup ) ) ;
tools [ TOOL_SELECT ] = memnew ( ToolButton ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ TOOL_SELECT ] ) ;
2017-10-22 03:42:23 +02:00
tools [ TOOL_SELECT ] - > set_toggle_mode ( true ) ;
tools [ TOOL_SELECT ] - > set_button_group ( tg ) ;
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
2018-11-24 05:38:26 +01:00
tools [ TOOL_SELECT ] - > connect ( " pressed " , this , " _on_tool_clicked " , varray ( TOOL_SELECT ) ) ;
2017-10-22 03:42:23 +02:00
2018-11-24 05:38:26 +01:00
separator_bitmask = memnew ( VSeparator ) ;
toolbar - > add_child ( separator_bitmask ) ;
2017-10-22 03:42:23 +02:00
tools [ BITMASK_COPY ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ BITMASK_COPY ] - > set_tooltip ( TTR ( " Copy bitmask. " ) ) ;
tools [ BITMASK_COPY ] - > connect ( " pressed " , this , " _on_tool_clicked " , varray ( BITMASK_COPY ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ BITMASK_COPY ] ) ;
2017-10-22 03:42:23 +02:00
tools [ BITMASK_PASTE ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ BITMASK_PASTE ] - > set_tooltip ( TTR ( " Paste bitmask. " ) ) ;
tools [ BITMASK_PASTE ] - > connect ( " pressed " , this , " _on_tool_clicked " , varray ( BITMASK_PASTE ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ BITMASK_PASTE ] ) ;
2017-10-22 03:42:23 +02:00
tools [ BITMASK_CLEAR ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ BITMASK_CLEAR ] - > set_tooltip ( TTR ( " Erase bitmask. " ) ) ;
tools [ BITMASK_CLEAR ] - > connect ( " pressed " , this , " _on_tool_clicked " , varray ( BITMASK_CLEAR ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ BITMASK_CLEAR ] ) ;
2017-10-22 03:42:23 +02:00
tools [ SHAPE_NEW_POLYGON ] = memnew ( ToolButton ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ SHAPE_NEW_POLYGON ] ) ;
2017-10-22 03:42:23 +02:00
tools [ SHAPE_NEW_POLYGON ] - > set_toggle_mode ( true ) ;
tools [ SHAPE_NEW_POLYGON ] - > set_button_group ( tg ) ;
2018-11-24 05:38:26 +01:00
tools [ SHAPE_NEW_POLYGON ] - > set_tooltip ( TTR ( " Create a new polygon. " ) ) ;
2018-08-13 01:24:20 +02:00
separator_delete = memnew ( VSeparator ) ;
toolbar - > add_child ( separator_delete ) ;
2017-10-22 03:42:23 +02:00
tools [ SHAPE_DELETE ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ SHAPE_DELETE ] - > connect ( " pressed " , this , " _on_tool_clicked " , varray ( SHAPE_DELETE ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ SHAPE_DELETE ] ) ;
2018-08-13 01:24:20 +02:00
separator_grid = memnew ( VSeparator ) ;
toolbar - > add_child ( separator_grid ) ;
2017-10-22 03:42:23 +02:00
tools [ SHAPE_KEEP_INSIDE_TILE ] = memnew ( ToolButton ) ;
tools [ SHAPE_KEEP_INSIDE_TILE ] - > set_toggle_mode ( true ) ;
tools [ SHAPE_KEEP_INSIDE_TILE ] - > set_pressed ( true ) ;
2018-11-24 05:38:26 +01:00
tools [ SHAPE_KEEP_INSIDE_TILE ] - > set_tooltip ( TTR ( " Keep polygon inside region Rect. " ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ SHAPE_KEEP_INSIDE_TILE ] ) ;
tools [ TOOL_GRID_SNAP ] = memnew ( ToolButton ) ;
tools [ TOOL_GRID_SNAP ] - > set_toggle_mode ( true ) ;
2018-11-24 05:38:26 +01:00
tools [ TOOL_GRID_SNAP ] - > set_tooltip ( TTR ( " Enable snap and show grid (configurable via the Inspector). " ) ) ;
2018-07-29 23:54:12 +02:00
tools [ TOOL_GRID_SNAP ] - > connect ( " toggled " , this , " _on_grid_snap_toggled " ) ;
toolbar - > add_child ( tools [ TOOL_GRID_SNAP ] ) ;
2017-10-22 03:42:23 +02:00
spin_priority = memnew ( SpinBox ) ;
spin_priority - > set_min ( 1 ) ;
spin_priority - > set_max ( 255 ) ;
spin_priority - > set_step ( 1 ) ;
spin_priority - > set_custom_minimum_size ( Size2 ( 100 , 0 ) ) ;
spin_priority - > connect ( " value_changed " , this , " _on_priority_changed " ) ;
spin_priority - > hide ( ) ;
toolbar - > add_child ( spin_priority ) ;
2018-07-02 15:39:39 +02:00
spin_z_index = memnew ( SpinBox ) ;
spin_z_index - > set_min ( VS : : CANVAS_ITEM_Z_MIN ) ;
spin_z_index - > set_max ( VS : : CANVAS_ITEM_Z_MAX ) ;
spin_z_index - > set_step ( 1 ) ;
spin_z_index - > set_custom_minimum_size ( Size2 ( 100 , 0 ) ) ;
spin_z_index - > connect ( " value_changed " , this , " _on_z_index_changed " ) ;
spin_z_index - > hide ( ) ;
toolbar - > add_child ( spin_z_index ) ;
2017-10-22 03:42:23 +02:00
Control * separator = memnew ( Control ) ;
separator - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
toolbar - > add_child ( separator ) ;
tools [ ZOOM_OUT ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ ZOOM_OUT ] - > connect ( " pressed " , this , " _zoom_out " ) ;
2017-10-22 03:42:23 +02:00
toolbar - > add_child ( tools [ ZOOM_OUT ] ) ;
2018-07-29 23:54:12 +02:00
tools [ ZOOM_OUT ] - > set_tooltip ( TTR ( " Zoom Out " ) ) ;
2017-10-22 03:42:23 +02:00
tools [ ZOOM_1 ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ ZOOM_1 ] - > connect ( " pressed " , this , " _zoom_reset " ) ;
2017-10-22 03:42:23 +02:00
toolbar - > add_child ( tools [ ZOOM_1 ] ) ;
2018-11-24 05:38:26 +01:00
tools [ ZOOM_1 ] - > set_tooltip ( TTR ( " Zoom Reset " ) ) ;
2017-10-22 03:42:23 +02:00
tools [ ZOOM_IN ] = memnew ( ToolButton ) ;
2018-11-24 05:38:26 +01:00
tools [ ZOOM_IN ] - > connect ( " pressed " , this , " _zoom_in " ) ;
2017-10-22 03:42:23 +02:00
toolbar - > add_child ( tools [ ZOOM_IN ] ) ;
2018-07-29 23:54:12 +02:00
tools [ ZOOM_IN ] - > set_tooltip ( TTR ( " Zoom In " ) ) ;
tools [ VISIBLE_INFO ] = memnew ( ToolButton ) ;
tools [ VISIBLE_INFO ] - > set_toggle_mode ( true ) ;
2018-11-24 05:38:26 +01:00
tools [ VISIBLE_INFO ] - > set_tooltip ( TTR ( " Display Tile Names (Hold Alt Key) " ) ) ;
2018-07-29 23:54:12 +02:00
toolbar - > add_child ( tools [ VISIBLE_INFO ] ) ;
2017-10-22 03:42:23 +02:00
main_vb - > add_child ( toolbar ) ;
2017-12-30 06:34:33 +01:00
scroll = memnew ( ScrollContainer ) ;
2017-10-22 03:42:23 +02:00
main_vb - > add_child ( scroll ) ;
scroll - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2018-07-29 23:54:12 +02:00
scroll - > set_clip_contents ( true ) ;
2017-10-22 03:42:23 +02:00
workspace_container = memnew ( Control ) ;
scroll - > add_child ( workspace_container ) ;
2018-03-02 12:36:18 +01:00
workspace_overlay = memnew ( Control ) ;
workspace_overlay - > connect ( " draw " , this , " _on_workspace_overlay_draw " ) ;
workspace_container - > add_child ( workspace_overlay ) ;
2017-10-22 03:42:23 +02:00
workspace = memnew ( Control ) ;
2018-07-29 23:54:12 +02:00
workspace - > set_focus_mode ( FOCUS_ALL ) ;
2017-10-22 03:42:23 +02:00
workspace - > connect ( " draw " , this , " _on_workspace_draw " ) ;
workspace - > connect ( " gui_input " , this , " _on_workspace_input " ) ;
2018-03-02 12:36:18 +01:00
workspace - > set_draw_behind_parent ( true ) ;
workspace_overlay - > add_child ( workspace ) ;
2017-10-22 03:42:23 +02:00
preview = memnew ( Sprite ) ;
workspace - > add_child ( preview ) ;
preview - > set_centered ( false ) ;
preview - > set_draw_behind_parent ( true ) ;
2018-07-29 23:54:12 +02:00
preview - > set_position ( WORKSPACE_MARGIN ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
//---------------
2018-02-17 12:08:44 +01:00
cd = memnew ( ConfirmationDialog ) ;
add_child ( cd ) ;
2018-07-29 23:54:12 +02:00
cd - > connect ( " confirmed " , this , " _on_tileset_toolbar_confirm " ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
//---------------
2018-02-17 12:08:44 +01:00
err_dialog = memnew ( AcceptDialog ) ;
add_child ( err_dialog ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
//---------------
texture_dialog = memnew ( EditorFileDialog ) ;
texture_dialog - > set_access ( EditorFileDialog : : ACCESS_RESOURCES ) ;
texture_dialog - > set_mode ( EditorFileDialog : : MODE_OPEN_FILES ) ;
texture_dialog - > clear_filters ( ) ;
List < String > extensions ;
ResourceLoader : : get_recognized_extensions_for_type ( " Texture " , & extensions ) ;
for ( List < String > : : Element * E = extensions . front ( ) ; E ; E = E - > next ( ) ) {
2018-03-02 12:36:18 +01:00
2018-07-29 23:54:12 +02:00
texture_dialog - > add_filter ( " *. " + E - > get ( ) + " ; " + E - > get ( ) . to_upper ( ) ) ;
}
add_child ( texture_dialog ) ;
texture_dialog - > connect ( " files_selected " , this , " _on_textures_added " ) ;
//---------------
helper = memnew ( TilesetEditorContext ( this ) ) ;
tile_names_opacity = 0 ;
2018-10-21 15:56:05 +02:00
// config scale
max_scale = 10.0f ;
min_scale = 0.1f ;
scale_ratio = 1.2f ;
2018-01-10 23:45:14 +01:00
}
2018-02-27 03:54:09 +01:00
TileSetEditor : : ~ TileSetEditor ( ) {
if ( helper )
memdelete ( helper ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _on_tileset_toolbar_button_pressed ( int p_index ) {
option = p_index ;
switch ( option ) {
case TOOL_TILESET_ADD_TEXTURE : {
texture_dialog - > popup_centered_ratio ( ) ;
} break ;
case TOOL_TILESET_REMOVE_TEXTURE : {
if ( get_current_texture ( ) . is_valid ( ) ) {
2018-08-27 16:12:48 +02:00
cd - > set_text ( TTR ( " Remove selected texture and ALL TILES which use it? " ) ) ;
2018-07-29 23:54:12 +02:00
cd - > popup_centered ( Size2 ( 300 , 60 ) ) ;
} else {
err_dialog - > set_text ( TTR ( " You haven't selected a texture to remove. " ) ) ;
err_dialog - > popup_centered ( Size2 ( 300 , 60 ) ) ;
}
} break ;
case TOOL_TILESET_CREATE_SCENE : {
cd - > set_text ( TTR ( " Create from scene? " ) ) ;
cd - > popup_centered ( Size2 ( 300 , 60 ) ) ;
} break ;
case TOOL_TILESET_MERGE_SCENE : {
cd - > set_text ( TTR ( " Merge from scene? " ) ) ;
cd - > popup_centered ( Size2 ( 300 , 60 ) ) ;
} break ;
}
}
void TileSetEditor : : _on_tileset_toolbar_confirm ( ) {
switch ( option ) {
case TOOL_TILESET_REMOVE_TEXTURE : {
RID current_rid = get_current_texture ( ) - > get_rid ( ) ;
List < int > ids ;
tileset - > get_tile_list ( & ids ) ;
for ( List < int > : : Element * E = ids . front ( ) ; E ; E = E - > next ( ) ) {
if ( tileset - > tile_get_texture ( E - > get ( ) ) - > get_rid ( ) = = current_rid ) {
tileset - > remove_tile ( E - > get ( ) ) ;
}
}
texture_list - > remove_item ( texture_list - > find_metadata ( current_rid ) ) ;
texture_map . erase ( current_rid ) ;
_on_texture_list_selected ( - 1 ) ;
} break ;
case TOOL_TILESET_MERGE_SCENE :
case TOOL_TILESET_CREATE_SCENE : {
EditorNode * en = editor ;
Node * scene = en - > get_edited_scene ( ) ;
if ( ! scene )
break ;
_import_scene ( scene , tileset , option = = TOOL_TILESET_MERGE_SCENE ) ;
edit ( tileset ) ;
} break ;
}
}
void TileSetEditor : : _on_texture_list_selected ( int p_index ) {
if ( get_current_texture ( ) . is_valid ( ) ) {
2017-10-22 03:42:23 +02:00
current_item_index = p_index ;
2018-07-29 23:54:12 +02:00
preview - > set_texture ( get_current_texture ( ) ) ;
workspace - > set_custom_minimum_size ( get_current_texture ( ) - > get_size ( ) + WORKSPACE_MARGIN * 2 ) ;
workspace_container - > set_custom_minimum_size ( get_current_texture ( ) - > get_size ( ) + WORKSPACE_MARGIN * 2 ) ;
workspace_overlay - > set_custom_minimum_size ( get_current_texture ( ) - > get_size ( ) + WORKSPACE_MARGIN * 2 ) ;
2018-02-17 12:08:44 +01:00
update_workspace_tile_mode ( ) ;
2017-10-22 03:42:23 +02:00
} else {
current_item_index = - 1 ;
preview - > set_texture ( NULL ) ;
workspace - > set_custom_minimum_size ( Size2i ( ) ) ;
2018-07-29 23:54:12 +02:00
update_workspace_tile_mode ( ) ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
set_current_tile ( - 1 ) ;
2017-10-22 03:42:23 +02:00
workspace - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _on_textures_added ( const PoolStringArray & p_paths ) {
int invalid_count = 0 ;
for ( int i = 0 ; i < p_paths . size ( ) ; i + + ) {
Ref < Texture > t = Ref < Texture > ( ResourceLoader : : load ( p_paths [ i ] ) ) ;
2018-10-11 17:13:44 +02:00
ERR_EXPLAIN ( " ' " + p_paths [ i ] + " ' is not a valid texture. " ) ;
ERR_CONTINUE ( ! t . is_valid ( ) ) ;
2018-07-29 23:54:12 +02:00
if ( texture_map . has ( t - > get_rid ( ) ) ) {
invalid_count + + ;
} else {
texture_list - > add_item ( t - > get_path ( ) . get_file ( ) ) ;
texture_map . insert ( t - > get_rid ( ) , t ) ;
texture_list - > set_item_metadata ( texture_list - > get_item_count ( ) - 1 , t - > get_rid ( ) ) ;
}
}
2018-10-11 17:13:44 +02:00
if ( texture_list - > get_item_count ( ) > 0 ) {
update_texture_list_icon ( ) ;
texture_list - > select ( texture_list - > get_item_count ( ) - 1 ) ;
_on_texture_list_selected ( texture_list - > get_item_count ( ) - 1 ) ;
}
2018-07-29 23:54:12 +02:00
if ( invalid_count > 0 ) {
2018-08-28 20:15:04 +02:00
err_dialog - > set_text ( vformat ( TTR ( " %s file(s) were not added because was already on the list. " ) , String : : num ( invalid_count , 0 ) ) ) ;
2018-07-29 23:54:12 +02:00
err_dialog - > popup_centered ( Size2 ( 300 , 60 ) ) ;
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_edit_mode_changed ( int p_edit_mode ) {
2018-12-06 10:35:38 +01:00
draw_handles = false ;
creating_shape = false ;
2017-10-22 03:42:23 +02:00
edit_mode = ( EditMode ) p_edit_mode ;
switch ( edit_mode ) {
2018-07-29 23:54:12 +02:00
case EDITMODE_REGION : {
tools [ TOOL_SELECT ] - > show ( ) ;
2018-11-24 05:38:26 +01:00
separator_bitmask - > hide ( ) ;
2018-07-29 23:54:12 +02:00
tools [ BITMASK_COPY ] - > hide ( ) ;
tools [ BITMASK_PASTE ] - > hide ( ) ;
tools [ BITMASK_CLEAR ] - > hide ( ) ;
tools [ SHAPE_NEW_POLYGON ] - > hide ( ) ;
2018-08-13 01:24:20 +02:00
if ( workspace_mode = = WORKSPACE_EDIT ) {
separator_delete - > show ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_DELETE ] - > show ( ) ;
2018-08-13 01:24:20 +02:00
} else {
separator_delete - > hide ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_DELETE ] - > hide ( ) ;
2018-08-13 01:24:20 +02:00
}
separator_grid - > show ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_KEEP_INSIDE_TILE ] - > hide ( ) ;
tools [ TOOL_GRID_SNAP ] - > show ( ) ;
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " Drag handles to edit Rect. \n Click on another Tile to edit it. " ) ) ;
2018-11-24 05:38:26 +01:00
tools [ SHAPE_DELETE ] - > set_tooltip ( TTR ( " Delete selected Rect. " ) ) ;
2017-10-22 03:42:23 +02:00
spin_priority - > hide ( ) ;
2018-07-02 15:39:39 +02:00
spin_z_index - > hide ( ) ;
2017-10-22 03:42:23 +02:00
} break ;
case EDITMODE_COLLISION :
case EDITMODE_NAVIGATION :
case EDITMODE_OCCLUSION : {
2018-07-29 23:54:12 +02:00
tools [ TOOL_SELECT ] - > show ( ) ;
2018-11-24 05:38:26 +01:00
separator_bitmask - > hide ( ) ;
2018-07-29 23:54:12 +02:00
tools [ BITMASK_COPY ] - > hide ( ) ;
tools [ BITMASK_PASTE ] - > hide ( ) ;
tools [ BITMASK_CLEAR ] - > hide ( ) ;
tools [ SHAPE_NEW_POLYGON ] - > show ( ) ;
2018-08-13 01:24:20 +02:00
separator_delete - > show ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_DELETE ] - > show ( ) ;
2018-08-13 01:24:20 +02:00
separator_grid - > show ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_KEEP_INSIDE_TILE ] - > show ( ) ;
tools [ TOOL_GRID_SNAP ] - > show ( ) ;
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " Select current edited sub-tile. \n Click on another Tile to edit it. " ) ) ;
2018-11-24 05:38:26 +01:00
tools [ SHAPE_DELETE ] - > set_tooltip ( TTR ( " Delete polygon. " ) ) ;
2017-10-22 03:42:23 +02:00
spin_priority - > hide ( ) ;
2018-07-02 15:39:39 +02:00
spin_z_index - > hide ( ) ;
2018-01-05 11:53:30 +01:00
select_coord ( edited_shape_coord ) ;
2017-10-22 03:42:23 +02:00
} break ;
2018-11-24 05:38:26 +01:00
case EDITMODE_BITMASK : {
tools [ TOOL_SELECT ] - > show ( ) ;
separator_bitmask - > show ( ) ;
tools [ BITMASK_COPY ] - > show ( ) ;
tools [ BITMASK_PASTE ] - > show ( ) ;
tools [ BITMASK_CLEAR ] - > show ( ) ;
tools [ SHAPE_NEW_POLYGON ] - > hide ( ) ;
separator_delete - > hide ( ) ;
tools [ SHAPE_DELETE ] - > hide ( ) ;
separator_grid - > hide ( ) ;
tools [ SHAPE_KEEP_INSIDE_TILE ] - > hide ( ) ;
tools [ TOOL_GRID_SNAP ] - > hide ( ) ;
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " LMB: Set bit on. \n RMB: Set bit off. \n Click on another Tile to edit it. " ) ) ;
spin_priority - > hide ( ) ;
} break ;
2018-07-02 15:39:39 +02:00
case EDITMODE_Z_INDEX :
2018-11-24 05:38:26 +01:00
case EDITMODE_PRIORITY :
case EDITMODE_ICON : {
2018-07-29 23:54:12 +02:00
tools [ TOOL_SELECT ] - > show ( ) ;
2018-11-24 05:38:26 +01:00
separator_bitmask - > hide ( ) ;
2018-07-29 23:54:12 +02:00
tools [ BITMASK_COPY ] - > hide ( ) ;
tools [ BITMASK_PASTE ] - > hide ( ) ;
tools [ BITMASK_CLEAR ] - > hide ( ) ;
tools [ SHAPE_NEW_POLYGON ] - > hide ( ) ;
2018-08-13 01:24:20 +02:00
separator_delete - > hide ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_DELETE ] - > hide ( ) ;
2018-08-13 01:24:20 +02:00
separator_grid - > show ( ) ;
2018-07-29 23:54:12 +02:00
tools [ SHAPE_KEEP_INSIDE_TILE ] - > hide ( ) ;
tools [ TOOL_GRID_SNAP ] - > show ( ) ;
2018-08-13 01:24:20 +02:00
2017-10-22 03:42:23 +02:00
if ( edit_mode = = EDITMODE_ICON ) {
2018-07-29 23:54:12 +02:00
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " Select sub-tile to use as icon, this will be also used on invalid autotile bindings. \n Click on another Tile to edit it. " ) ) ;
2017-10-22 03:42:23 +02:00
spin_priority - > hide ( ) ;
2018-07-02 15:39:39 +02:00
spin_z_index - > hide ( ) ;
} else if ( edit_mode = = EDITMODE_PRIORITY ) {
2018-07-29 23:54:12 +02:00
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " Select sub-tile to change its priority. \n Click on another Tile to edit it. " ) ) ;
2017-10-22 03:42:23 +02:00
spin_priority - > show ( ) ;
2018-07-02 15:39:39 +02:00
spin_z_index - > hide ( ) ;
} else {
tools [ TOOL_SELECT ] - > set_tooltip ( TTR ( " Select sub-tile to change its z index. \n Click on another Tile to edit it. " ) ) ;
spin_priority - > hide ( ) ;
spin_z_index - > show ( ) ;
2017-10-22 03:42:23 +02:00
}
} break ;
2018-11-24 05:38:26 +01:00
default : { }
2017-10-22 03:42:23 +02:00
}
workspace - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _on_workspace_mode_changed ( int p_workspace_mode ) {
workspace_mode = ( WorkspaceMode ) p_workspace_mode ;
if ( p_workspace_mode = = WORKSPACE_EDIT ) {
update_workspace_tile_mode ( ) ;
} else {
for ( int i = 0 ; i < EDITMODE_MAX ; i + + ) {
tool_editmode [ i ] - > hide ( ) ;
}
tool_editmode [ EDITMODE_REGION ] - > show ( ) ;
tool_editmode [ EDITMODE_REGION ] - > set_pressed ( true ) ;
_on_edit_mode_changed ( EDITMODE_REGION ) ;
2018-08-13 01:24:20 +02:00
separator_editmode - > show ( ) ;
2018-07-29 23:54:12 +02:00
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_workspace_draw ( ) {
2017-10-22 03:42:23 +02:00
2018-11-24 05:38:26 +01:00
if ( tileset . is_null ( ) | | ! get_current_texture ( ) . is_valid ( ) )
2018-07-29 23:54:12 +02:00
return ;
2018-11-24 05:38:26 +01:00
const Color COLOR_AUTOTILE = Color ( 0.3 , 0.6 , 1 ) ;
const Color COLOR_SINGLE = Color ( 1 , 1 , 0.3 ) ;
const Color COLOR_ATLAS = Color ( 0.8 , 0.8 , 0.8 ) ;
const Color COLOR_SUBDIVISION = Color ( 0.3 , 0.7 , 0.6 ) ;
draw_handles = false ;
2018-07-29 23:54:12 +02:00
draw_highlight_current_tile ( ) ;
draw_grid_snap ( ) ;
if ( get_current_tile ( ) > = 0 ) {
2018-02-17 12:08:44 +01:00
int spacing = tileset - > autotile_get_spacing ( get_current_tile ( ) ) ;
Vector2 size = tileset - > autotile_get_size ( get_current_tile ( ) ) ;
Rect2i region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
switch ( edit_mode ) {
case EDITMODE_ICON : {
2018-02-17 12:08:44 +01:00
Vector2 coord = tileset - > autotile_get_icon_coordinate ( get_current_tile ( ) ) ;
2018-07-29 23:54:12 +02:00
draw_highlight_subtile ( coord ) ;
2017-10-22 03:42:23 +02:00
} break ;
case EDITMODE_BITMASK : {
2018-07-29 23:54:12 +02:00
Color c ( 1 , 0 , 0 , 0.5 ) ;
2017-10-22 03:42:23 +02:00
for ( float x = 0 ; x < region . size . x / ( spacing + size . x ) ; x + + ) {
for ( float y = 0 ; y < region . size . y / ( spacing + size . y ) ; y + + ) {
Vector2 coord ( x , y ) ;
Point2 anchor ( coord . x * ( spacing + size . x ) , coord . y * ( spacing + size . y ) ) ;
2018-07-29 23:54:12 +02:00
anchor + = WORKSPACE_MARGIN ;
anchor + = region . position ;
2018-02-17 12:08:44 +01:00
uint16_t mask = tileset - > autotile_get_bitmask ( get_current_tile ( ) , coord ) ;
if ( tileset - > autotile_get_bitmask_mode ( get_current_tile ( ) ) = = TileSet : : BITMASK_2X2 ) {
2017-10-22 03:42:23 +02:00
if ( mask & TileSet : : BIND_TOPLEFT ) {
workspace - > draw_rect ( Rect2 ( anchor , size / 2 ) , c ) ;
}
if ( mask & TileSet : : BIND_TOPRIGHT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( size . x / 2 , 0 ) , size / 2 ) , c ) ;
}
if ( mask & TileSet : : BIND_BOTTOMLEFT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( 0 , size . y / 2 ) , size / 2 ) , c ) ;
}
if ( mask & TileSet : : BIND_BOTTOMRIGHT ) {
workspace - > draw_rect ( Rect2 ( anchor + size / 2 , size / 2 ) , c ) ;
}
2018-05-17 05:39:43 +02:00
} else {
2017-10-22 03:42:23 +02:00
if ( mask & TileSet : : BIND_TOPLEFT ) {
workspace - > draw_rect ( Rect2 ( anchor , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_TOP ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( size . x / 3 , 0 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_TOPRIGHT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( ( size . x / 3 ) * 2 , 0 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_LEFT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( 0 , size . y / 3 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_CENTER ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( size . x / 3 , size . y / 3 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_RIGHT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( ( size . x / 3 ) * 2 , size . y / 3 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_BOTTOMLEFT ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( 0 , ( size . y / 3 ) * 2 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_BOTTOM ) {
workspace - > draw_rect ( Rect2 ( anchor + Vector2 ( size . x / 3 , ( size . y / 3 ) * 2 ) , size / 3 ) , c ) ;
}
if ( mask & TileSet : : BIND_BOTTOMRIGHT ) {
workspace - > draw_rect ( Rect2 ( anchor + ( size / 3 ) * 2 , size / 3 ) , c ) ;
}
}
}
}
} break ;
case EDITMODE_COLLISION :
case EDITMODE_OCCLUSION :
case EDITMODE_NAVIGATION : {
2018-07-29 23:54:12 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
2018-02-17 12:08:44 +01:00
Vector2 coord = edited_shape_coord ;
2018-07-29 23:54:12 +02:00
draw_highlight_subtile ( coord ) ;
2018-02-17 12:08:44 +01:00
}
2017-10-22 03:42:23 +02:00
draw_polygon_shapes ( ) ;
2017-12-28 06:57:37 +01:00
draw_grid_snap ( ) ;
2017-10-22 03:42:23 +02:00
} break ;
case EDITMODE_PRIORITY : {
2018-02-17 12:08:44 +01:00
spin_priority - > set_value ( tileset - > autotile_get_subtile_priority ( get_current_tile ( ) , edited_shape_coord ) ) ;
uint16_t mask = tileset - > autotile_get_bitmask ( get_current_tile ( ) , edited_shape_coord ) ;
2017-10-22 03:42:23 +02:00
Vector < Vector2 > queue_others ;
int total = 0 ;
2018-02-17 12:08:44 +01:00
for ( Map < Vector2 , uint16_t > : : Element * E = tileset - > autotile_get_bitmask_map ( get_current_tile ( ) ) . front ( ) ; E ; E = E - > next ( ) ) {
2017-10-22 03:42:23 +02:00
if ( E - > value ( ) = = mask ) {
2018-02-17 12:08:44 +01:00
total + = tileset - > autotile_get_subtile_priority ( get_current_tile ( ) , E - > key ( ) ) ;
2017-10-22 03:42:23 +02:00
if ( E - > key ( ) ! = edited_shape_coord ) {
queue_others . push_back ( E - > key ( ) ) ;
}
}
}
spin_priority - > set_suffix ( " / " + String : : num ( total , 0 ) ) ;
2018-07-29 23:54:12 +02:00
draw_highlight_subtile ( edited_shape_coord , queue_others ) ;
2017-10-22 03:42:23 +02:00
} break ;
2018-07-02 15:39:39 +02:00
case EDITMODE_Z_INDEX : {
spin_z_index - > set_value ( tileset - > autotile_get_z_index ( get_current_tile ( ) , edited_shape_coord ) ) ;
draw_highlight_subtile ( edited_shape_coord ) ;
} break ;
2018-09-26 13:13:56 +02:00
default : { }
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
}
RID current_texture_rid = get_current_texture ( ) - > get_rid ( ) ;
List < int > * tiles = new List < int > ( ) ;
tileset - > get_tile_list ( tiles ) ;
for ( List < int > : : Element * E = tiles - > front ( ) ; E ; E = E - > next ( ) ) {
int t_id = E - > get ( ) ;
2018-11-24 05:38:26 +01:00
if ( tileset - > tile_get_texture ( t_id ) - > get_rid ( ) = = current_texture_rid & & ( t_id ! = get_current_tile ( ) | | edit_mode ! = EDITMODE_REGION | | workspace_mode ! = WORKSPACE_EDIT ) ) {
2018-07-29 23:54:12 +02:00
Rect2i region = tileset - > tile_get_region ( t_id ) ;
region . position + = WORKSPACE_MARGIN ;
Color c ;
if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : SINGLE_TILE )
c = COLOR_SINGLE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : AUTO_TILE )
c = COLOR_AUTOTILE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : ATLAS_TILE )
c = COLOR_ATLAS ;
2018-11-24 05:38:26 +01:00
draw_tile_subdivision ( t_id , COLOR_SUBDIVISION ) ;
2018-07-29 23:54:12 +02:00
workspace - > draw_rect ( region , c , false ) ;
}
}
2018-11-24 05:38:26 +01:00
2018-07-29 23:54:12 +02:00
if ( edit_mode = = EDITMODE_REGION ) {
if ( workspace_mode ! = WORKSPACE_EDIT ) {
Rect2i region = edited_region ;
Color c ;
if ( workspace_mode = = WORKSPACE_CREATE_SINGLE )
c = COLOR_SINGLE ;
else if ( workspace_mode = = WORKSPACE_CREATE_AUTOTILE )
c = COLOR_AUTOTILE ;
else if ( workspace_mode = = WORKSPACE_CREATE_ATLAS )
c = COLOR_ATLAS ;
workspace - > draw_rect ( region , c , false ) ;
draw_edited_region_subdivision ( ) ;
} else {
int t_id = get_current_tile ( ) ;
Rect2i region ;
if ( draw_edited_region )
region = edited_region ;
else {
region = tileset - > tile_get_region ( t_id ) ;
region . position + = WORKSPACE_MARGIN ;
2017-10-22 03:42:23 +02:00
}
2018-11-24 05:38:26 +01:00
if ( draw_edited_region )
draw_edited_region_subdivision ( ) ;
else
draw_tile_subdivision ( t_id , COLOR_SUBDIVISION ) ;
2018-07-29 23:54:12 +02:00
Color c ;
if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : SINGLE_TILE )
c = COLOR_SINGLE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : AUTO_TILE )
c = COLOR_AUTOTILE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : ATLAS_TILE )
c = COLOR_ATLAS ;
workspace - > draw_rect ( region , c , false ) ;
2017-10-22 03:42:23 +02:00
}
}
2018-11-24 05:38:26 +01:00
2018-03-02 12:36:18 +01:00
workspace_overlay - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _on_workspace_process ( ) {
float a = tile_names_opacity ;
if ( Input : : get_singleton ( ) - > is_key_pressed ( KEY_ALT ) | | tools [ VISIBLE_INFO ] - > is_pressed ( ) ) {
a + = get_tree ( ) - > get_idle_process_time ( ) * 2 ;
} else {
a - = get_tree ( ) - > get_idle_process_time ( ) * 2 ;
}
a = CLAMP ( a , 0 , 1 ) ;
if ( a ! = tile_names_opacity )
workspace_overlay - > update ( ) ;
tile_names_opacity = a ;
}
2018-03-02 12:36:18 +01:00
void TileSetEditor : : _on_workspace_overlay_draw ( ) {
2018-11-24 05:38:26 +01:00
if ( ! tileset . is_valid ( ) | | ! get_current_texture ( ) . is_valid ( ) )
2018-07-29 23:54:12 +02:00
return ;
const Color COLOR_AUTOTILE = Color ( 0.266373 , 0.565288 , 0.988281 ) ;
const Color COLOR_SINGLE = Color ( 0.988281 , 0.909323 , 0.266373 ) ;
const Color COLOR_ATLAS = Color ( 0.78653 , 0.812835 , 0.832031 ) ;
if ( tile_names_opacity > 0 ) {
RID current_texture_rid = get_current_texture ( ) - > get_rid ( ) ;
List < int > * tiles = new List < int > ( ) ;
tileset - > get_tile_list ( tiles ) ;
for ( List < int > : : Element * E = tiles - > front ( ) ; E ; E = E - > next ( ) ) {
int t_id = E - > get ( ) ;
if ( tileset - > tile_get_texture ( t_id ) - > get_rid ( ) = = current_texture_rid ) {
Rect2i region = tileset - > tile_get_region ( t_id ) ;
region . position + = WORKSPACE_MARGIN ;
region . position * = workspace - > get_scale ( ) . x ;
Color c ;
if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : SINGLE_TILE )
c = COLOR_SINGLE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : AUTO_TILE )
c = COLOR_AUTOTILE ;
else if ( tileset - > tile_get_tile_mode ( t_id ) = = TileSet : : ATLAS_TILE )
c = COLOR_ATLAS ;
c . a = tile_names_opacity ;
2018-08-18 15:39:50 +02:00
String tile_id_name = String : : num ( t_id , 0 ) + " : " + tileset - > tile_get_name ( t_id ) ;
2018-07-29 23:54:12 +02:00
Ref < Font > font = get_font ( " font " , " Label " ) ;
2018-08-18 15:39:50 +02:00
region . set_size ( font - > get_string_size ( tile_id_name ) ) ;
2018-07-29 23:54:12 +02:00
workspace_overlay - > draw_rect ( region , c ) ;
region . position . y + = region . size . y - 2 ;
c = Color ( 0.1 , 0.1 , 0.1 , tile_names_opacity ) ;
2018-08-18 15:39:50 +02:00
workspace_overlay - > draw_string ( font , region . position , tile_id_name , c ) ;
2018-07-29 23:54:12 +02:00
}
}
}
2018-03-02 12:36:18 +01:00
int t_id = get_current_tile ( ) ;
2018-07-29 23:54:12 +02:00
if ( t_id < 0 )
2018-03-02 12:36:18 +01:00
return ;
Ref < Texture > handle = get_icon ( " EditorHandle " , " EditorIcons " ) ;
2018-07-29 23:54:12 +02:00
if ( draw_handles ) {
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
workspace_overlay - > draw_texture ( handle , current_shape [ i ] * workspace - > get_scale ( ) . x - handle - > get_size ( ) * 0.5 ) ;
}
2018-03-02 12:36:18 +01:00
}
2017-10-22 03:42:23 +02:00
}
2018-03-02 12:36:18 +01:00
# define MIN_DISTANCE_SQUARED 6
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_workspace_input ( const Ref < InputEvent > & p_ie ) {
2018-11-24 05:38:26 +01:00
if ( tileset . is_null ( ) | | ! get_current_texture ( ) . is_valid ( ) )
2018-07-29 23:54:12 +02:00
return ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
static bool dragging ;
static bool erasing ;
draw_edited_region = false ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
Rect2 current_tile_region = Rect2 ( ) ;
if ( get_current_tile ( ) > = 0 ) {
current_tile_region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
}
current_tile_region . position + = WORKSPACE_MARGIN ;
Ref < InputEventMouseButton > mb = p_ie ;
Ref < InputEventMouseMotion > mm = p_ie ;
if ( mb . is_valid ( ) ) {
2018-11-07 19:10:13 +01:00
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT & & ! creating_shape ) {
2018-07-29 23:54:12 +02:00
if ( ! current_tile_region . has_point ( mb - > get_position ( ) ) ) {
List < int > * tiles = new List < int > ( ) ;
tileset - > get_tile_list ( tiles ) ;
for ( List < int > : : Element * E = tiles - > front ( ) ; E ; E = E - > next ( ) ) {
int t_id = E - > get ( ) ;
if ( get_current_texture ( ) - > get_rid ( ) = = tileset - > tile_get_texture ( t_id ) - > get_rid ( ) ) {
Rect2 r = tileset - > tile_get_region ( t_id ) ;
r . position + = WORKSPACE_MARGIN ;
if ( r . has_point ( mb - > get_position ( ) ) ) {
set_current_tile ( t_id ) ;
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
return ;
}
}
}
}
}
2018-10-21 15:56:05 +02:00
// Mouse Wheel Event
2018-11-24 05:38:26 +01:00
if ( mb - > get_button_index ( ) = = BUTTON_WHEEL_UP & & mb - > is_pressed ( ) & & mb - > get_control ( ) ) {
2018-10-21 15:56:05 +02:00
_zoom_in ( ) ;
2018-11-24 05:38:26 +01:00
} else if ( mb - > get_button_index ( ) = = BUTTON_WHEEL_DOWN & & mb - > is_pressed ( ) & & mb - > get_control ( ) ) {
2018-10-21 15:56:05 +02:00
_zoom_out ( ) ;
}
2018-07-29 23:54:12 +02:00
}
// Drag Middle Mouse
if ( mm . is_valid ( ) ) {
if ( mm - > get_button_mask ( ) & BUTTON_MASK_MIDDLE ) {
Vector2 dragged ( mm - > get_relative ( ) . x , mm - > get_relative ( ) . y ) ;
scroll - > set_h_scroll ( scroll - > get_h_scroll ( ) - dragged . x * workspace - > get_scale ( ) . x ) ;
scroll - > set_v_scroll ( scroll - > get_v_scroll ( ) - dragged . y * workspace - > get_scale ( ) . x ) ;
}
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
if ( edit_mode = = EDITMODE_REGION ) {
if ( mb . is_valid ( ) ) {
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( get_current_tile ( ) > = 0 | | workspace_mode ! = WORKSPACE_EDIT ) {
dragging = true ;
region_from = mb - > get_position ( ) ;
edited_region = Rect2 ( region_from , Size2 ( ) ) ;
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
return ;
}
} else if ( dragging & & mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_RIGHT ) {
dragging = false ;
edited_region = Rect2 ( ) ;
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
return ;
} else if ( dragging & & ! mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
dragging = false ;
update_edited_region ( mb - > get_position ( ) ) ;
edited_region . position - = WORKSPACE_MARGIN ;
if ( ! edited_region . has_no_area ( ) ) {
if ( get_current_tile ( ) > = 0 & & workspace_mode = = WORKSPACE_EDIT ) {
tileset - > tile_set_region ( get_current_tile ( ) , edited_region ) ;
} else {
int t_id = tileset - > get_last_unused_tile_id ( ) ;
tileset - > create_tile ( t_id ) ;
tileset - > tile_set_texture ( t_id , get_current_texture ( ) ) ;
tileset - > tile_set_region ( t_id , edited_region ) ;
tileset - > tile_set_name ( t_id , get_current_texture ( ) - > get_path ( ) . get_file ( ) + " " + String : : num ( t_id , 0 ) ) ;
if ( workspace_mode ! = WORKSPACE_CREATE_SINGLE ) {
tileset - > autotile_set_size ( t_id , snap_step ) ;
tileset - > autotile_set_spacing ( t_id , snap_separation . x ) ;
tileset - > tile_set_tile_mode ( t_id , workspace_mode = = WORKSPACE_CREATE_AUTOTILE ? TileSet : : AUTO_TILE : TileSet : : ATLAS_TILE ) ;
}
set_current_tile ( t_id ) ;
2018-11-24 05:38:26 +01:00
2018-07-29 23:54:12 +02:00
tool_workspacemode [ WORKSPACE_EDIT ] - > set_pressed ( true ) ;
2018-11-24 05:38:26 +01:00
tool_editmode [ EDITMODE_COLLISION ] - > set_pressed ( true ) ;
edit_mode = EDITMODE_COLLISION ;
2018-07-29 23:54:12 +02:00
_on_workspace_mode_changed ( WORKSPACE_EDIT ) ;
2017-10-22 03:42:23 +02:00
}
}
2018-11-24 05:38:26 +01:00
edited_region = Rect2 ( ) ;
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
return ;
}
} else if ( mm . is_valid ( ) ) {
if ( dragging ) {
update_edited_region ( mm - > get_position ( ) ) ;
draw_edited_region = true ;
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
return ;
}
}
}
if ( workspace_mode = = WORKSPACE_EDIT ) {
if ( get_current_tile ( ) > = 0 ) {
int spacing = tileset - > autotile_get_spacing ( get_current_tile ( ) ) ;
Vector2 size = tileset - > autotile_get_size ( get_current_tile ( ) ) ;
switch ( edit_mode ) {
case EDITMODE_ICON : {
if ( mb . is_valid ( ) ) {
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT & & current_tile_region . has_point ( mb - > get_position ( ) ) ) {
Vector2 coord ( ( int ) ( ( mb - > get_position ( ) . x - current_tile_region . position . x ) / ( spacing + size . x ) ) , ( int ) ( ( mb - > get_position ( ) . y - current_tile_region . position . y ) / ( spacing + size . y ) ) ) ;
tileset - > autotile_set_icon_coordinate ( get_current_tile ( ) , coord ) ;
Rect2 region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
region . size = size ;
coord . x * = ( spacing + size . x ) ;
coord . y * = ( spacing + size . y ) ;
region . position + = coord ;
workspace - > update ( ) ;
}
}
} break ;
case EDITMODE_BITMASK : {
if ( mb . is_valid ( ) ) {
if ( mb - > is_pressed ( ) ) {
if ( dragging ) {
return ;
}
if ( ( mb - > get_button_index ( ) = = BUTTON_RIGHT | | mb - > get_button_index ( ) = = BUTTON_LEFT ) & & current_tile_region . has_point ( mb - > get_position ( ) ) ) {
dragging = true ;
erasing = ( mb - > get_button_index ( ) = = BUTTON_RIGHT ) ;
Vector2 coord ( ( int ) ( ( mb - > get_position ( ) . x - current_tile_region . position . x ) / ( spacing + size . x ) ) , ( int ) ( ( mb - > get_position ( ) . y - current_tile_region . position . y ) / ( spacing + size . y ) ) ) ;
Vector2 pos ( coord . x * ( spacing + size . x ) , coord . y * ( spacing + size . y ) ) ;
pos = mb - > get_position ( ) - ( pos + current_tile_region . position ) ;
uint16_t bit = 0 ;
if ( tileset - > autotile_get_bitmask_mode ( get_current_tile ( ) ) = = TileSet : : BITMASK_2X2 ) {
if ( pos . x < size . x / 2 ) {
if ( pos . y < size . y / 2 ) {
bit = TileSet : : BIND_TOPLEFT ;
} else {
bit = TileSet : : BIND_BOTTOMLEFT ;
}
} else {
if ( pos . y < size . y / 2 ) {
bit = TileSet : : BIND_TOPRIGHT ;
} else {
bit = TileSet : : BIND_BOTTOMRIGHT ;
}
}
} else {
if ( pos . x < size . x / 3 ) {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOPLEFT ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOMLEFT ;
} else {
bit = TileSet : : BIND_LEFT ;
}
} else if ( pos . x > ( size . x / 3 ) * 2 ) {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOPRIGHT ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOMRIGHT ;
} else {
bit = TileSet : : BIND_RIGHT ;
}
} else {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOP ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOM ;
} else {
bit = TileSet : : BIND_CENTER ;
}
}
}
uint16_t mask = tileset - > autotile_get_bitmask ( get_current_tile ( ) , coord ) ;
if ( erasing ) {
mask & = ~ bit ;
} else {
mask | = bit ;
}
tileset - > autotile_set_bitmask ( get_current_tile ( ) , coord , mask ) ;
workspace - > update ( ) ;
}
} else {
if ( ( erasing & & mb - > get_button_index ( ) = = BUTTON_RIGHT ) | | ( ! erasing & & mb - > get_button_index ( ) = = BUTTON_LEFT ) ) {
dragging = false ;
erasing = false ;
}
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
}
if ( mm . is_valid ( ) ) {
if ( dragging & & current_tile_region . has_point ( mm - > get_position ( ) ) ) {
Vector2 coord ( ( int ) ( ( mm - > get_position ( ) . x - current_tile_region . position . x ) / ( spacing + size . x ) ) , ( int ) ( ( mm - > get_position ( ) . y - current_tile_region . position . y ) / ( spacing + size . y ) ) ) ;
2017-10-22 03:42:23 +02:00
Vector2 pos ( coord . x * ( spacing + size . x ) , coord . y * ( spacing + size . y ) ) ;
2018-07-29 23:54:12 +02:00
pos = mm - > get_position ( ) - ( pos + current_tile_region . position ) ;
2018-04-19 13:04:41 +02:00
uint16_t bit = 0 ;
2018-02-17 12:08:44 +01:00
if ( tileset - > autotile_get_bitmask_mode ( get_current_tile ( ) ) = = TileSet : : BITMASK_2X2 ) {
2017-10-22 03:42:23 +02:00
if ( pos . x < size . x / 2 ) {
if ( pos . y < size . y / 2 ) {
bit = TileSet : : BIND_TOPLEFT ;
} else {
bit = TileSet : : BIND_BOTTOMLEFT ;
}
} else {
if ( pos . y < size . y / 2 ) {
bit = TileSet : : BIND_TOPRIGHT ;
} else {
bit = TileSet : : BIND_BOTTOMRIGHT ;
}
}
2018-05-17 05:39:43 +02:00
} else {
2017-10-22 03:42:23 +02:00
if ( pos . x < size . x / 3 ) {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOPLEFT ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOMLEFT ;
} else {
bit = TileSet : : BIND_LEFT ;
}
} else if ( pos . x > ( size . x / 3 ) * 2 ) {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOPRIGHT ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOMRIGHT ;
} else {
bit = TileSet : : BIND_RIGHT ;
}
} else {
if ( pos . y < size . y / 3 ) {
bit = TileSet : : BIND_TOP ;
} else if ( pos . y > ( size . y / 3 ) * 2 ) {
bit = TileSet : : BIND_BOTTOM ;
} else {
bit = TileSet : : BIND_CENTER ;
}
}
}
2018-02-17 12:08:44 +01:00
uint16_t mask = tileset - > autotile_get_bitmask ( get_current_tile ( ) , coord ) ;
2017-10-22 03:42:23 +02:00
if ( erasing ) {
mask & = ~ bit ;
} else {
mask | = bit ;
}
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_bitmask ( get_current_tile ( ) , coord , mask ) ;
2017-10-22 03:42:23 +02:00
workspace - > update ( ) ;
}
}
2018-07-29 23:54:12 +02:00
} break ;
case EDITMODE_COLLISION :
case EDITMODE_OCCLUSION :
case EDITMODE_NAVIGATION :
2018-07-02 15:39:39 +02:00
case EDITMODE_PRIORITY :
case EDITMODE_Z_INDEX : {
2018-07-29 23:54:12 +02:00
Vector2 shape_anchor = Vector2 ( 0 , 0 ) ;
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
shape_anchor = edited_shape_coord ;
shape_anchor . x * = ( size . x + spacing ) ;
shape_anchor . y * = ( size . y + spacing ) ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
shape_anchor + = current_tile_region . position ;
if ( tools [ TOOL_SELECT ] - > is_pressed ( ) ) {
if ( mb . is_valid ( ) ) {
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( edit_mode ! = EDITMODE_PRIORITY & & current_shape . size ( ) > 0 ) {
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
if ( ( current_shape [ i ] - mb - > get_position ( ) ) . length_squared ( ) < = MIN_DISTANCE_SQUARED ) {
dragging_point = i ;
workspace - > update ( ) ;
return ;
}
2017-10-22 03:42:23 +02:00
}
}
2018-07-29 23:54:12 +02:00
if ( ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) & & current_tile_region . has_point ( mb - > get_position ( ) ) ) {
Vector2 coord ( ( int ) ( ( mb - > get_position ( ) . x - current_tile_region . position . x ) / ( spacing + size . x ) ) , ( int ) ( ( mb - > get_position ( ) . y - current_tile_region . position . y ) / ( spacing + size . y ) ) ) ;
if ( edited_shape_coord ! = coord ) {
edited_shape_coord = coord ;
edited_occlusion_shape = tileset - > autotile_get_light_occluder ( get_current_tile ( ) , edited_shape_coord ) ;
edited_navigation_shape = tileset - > autotile_get_navigation_polygon ( get_current_tile ( ) , edited_shape_coord ) ;
Vector < TileSet : : ShapeData > sd = tileset - > tile_get_shapes ( get_current_tile ( ) ) ;
bool found_collision_shape = false ;
for ( int i = 0 ; i < sd . size ( ) ; i + + ) {
if ( sd [ i ] . autotile_coord = = coord ) {
edited_collision_shape = sd [ i ] . shape ;
found_collision_shape = true ;
break ;
}
2018-02-17 12:08:44 +01:00
}
2018-07-29 23:54:12 +02:00
if ( ! found_collision_shape )
edited_collision_shape = Ref < ConvexPolygonShape2D > ( NULL ) ;
select_coord ( edited_shape_coord ) ;
2017-10-22 03:42:23 +02:00
}
}
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
} else if ( ! mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
if ( edit_mode = = EDITMODE_COLLISION ) {
if ( dragging_point > = 0 ) {
dragging_point = - 1 ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
Vector < Vector2 > points ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
Vector2 p = current_shape [ i ] ;
if ( tools [ TOOL_GRID_SNAP ] - > is_pressed ( ) | | tools [ SHAPE_KEEP_INSIDE_TILE ] - > is_pressed ( ) ) {
p = snap_point ( p ) ;
}
points . push_back ( p - shape_anchor ) ;
2017-12-28 06:57:37 +01:00
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
edited_collision_shape - > set_points ( points ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
} else if ( edit_mode = = EDITMODE_OCCLUSION ) {
if ( dragging_point > = 0 ) {
dragging_point = - 1 ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
PoolVector < Vector2 > polygon ;
polygon . resize ( current_shape . size ( ) ) ;
PoolVector < Vector2 > : : Write w = polygon . write ( ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
w [ i ] = current_shape [ i ] - shape_anchor ;
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
w = PoolVector < Vector2 > : : Write ( ) ;
edited_occlusion_shape - > set_polygon ( polygon ) ;
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
} else if ( edit_mode = = EDITMODE_NAVIGATION ) {
if ( dragging_point > = 0 ) {
dragging_point = - 1 ;
PoolVector < Vector2 > polygon ;
Vector < int > indices ;
polygon . resize ( current_shape . size ( ) ) ;
PoolVector < Vector2 > : : Write w = polygon . write ( ) ;
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
w [ i ] = current_shape [ i ] - shape_anchor ;
indices . push_back ( i ) ;
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
w = PoolVector < Vector2 > : : Write ( ) ;
edited_navigation_shape - > set_vertices ( polygon ) ;
edited_navigation_shape - > add_polygon ( indices ) ;
2018-02-16 11:48:01 +01:00
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
2017-10-22 03:42:23 +02:00
}
}
2018-07-29 23:54:12 +02:00
}
} else if ( mm . is_valid ( ) ) {
if ( dragging_point > = 0 ) {
current_shape . set ( dragging_point , snap_point ( mm - > get_position ( ) ) ) ;
2017-10-22 03:42:23 +02:00
workspace - > update ( ) ;
2018-07-29 23:54:12 +02:00
}
}
} else if ( tools [ SHAPE_NEW_POLYGON ] - > is_pressed ( ) ) {
if ( mb . is_valid ( ) ) {
if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_LEFT ) {
Vector2 pos = mb - > get_position ( ) ;
pos = snap_point ( pos ) ;
if ( creating_shape ) {
if ( current_shape . size ( ) > 0 ) {
if ( ( pos - current_shape [ 0 ] ) . length_squared ( ) < = MIN_DISTANCE_SQUARED ) {
if ( current_shape . size ( ) > 2 ) {
close_shape ( shape_anchor ) ;
workspace - > update ( ) ;
return ;
2017-12-30 06:34:33 +01:00
}
}
2018-07-29 23:54:12 +02:00
}
current_shape . push_back ( pos ) ;
workspace - > update ( ) ;
} else {
int t_id = get_current_tile ( ) ;
if ( t_id > = 0 ) {
if ( edit_mode = = EDITMODE_COLLISION ) {
Vector < TileSet : : ShapeData > sd = tileset - > tile_get_shapes ( t_id ) ;
for ( int i = 0 ; i < sd . size ( ) ; i + + ) {
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE | | sd [ i ] . autotile_coord = = edited_shape_coord ) {
Ref < ConvexPolygonShape2D > shape = sd [ i ] . shape ;
if ( ! shape . is_null ( ) ) {
sd . remove ( i ) ;
tileset - > tile_set_shapes ( get_current_tile ( ) , sd ) ;
edited_collision_shape = Ref < Shape2D > ( ) ;
workspace - > update ( ) ;
}
2018-02-17 12:08:44 +01:00
break ;
}
2017-12-30 06:34:33 +01:00
}
2018-07-29 23:54:12 +02:00
} else if ( edit_mode = = EDITMODE_OCCLUSION ) {
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
Map < Vector2 , Ref < OccluderPolygon2D > > map = tileset - > autotile_get_light_oclusion_map ( t_id ) ;
for ( Map < Vector2 , Ref < OccluderPolygon2D > > : : Element * E = map . front ( ) ; E ; E = E - > next ( ) ) {
if ( E - > key ( ) = = edited_shape_coord ) {
tileset - > autotile_set_light_occluder ( get_current_tile ( ) , Ref < OccluderPolygon2D > ( ) , edited_shape_coord ) ;
break ;
}
}
} else
tileset - > tile_set_light_occluder ( t_id , Ref < OccluderPolygon2D > ( ) ) ;
2017-12-28 06:57:37 +01:00
2018-07-29 23:54:12 +02:00
edited_occlusion_shape = Ref < OccluderPolygon2D > ( ) ;
workspace - > update ( ) ;
} else if ( edit_mode = = EDITMODE_NAVIGATION ) {
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
Map < Vector2 , Ref < NavigationPolygon > > map = tileset - > autotile_get_navigation_map ( t_id ) ;
for ( Map < Vector2 , Ref < NavigationPolygon > > : : Element * E = map . front ( ) ; E ; E = E - > next ( ) ) {
if ( E - > key ( ) = = edited_shape_coord ) {
tileset - > autotile_set_navigation_polygon ( t_id , Ref < NavigationPolygon > ( ) , edited_shape_coord ) ;
break ;
}
2018-02-17 12:08:44 +01:00
}
2018-07-29 23:54:12 +02:00
} else
tileset - > tile_set_navigation_polygon ( t_id , Ref < NavigationPolygon > ( ) ) ;
edited_navigation_shape = Ref < NavigationPolygon > ( ) ;
workspace - > update ( ) ;
}
2017-12-28 06:57:37 +01:00
}
2018-07-29 23:54:12 +02:00
creating_shape = true ;
current_shape . resize ( 0 ) ;
current_shape . push_back ( snap_point ( pos ) ) ;
}
} else if ( mb - > is_pressed ( ) & & mb - > get_button_index ( ) = = BUTTON_RIGHT & & current_shape . size ( ) > 2 ) {
if ( creating_shape ) {
close_shape ( shape_anchor ) ;
}
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
} else if ( mm . is_valid ( ) ) {
2017-10-22 03:42:23 +02:00
if ( creating_shape ) {
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
2017-10-22 03:42:23 +02:00
}
}
}
2018-07-29 23:54:12 +02:00
} break ;
2018-09-26 13:13:56 +02:00
default : { }
2017-12-30 06:34:33 +01:00
}
}
2017-10-22 03:42:23 +02:00
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_tool_clicked ( int p_tool ) {
2017-10-22 03:42:23 +02:00
if ( p_tool = = BITMASK_COPY ) {
2018-02-17 12:08:44 +01:00
bitmask_map_copy = tileset - > autotile_get_bitmask_map ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
} else if ( p_tool = = BITMASK_PASTE ) {
2018-02-17 12:08:44 +01:00
tileset - > autotile_clear_bitmask_map ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
for ( Map < Vector2 , uint16_t > : : Element * E = bitmask_map_copy . front ( ) ; E ; E = E - > next ( ) ) {
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_bitmask ( get_current_tile ( ) , E - > key ( ) , E - > value ( ) ) ;
2017-10-22 03:42:23 +02:00
}
workspace - > update ( ) ;
} else if ( p_tool = = BITMASK_CLEAR ) {
2018-02-17 12:08:44 +01:00
tileset - > autotile_clear_bitmask_map ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
workspace - > update ( ) ;
} else if ( p_tool = = SHAPE_DELETE ) {
2017-12-01 01:50:09 +01:00
if ( creating_shape ) {
creating_shape = false ;
current_shape . resize ( 0 ) ;
workspace - > update ( ) ;
} else {
switch ( edit_mode ) {
2018-07-29 23:54:12 +02:00
case EDITMODE_REGION : {
if ( workspace_mode = = WORKSPACE_EDIT & & get_current_tile ( ) > = 0 ) {
tileset - > remove_tile ( get_current_tile ( ) ) ;
2018-11-24 05:38:26 +01:00
set_current_tile ( - 1 ) ;
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
workspace_overlay - > update ( ) ;
}
tool_workspacemode [ WORKSPACE_EDIT ] - > set_pressed ( true ) ;
workspace_mode = WORKSPACE_EDIT ;
update_workspace_tile_mode ( ) ;
} break ;
2017-12-01 01:50:09 +01:00
case EDITMODE_COLLISION : {
if ( ! edited_collision_shape . is_null ( ) ) {
2018-02-17 12:08:44 +01:00
Vector < TileSet : : ShapeData > sd = tileset - > tile_get_shapes ( get_current_tile ( ) ) ;
2018-04-19 13:04:41 +02:00
int index = - 1 ;
2017-12-01 01:50:09 +01:00
for ( int i = 0 ; i < sd . size ( ) ; i + + ) {
if ( sd [ i ] . shape = = edited_collision_shape ) {
index = i ;
break ;
}
}
if ( index > = 0 ) {
sd . remove ( index ) ;
2018-02-17 12:08:44 +01:00
tileset - > tile_set_shapes ( get_current_tile ( ) , sd ) ;
2017-12-28 06:57:37 +01:00
edited_collision_shape = Ref < Shape2D > ( ) ;
2017-12-01 01:50:09 +01:00
current_shape . resize ( 0 ) ;
workspace - > update ( ) ;
}
}
} break ;
case EDITMODE_NAVIGATION : {
if ( ! edited_navigation_shape . is_null ( ) ) {
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_navigation_polygon ( get_current_tile ( ) , Ref < NavigationPolygon > ( ) , edited_shape_coord ) ;
2017-12-01 01:50:09 +01:00
edited_navigation_shape = Ref < NavigationPolygon > ( ) ;
current_shape . resize ( 0 ) ;
workspace - > update ( ) ;
}
} break ;
case EDITMODE_OCCLUSION : {
if ( ! edited_occlusion_shape . is_null ( ) ) {
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_light_occluder ( get_current_tile ( ) , Ref < OccluderPolygon2D > ( ) , edited_shape_coord ) ;
2017-12-01 01:50:09 +01:00
edited_occlusion_shape = Ref < OccluderPolygon2D > ( ) ;
current_shape . resize ( 0 ) ;
workspace - > update ( ) ;
}
} break ;
2018-09-26 13:13:56 +02:00
default : { }
2017-10-22 03:42:23 +02:00
}
}
2018-02-17 12:08:44 +01:00
} else if ( p_tool = = TOOL_SELECT ) {
if ( creating_shape ) {
2018-07-29 23:54:12 +02:00
// Cancel Creation
2018-02-17 12:08:44 +01:00
creating_shape = false ;
current_shape . resize ( 0 ) ;
workspace - > update ( ) ;
}
2017-10-22 03:42:23 +02:00
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_priority_changed ( float val ) {
tileset - > autotile_set_subtile_priority ( get_current_tile ( ) , edited_shape_coord , ( int ) val ) ;
2017-10-22 03:42:23 +02:00
workspace - > update ( ) ;
}
2018-07-02 15:39:39 +02:00
void TileSetEditor : : _on_z_index_changed ( float val ) {
tileset - > autotile_set_z_index ( get_current_tile ( ) , edited_shape_coord , ( int ) val ) ;
workspace - > update ( ) ;
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : _on_grid_snap_toggled ( bool p_val ) {
2018-07-29 23:54:12 +02:00
helper - > set_snap_options_visible ( p_val ) ;
2017-12-28 06:57:37 +01:00
workspace - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _set_snap_step ( Vector2 p_val ) {
snap_step . x = CLAMP ( p_val . x , 0 , 256 ) ;
snap_step . y = CLAMP ( p_val . y , 0 , 256 ) ;
2017-12-28 06:57:37 +01:00
workspace - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _set_snap_off ( Vector2 p_val ) {
snap_offset . x = CLAMP ( p_val . x , 0 , 256 + WORKSPACE_MARGIN . x ) ;
snap_offset . y = CLAMP ( p_val . y , 0 , 256 + WORKSPACE_MARGIN . y ) ;
2017-12-28 06:57:37 +01:00
workspace - > update ( ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : _set_snap_sep ( Vector2 p_val ) {
snap_separation . x = CLAMP ( p_val . x , 0 , 256 ) ;
snap_separation . y = CLAMP ( p_val . y , 0 , 256 ) ;
2017-12-28 06:57:37 +01:00
workspace - > update ( ) ;
}
2018-10-21 15:56:05 +02:00
void TileSetEditor : : _zoom_in ( ) {
float scale = workspace - > get_scale ( ) . x ;
if ( scale < max_scale ) {
scale * = scale_ratio ;
workspace - > set_scale ( Vector2 ( scale , scale ) ) ;
workspace_container - > set_custom_minimum_size ( workspace - > get_rect ( ) . size * scale ) ;
workspace_overlay - > set_custom_minimum_size ( workspace - > get_rect ( ) . size * scale ) ;
}
}
void TileSetEditor : : _zoom_out ( ) {
float scale = workspace - > get_scale ( ) . x ;
if ( scale > min_scale ) {
scale / = scale_ratio ;
workspace - > set_scale ( Vector2 ( scale , scale ) ) ;
workspace_container - > set_custom_minimum_size ( workspace - > get_rect ( ) . size * scale ) ;
workspace_overlay - > set_custom_minimum_size ( workspace - > get_rect ( ) . size * scale ) ;
}
}
2018-11-24 05:38:26 +01:00
void TileSetEditor : : _zoom_reset ( ) {
2018-10-21 15:56:05 +02:00
workspace - > set_scale ( Vector2 ( 1 , 1 ) ) ;
workspace_container - > set_custom_minimum_size ( workspace - > get_rect ( ) . size ) ;
workspace_overlay - > set_custom_minimum_size ( workspace - > get_rect ( ) . size ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : draw_highlight_current_tile ( ) {
2017-12-28 06:57:37 +01:00
2018-11-24 05:38:26 +01:00
Color shadow_color = Color ( 0.3 , 0.3 , 0.3 , 0.3 ) ;
if ( ( workspace_mode = = WORKSPACE_EDIT & & get_current_tile ( ) > = 0 ) | | ! edited_region . has_no_area ( ) ) {
Rect2 region ;
if ( edited_region . has_no_area ( ) ) {
region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
region . position + = WORKSPACE_MARGIN ;
} else {
region = edited_region ;
}
if ( region . position . y > = 0 )
workspace - > draw_rect ( Rect2 ( 0 , 0 , workspace - > get_rect ( ) . size . x , region . position . y ) , shadow_color ) ;
if ( region . position . x > = 0 )
workspace - > draw_rect ( Rect2 ( 0 , MAX ( 0 , region . position . y ) , region . position . x , MIN ( workspace - > get_rect ( ) . size . y - region . position . y , MIN ( region . size . y , region . position . y + region . size . y ) ) ) , shadow_color ) ;
if ( region . position . x + region . size . x < = workspace - > get_rect ( ) . size . x )
workspace - > draw_rect ( Rect2 ( region . position . x + region . size . x , MAX ( 0 , region . position . y ) , workspace - > get_rect ( ) . size . x - region . position . x - region . size . x , MIN ( workspace - > get_rect ( ) . size . y - region . position . y , MIN ( region . size . y , region . position . y + region . size . y ) ) ) , shadow_color ) ;
if ( region . position . y + region . size . y < = workspace - > get_rect ( ) . size . y )
workspace - > draw_rect ( Rect2 ( 0 , region . position . y + region . size . y , workspace - > get_rect ( ) . size . x , workspace - > get_rect ( ) . size . y - region . size . y - region . position . y ) , shadow_color ) ;
2018-07-29 23:54:12 +02:00
} else {
2018-11-24 05:38:26 +01:00
workspace - > draw_rect ( Rect2 ( Point2 ( 0 , 0 ) , workspace - > get_rect ( ) . size ) , shadow_color ) ;
2018-07-29 23:54:12 +02:00
}
2017-12-28 06:57:37 +01:00
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : draw_highlight_subtile ( Vector2 coord , const Vector < Vector2 > & other_highlighted ) {
2017-10-22 03:42:23 +02:00
2018-11-24 05:38:26 +01:00
Color shadow_color = Color ( 0.3 , 0.3 , 0.3 , 0.3 ) ;
2018-02-17 12:08:44 +01:00
Vector2 size = tileset - > autotile_get_size ( get_current_tile ( ) ) ;
int spacing = tileset - > autotile_get_spacing ( get_current_tile ( ) ) ;
Rect2 region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
coord . x * = ( size . x + spacing ) ;
coord . y * = ( size . y + spacing ) ;
2018-07-29 23:54:12 +02:00
coord + = region . position ;
coord + = WORKSPACE_MARGIN ;
2018-11-24 05:38:26 +01:00
if ( coord . y > = 0 )
workspace - > draw_rect ( Rect2 ( 0 , 0 , workspace - > get_rect ( ) . size . x , coord . y ) , shadow_color ) ;
if ( coord . x > = 0 )
workspace - > draw_rect ( Rect2 ( 0 , MAX ( 0 , coord . y ) , coord . x , MIN ( workspace - > get_rect ( ) . size . y - coord . y , MIN ( size . y , coord . y + size . y ) ) ) , shadow_color ) ;
if ( coord . x + size . x < = workspace - > get_rect ( ) . size . x )
workspace - > draw_rect ( Rect2 ( coord . x + size . x , MAX ( 0 , coord . y ) , workspace - > get_rect ( ) . size . x - coord . x - size . x , MIN ( workspace - > get_rect ( ) . size . y - coord . y , MIN ( size . y , coord . y + size . y ) ) ) , shadow_color ) ;
if ( coord . y + size . y < = workspace - > get_rect ( ) . size . y )
workspace - > draw_rect ( Rect2 ( 0 , coord . y + size . y , workspace - > get_rect ( ) . size . x , workspace - > get_rect ( ) . size . y - size . y - coord . y ) , shadow_color ) ;
2018-01-18 01:07:43 +01:00
coord + = Vector2 ( 1 , 1 ) / workspace - > get_scale ( ) . x ;
workspace - > draw_rect ( Rect2 ( coord , size - Vector2 ( 2 , 2 ) / workspace - > get_scale ( ) . x ) , Color ( 1 , 0 , 0 ) , false ) ;
2017-10-22 03:42:23 +02:00
for ( int i = 0 ; i < other_highlighted . size ( ) ; i + + ) {
coord = other_highlighted [ i ] ;
coord . x * = ( size . x + spacing ) ;
coord . y * = ( size . y + spacing ) ;
2018-07-29 23:54:12 +02:00
coord + = region . position ;
coord + = WORKSPACE_MARGIN ;
2018-01-18 01:07:43 +01:00
coord + = Vector2 ( 1 , 1 ) / workspace - > get_scale ( ) . x ;
2018-07-29 23:54:12 +02:00
workspace - > draw_rect ( Rect2 ( coord , size - Vector2 ( 2 , 2 ) / workspace - > get_scale ( ) . x ) , Color ( 1 , 0.5 , 0.5 ) , false ) ;
}
}
void TileSetEditor : : draw_tile_subdivision ( int p_id , Color p_color ) const {
Color c = p_color ;
if ( tileset - > tile_get_tile_mode ( p_id ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( p_id ) = = TileSet : : ATLAS_TILE ) {
Rect2 region = tileset - > tile_get_region ( p_id ) ;
Size2 size = tileset - > autotile_get_size ( p_id ) ;
int spacing = tileset - > autotile_get_spacing ( p_id ) ;
2018-11-24 05:38:26 +01:00
float j = size . x ;
2018-07-29 23:54:12 +02:00
while ( j < region . size . x ) {
if ( spacing < = 0 ) {
workspace - > draw_line ( region . position + WORKSPACE_MARGIN + Point2 ( j , 0 ) , region . position + WORKSPACE_MARGIN + Point2 ( j , region . size . y ) , c ) ;
} else {
workspace - > draw_rect ( Rect2 ( region . position + WORKSPACE_MARGIN + Point2 ( j , 0 ) , Size2 ( spacing , region . size . y ) ) , c ) ;
}
2018-11-24 05:38:26 +01:00
j + = spacing + size . x ;
2018-07-29 23:54:12 +02:00
}
2018-11-24 05:38:26 +01:00
j = size . y ;
2018-07-29 23:54:12 +02:00
while ( j < region . size . y ) {
if ( spacing < = 0 ) {
workspace - > draw_line ( region . position + WORKSPACE_MARGIN + Point2 ( 0 , j ) , region . position + WORKSPACE_MARGIN + Point2 ( region . size . x , j ) , c ) ;
} else {
workspace - > draw_rect ( Rect2 ( region . position + WORKSPACE_MARGIN + Point2 ( 0 , j ) , Size2 ( region . size . x , spacing ) ) , c ) ;
}
2018-11-24 05:38:26 +01:00
j + = spacing + size . y ;
2018-07-29 23:54:12 +02:00
}
}
}
void TileSetEditor : : draw_edited_region_subdivision ( ) const {
2018-11-24 05:38:26 +01:00
Color c = Color ( 0.3 , 0.7 , 0.6 ) ;
2018-07-29 23:54:12 +02:00
Rect2 region = edited_region ;
Size2 size ;
int spacing ;
bool draw ;
2018-11-24 05:38:26 +01:00
2018-07-29 23:54:12 +02:00
if ( workspace_mode = = WORKSPACE_EDIT ) {
int p_id = get_current_tile ( ) ;
size = tileset - > autotile_get_size ( p_id ) ;
spacing = tileset - > autotile_get_spacing ( p_id ) ;
draw = tileset - > tile_get_tile_mode ( p_id ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( p_id ) = = TileSet : : ATLAS_TILE ;
} else {
size = snap_step ;
spacing = snap_separation . x ;
draw = workspace_mode ! = WORKSPACE_CREATE_SINGLE ;
}
2018-11-24 05:38:26 +01:00
if ( draw ) {
float j = size . x ;
2018-07-29 23:54:12 +02:00
while ( j < region . size . x ) {
if ( spacing < = 0 ) {
workspace - > draw_line ( region . position + Point2 ( j , 0 ) , region . position + Point2 ( j , region . size . y ) , c ) ;
} else {
workspace - > draw_rect ( Rect2 ( region . position + Point2 ( j , 0 ) , Size2 ( spacing , region . size . y ) ) , c ) ;
}
2018-11-24 05:38:26 +01:00
j + = spacing + size . x ;
2018-07-29 23:54:12 +02:00
}
2018-11-24 05:38:26 +01:00
j = size . y ;
2018-07-29 23:54:12 +02:00
while ( j < region . size . y ) {
if ( spacing < = 0 ) {
workspace - > draw_line ( region . position + Point2 ( 0 , j ) , region . position + Point2 ( region . size . x , j ) , c ) ;
} else {
workspace - > draw_rect ( Rect2 ( region . position + Point2 ( 0 , j ) , Size2 ( region . size . x , spacing ) ) , c ) ;
}
2018-11-24 05:38:26 +01:00
j + = spacing + size . y ;
2018-07-29 23:54:12 +02:00
}
2017-10-22 03:42:23 +02:00
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : draw_grid_snap ( ) {
2018-07-29 23:54:12 +02:00
if ( tools [ TOOL_GRID_SNAP ] - > is_pressed ( ) ) {
2018-11-24 05:38:26 +01:00
Color grid_color = Color ( 0.4 , 0 , 1 ) ;
2017-12-28 06:57:37 +01:00
Size2 s = workspace - > get_size ( ) ;
2018-11-24 05:38:26 +01:00
int width_count = Math : : floor ( ( s . width - WORKSPACE_MARGIN . x ) / ( snap_step . x + snap_separation . x ) ) ;
int height_count = Math : : floor ( ( s . height - WORKSPACE_MARGIN . y ) / ( snap_step . y + snap_separation . y ) ) ;
2017-12-28 06:57:37 +01:00
2018-11-24 05:38:26 +01:00
int last_p = 0 ;
2017-12-28 06:57:37 +01:00
if ( snap_step . x ! = 0 ) {
for ( int i = 0 ; i < = width_count ; i + + ) {
if ( i = = 0 & & snap_offset . x ! = 0 ) {
last_p = snap_offset . x ;
}
2018-11-24 05:38:26 +01:00
if ( snap_separation . x ! = 0 ) {
if ( i ! = 0 ) {
workspace - > draw_rect ( Rect2 ( last_p , 0 , snap_separation . x , s . height ) , grid_color ) ;
last_p + = snap_separation . x ;
} else {
workspace - > draw_rect ( Rect2 ( last_p , 0 , - snap_separation . x , s . height ) , grid_color ) ;
}
} else {
2017-12-28 06:57:37 +01:00
workspace - > draw_line ( Point2 ( last_p , 0 ) , Point2 ( last_p , s . height ) , grid_color ) ;
2018-11-24 05:38:26 +01:00
}
2017-12-28 06:57:37 +01:00
last_p + = snap_step . x ;
}
}
2018-11-24 05:38:26 +01:00
last_p = 0 ;
2017-12-28 06:57:37 +01:00
if ( snap_step . y ! = 0 ) {
for ( int i = 0 ; i < = height_count ; i + + ) {
if ( i = = 0 & & snap_offset . y ! = 0 ) {
last_p = snap_offset . y ;
}
2018-11-24 05:38:26 +01:00
if ( snap_separation . x ! = 0 ) {
if ( i ! = 0 ) {
workspace - > draw_rect ( Rect2 ( 0 , last_p , s . width , snap_separation . y ) , grid_color ) ;
last_p + = snap_separation . y ;
} else {
workspace - > draw_rect ( Rect2 ( 0 , last_p , s . width , - snap_separation . y ) , grid_color ) ;
}
} else {
2017-12-28 06:57:37 +01:00
workspace - > draw_line ( Point2 ( 0 , last_p ) , Point2 ( s . width , last_p ) , grid_color ) ;
2018-11-24 05:38:26 +01:00
}
2017-12-28 06:57:37 +01:00
last_p + = snap_step . y ;
}
}
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : draw_polygon_shapes ( ) {
2017-10-22 03:42:23 +02:00
int t_id = get_current_tile ( ) ;
if ( t_id < 0 )
return ;
switch ( edit_mode ) {
case EDITMODE_COLLISION : {
2018-02-17 12:08:44 +01:00
Vector < TileSet : : ShapeData > sd = tileset - > tile_get_shapes ( t_id ) ;
2017-10-22 03:42:23 +02:00
for ( int i = 0 ; i < sd . size ( ) ; i + + ) {
2018-02-17 12:08:44 +01:00
Vector2 coord = Vector2 ( 0 , 0 ) ;
Vector2 anchor = Vector2 ( 0 , 0 ) ;
2018-07-29 23:54:12 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
2018-02-17 12:08:44 +01:00
coord = sd [ i ] . autotile_coord ;
anchor = tileset - > autotile_get_size ( t_id ) ;
anchor . x + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . y + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . x * = coord . x ;
anchor . y * = coord . y ;
}
2018-07-29 23:54:12 +02:00
anchor + = WORKSPACE_MARGIN ;
anchor + = tileset - > tile_get_region ( t_id ) . position ;
2017-12-28 06:57:37 +01:00
Ref < ConvexPolygonShape2D > shape = sd [ i ] . shape ;
2017-10-22 03:42:23 +02:00
if ( shape . is_valid ( ) ) {
Color c_bg ;
Color c_border ;
2018-02-17 12:08:44 +01:00
if ( ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE | | coord = = edited_shape_coord ) & & sd [ i ] . shape = = edited_collision_shape ) {
2017-10-22 03:42:23 +02:00
c_bg = Color ( 0 , 1 , 1 , 0.5 ) ;
c_border = Color ( 0 , 1 , 1 ) ;
} else {
c_bg = Color ( 0.9 , 0.7 , 0.07 , 0.5 ) ;
c_border = Color ( 0.9 , 0.7 , 0.07 , 1 ) ;
}
Vector < Vector2 > polygon ;
Vector < Color > colors ;
2018-01-05 11:53:30 +01:00
if ( shape = = edited_collision_shape & & current_shape . size ( ) > 2 ) {
2017-10-22 03:42:23 +02:00
for ( int j = 0 ; j < current_shape . size ( ) ; j + + ) {
polygon . push_back ( current_shape [ j ] ) ;
colors . push_back ( c_bg ) ;
}
} else {
2017-12-28 06:57:37 +01:00
for ( int j = 0 ; j < shape - > get_points ( ) . size ( ) ; j + + ) {
polygon . push_back ( shape - > get_points ( ) [ j ] + anchor ) ;
2017-10-22 03:42:23 +02:00
colors . push_back ( c_bg ) ;
}
}
2017-12-28 06:57:37 +01:00
if ( polygon . size ( ) > 2 ) {
workspace - > draw_polygon ( polygon , colors ) ;
}
2018-02-17 12:08:44 +01:00
if ( coord = = edited_shape_coord | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
2017-12-28 06:57:37 +01:00
for ( int j = 0 ; j < shape - > get_points ( ) . size ( ) - 1 ; j + + ) {
workspace - > draw_line ( shape - > get_points ( ) [ j ] + anchor , shape - > get_points ( ) [ j + 1 ] + anchor , c_border , 1 , true ) ;
2017-10-22 03:42:23 +02:00
}
2017-12-28 06:57:37 +01:00
2017-10-22 03:42:23 +02:00
if ( shape = = edited_collision_shape ) {
2018-03-02 12:36:18 +01:00
draw_handles = true ;
2017-10-22 03:42:23 +02:00
}
}
}
}
} break ;
case EDITMODE_OCCLUSION : {
2018-02-17 12:08:44 +01:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
Ref < OccluderPolygon2D > shape = edited_occlusion_shape ;
2017-10-22 03:42:23 +02:00
if ( shape . is_valid ( ) ) {
2018-02-17 12:08:44 +01:00
Color c_bg = Color ( 0 , 1 , 1 , 0.5 ) ;
Color c_border = Color ( 0 , 1 , 1 ) ;
2017-10-22 03:42:23 +02:00
Vector < Vector2 > polygon ;
Vector < Color > colors ;
2018-08-26 22:10:01 +02:00
Vector2 anchor = WORKSPACE_MARGIN ;
anchor + = tileset - > tile_get_region ( get_current_tile ( ) ) . position ;
2018-02-17 12:08:44 +01:00
for ( int j = 0 ; j < shape - > get_polygon ( ) . size ( ) ; j + + ) {
2018-08-26 22:10:01 +02:00
polygon . push_back ( shape - > get_polygon ( ) [ j ] + anchor ) ;
2018-02-17 12:08:44 +01:00
colors . push_back ( c_bg ) ;
}
workspace - > draw_polygon ( polygon , colors ) ;
for ( int j = 0 ; j < shape - > get_polygon ( ) . size ( ) - 1 ; j + + ) {
2018-08-26 22:10:01 +02:00
workspace - > draw_line ( shape - > get_polygon ( ) [ j ] + anchor , shape - > get_polygon ( ) [ j + 1 ] + anchor , c_border , 1 , true ) ;
2018-02-17 12:08:44 +01:00
}
2018-08-26 22:10:01 +02:00
workspace - > draw_line ( shape - > get_polygon ( ) [ shape - > get_polygon ( ) . size ( ) - 1 ] + anchor , shape - > get_polygon ( ) [ 0 ] + anchor , c_border , 1 , true ) ;
2018-02-17 12:08:44 +01:00
if ( shape = = edited_occlusion_shape ) {
2018-03-02 12:36:18 +01:00
draw_handles = true ;
2017-10-22 03:42:23 +02:00
}
2018-02-17 12:08:44 +01:00
}
} else {
Map < Vector2 , Ref < OccluderPolygon2D > > map = tileset - > autotile_get_light_oclusion_map ( t_id ) ;
for ( Map < Vector2 , Ref < OccluderPolygon2D > > : : Element * E = map . front ( ) ; E ; E = E - > next ( ) ) {
Vector2 coord = E - > key ( ) ;
Vector2 anchor = tileset - > autotile_get_size ( t_id ) ;
anchor . x + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . y + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . x * = coord . x ;
anchor . y * = coord . y ;
2018-07-29 23:54:12 +02:00
anchor + = WORKSPACE_MARGIN ;
anchor + = tileset - > tile_get_region ( t_id ) . position ;
2018-02-17 12:08:44 +01:00
Ref < OccluderPolygon2D > shape = E - > value ( ) ;
if ( shape . is_valid ( ) ) {
Color c_bg ;
Color c_border ;
if ( coord = = edited_shape_coord & & shape = = edited_occlusion_shape ) {
c_bg = Color ( 0 , 1 , 1 , 0.5 ) ;
c_border = Color ( 0 , 1 , 1 ) ;
} else {
c_bg = Color ( 0.9 , 0.7 , 0.07 , 0.5 ) ;
c_border = Color ( 0.9 , 0.7 , 0.07 , 1 ) ;
2017-10-22 03:42:23 +02:00
}
2018-02-17 12:08:44 +01:00
Vector < Vector2 > polygon ;
Vector < Color > colors ;
if ( shape = = edited_occlusion_shape & & current_shape . size ( ) > 2 ) {
2017-10-22 03:42:23 +02:00
for ( int j = 0 ; j < current_shape . size ( ) ; j + + ) {
2018-02-17 12:08:44 +01:00
polygon . push_back ( current_shape [ j ] ) ;
colors . push_back ( c_bg ) ;
}
} else {
for ( int j = 0 ; j < shape - > get_polygon ( ) . size ( ) ; j + + ) {
polygon . push_back ( shape - > get_polygon ( ) [ j ] + anchor ) ;
colors . push_back ( c_bg ) ;
}
}
workspace - > draw_polygon ( polygon , colors ) ;
if ( coord = = edited_shape_coord ) {
for ( int j = 0 ; j < shape - > get_polygon ( ) . size ( ) - 1 ; j + + ) {
workspace - > draw_line ( shape - > get_polygon ( ) [ j ] + anchor , shape - > get_polygon ( ) [ j + 1 ] + anchor , c_border , 1 , true ) ;
}
workspace - > draw_line ( shape - > get_polygon ( ) [ shape - > get_polygon ( ) . size ( ) - 1 ] + anchor , shape - > get_polygon ( ) [ 0 ] + anchor , c_border , 1 , true ) ;
if ( shape = = edited_occlusion_shape ) {
2018-03-02 12:36:18 +01:00
draw_handles = true ;
2017-10-22 03:42:23 +02:00
}
}
}
}
}
} break ;
case EDITMODE_NAVIGATION : {
2018-02-17 12:08:44 +01:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
Ref < NavigationPolygon > shape = edited_navigation_shape ;
2017-10-22 03:42:23 +02:00
if ( shape . is_valid ( ) ) {
2018-02-17 12:08:44 +01:00
Color c_bg = Color ( 0 , 1 , 1 , 0.5 ) ;
Color c_border = Color ( 0 , 1 , 1 ) ;
2017-10-22 03:42:23 +02:00
Vector < Vector2 > polygon ;
Vector < Color > colors ;
2018-08-26 22:10:01 +02:00
Vector2 anchor = WORKSPACE_MARGIN ;
anchor + = tileset - > tile_get_region ( get_current_tile ( ) ) . position ;
2018-02-17 12:08:44 +01:00
PoolVector < Vector2 > vertices = shape - > get_vertices ( ) ;
for ( int j = 0 ; j < shape - > get_polygon ( 0 ) . size ( ) ; j + + ) {
2018-08-26 22:10:01 +02:00
polygon . push_back ( vertices [ shape - > get_polygon ( 0 ) [ j ] ] + anchor ) ;
2018-02-17 12:08:44 +01:00
colors . push_back ( c_bg ) ;
}
workspace - > draw_polygon ( polygon , colors ) ;
if ( shape - > get_polygon_count ( ) > 0 ) {
2017-10-22 03:42:23 +02:00
PoolVector < Vector2 > vertices = shape - > get_vertices ( ) ;
2018-02-17 12:08:44 +01:00
for ( int j = 0 ; j < shape - > get_polygon ( 0 ) . size ( ) - 1 ; j + + ) {
2018-08-26 22:10:01 +02:00
workspace - > draw_line ( vertices [ shape - > get_polygon ( 0 ) [ j ] ] + anchor , vertices [ shape - > get_polygon ( 0 ) [ j + 1 ] ] + anchor , c_border , 1 , true ) ;
2018-02-17 12:08:44 +01:00
}
if ( shape = = edited_navigation_shape ) {
2018-03-02 12:36:18 +01:00
draw_handles = true ;
2017-10-22 03:42:23 +02:00
}
}
2018-02-17 12:08:44 +01:00
}
} else {
Map < Vector2 , Ref < NavigationPolygon > > map = tileset - > autotile_get_navigation_map ( t_id ) ;
for ( Map < Vector2 , Ref < NavigationPolygon > > : : Element * E = map . front ( ) ; E ; E = E - > next ( ) ) {
Vector2 coord = E - > key ( ) ;
Vector2 anchor = tileset - > autotile_get_size ( t_id ) ;
anchor . x + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . y + = tileset - > autotile_get_spacing ( t_id ) ;
anchor . x * = coord . x ;
anchor . y * = coord . y ;
2018-07-29 23:54:12 +02:00
anchor + = WORKSPACE_MARGIN ;
anchor + = tileset - > tile_get_region ( t_id ) . position ;
2018-02-17 12:08:44 +01:00
Ref < NavigationPolygon > shape = E - > value ( ) ;
if ( shape . is_valid ( ) ) {
Color c_bg ;
Color c_border ;
if ( coord = = edited_shape_coord & & shape = = edited_navigation_shape ) {
c_bg = Color ( 0 , 1 , 1 , 0.5 ) ;
c_border = Color ( 0 , 1 , 1 ) ;
} else {
c_bg = Color ( 0.9 , 0.7 , 0.07 , 0.5 ) ;
c_border = Color ( 0.9 , 0.7 , 0.07 , 1 ) ;
}
Vector < Vector2 > polygon ;
Vector < Color > colors ;
if ( shape = = edited_navigation_shape & & current_shape . size ( ) > 2 ) {
for ( int j = 0 ; j < current_shape . size ( ) ; j + + ) {
polygon . push_back ( current_shape [ j ] ) ;
colors . push_back ( c_bg ) ;
}
} else if ( shape - > get_polygon_count ( ) > 0 ) {
2017-10-22 03:42:23 +02:00
PoolVector < Vector2 > vertices = shape - > get_vertices ( ) ;
2018-02-17 12:08:44 +01:00
for ( int j = 0 ; j < shape - > get_polygon ( 0 ) . size ( ) ; j + + ) {
polygon . push_back ( vertices [ shape - > get_polygon ( 0 ) [ j ] ] + anchor ) ;
colors . push_back ( c_bg ) ;
2017-10-22 03:42:23 +02:00
}
2018-02-17 12:08:44 +01:00
}
workspace - > draw_polygon ( polygon , colors ) ;
if ( coord = = edited_shape_coord ) {
if ( shape - > get_polygon_count ( ) > 0 ) {
PoolVector < Vector2 > vertices = shape - > get_vertices ( ) ;
for ( int j = 0 ; j < shape - > get_polygon ( 0 ) . size ( ) - 1 ; j + + ) {
workspace - > draw_line ( vertices [ shape - > get_polygon ( 0 ) [ j ] ] + anchor , vertices [ shape - > get_polygon ( 0 ) [ j + 1 ] ] + anchor , c_border , 1 , true ) ;
}
if ( shape = = edited_navigation_shape ) {
2018-03-02 12:36:18 +01:00
draw_handles = true ;
2017-10-22 03:42:23 +02:00
}
}
}
}
}
}
} break ;
2018-09-26 13:13:56 +02:00
default : { }
2017-10-22 03:42:23 +02:00
}
if ( creating_shape ) {
for ( int j = 0 ; j < current_shape . size ( ) - 1 ; j + + ) {
workspace - > draw_line ( current_shape [ j ] , current_shape [ j + 1 ] , Color ( 0 , 1 , 1 ) , 1 , true ) ;
}
workspace - > draw_line ( current_shape [ current_shape . size ( ) - 1 ] , snap_point ( workspace - > get_local_mouse_position ( ) ) , Color ( 0 , 1 , 1 ) , 1 , true ) ;
}
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : close_shape ( const Vector2 & shape_anchor ) {
2017-10-22 03:42:23 +02:00
creating_shape = false ;
if ( edit_mode = = EDITMODE_COLLISION ) {
2017-12-28 06:57:37 +01:00
if ( current_shape . size ( ) > = 3 ) {
Ref < ConvexPolygonShape2D > shape = memnew ( ConvexPolygonShape2D ) ;
2017-10-22 03:42:23 +02:00
2017-12-28 06:57:37 +01:00
Vector < Vector2 > segments ;
2017-12-30 06:34:33 +01:00
float p_total = 0 ;
2017-10-22 03:42:23 +02:00
2017-12-28 06:57:37 +01:00
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
segments . push_back ( current_shape [ i ] - shape_anchor ) ;
2017-12-30 06:34:33 +01:00
if ( i ! = current_shape . size ( ) - 1 )
p_total + = ( ( current_shape [ i + 1 ] . x - current_shape [ i ] . x ) * ( - current_shape [ i + 1 ] . y + ( - current_shape [ i ] . y ) ) ) ;
else
p_total + = ( ( current_shape [ 0 ] . x - current_shape [ i ] . x ) * ( - current_shape [ 0 ] . y + ( - current_shape [ i ] . y ) ) ) ;
2017-12-28 06:57:37 +01:00
}
2017-10-22 03:42:23 +02:00
2017-12-30 06:34:33 +01:00
if ( p_total < 0 )
segments . invert ( ) ;
2017-12-28 06:57:37 +01:00
shape - > set_points ( segments ) ;
2018-07-29 23:54:12 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE )
2018-02-17 12:08:44 +01:00
tileset - > tile_add_shape ( get_current_tile ( ) , shape , Transform2D ( ) , false , edited_shape_coord ) ;
else
2018-07-29 23:54:12 +02:00
tileset - > tile_add_shape ( get_current_tile ( ) , shape , Transform2D ( ) ) ;
2018-02-17 12:08:44 +01:00
2017-12-28 06:57:37 +01:00
edited_collision_shape = shape ;
}
2017-10-22 03:42:23 +02:00
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
workspace - > update ( ) ;
} else if ( edit_mode = = EDITMODE_OCCLUSION ) {
Ref < OccluderPolygon2D > shape = memnew ( OccluderPolygon2D ) ;
PoolVector < Vector2 > polygon ;
polygon . resize ( current_shape . size ( ) ) ;
PoolVector < Vector2 > : : Write w = polygon . write ( ) ;
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
w [ i ] = current_shape [ i ] - shape_anchor ;
}
w = PoolVector < Vector2 > : : Write ( ) ;
shape - > set_polygon ( polygon ) ;
2018-07-29 23:54:12 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE )
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_light_occluder ( get_current_tile ( ) , shape , edited_shape_coord ) ;
else
tileset - > tile_set_light_occluder ( get_current_tile ( ) , shape ) ;
2017-10-22 03:42:23 +02:00
edited_occlusion_shape = shape ;
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
workspace - > update ( ) ;
} else if ( edit_mode = = EDITMODE_NAVIGATION ) {
Ref < NavigationPolygon > shape = memnew ( NavigationPolygon ) ;
PoolVector < Vector2 > polygon ;
Vector < int > indices ;
polygon . resize ( current_shape . size ( ) ) ;
PoolVector < Vector2 > : : Write w = polygon . write ( ) ;
for ( int i = 0 ; i < current_shape . size ( ) ; i + + ) {
w [ i ] = current_shape [ i ] - shape_anchor ;
indices . push_back ( i ) ;
}
w = PoolVector < Vector2 > : : Write ( ) ;
shape - > set_vertices ( polygon ) ;
shape - > add_polygon ( indices ) ;
2018-02-17 12:08:44 +01:00
2018-07-29 23:54:12 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE )
2018-02-17 12:08:44 +01:00
tileset - > autotile_set_navigation_polygon ( get_current_tile ( ) , shape , edited_shape_coord ) ;
else
tileset - > tile_set_navigation_polygon ( get_current_tile ( ) , shape ) ;
2017-10-22 03:42:23 +02:00
edited_navigation_shape = shape ;
tools [ TOOL_SELECT ] - > set_pressed ( true ) ;
workspace - > update ( ) ;
}
2018-02-17 12:08:44 +01:00
tileset - > _change_notify ( " " ) ;
2017-10-22 03:42:23 +02:00
}
2018-02-17 12:08:44 +01:00
void TileSetEditor : : select_coord ( const Vector2 & coord ) {
current_shape = PoolVector2Array ( ) ;
2018-08-26 22:10:01 +02:00
if ( get_current_tile ( ) = = - 1 )
return ;
2018-07-29 23:54:12 +02:00
Rect2 current_tile_region = tileset - > tile_get_region ( get_current_tile ( ) ) ;
current_tile_region . position + = WORKSPACE_MARGIN ;
2018-02-17 12:08:44 +01:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
if ( edited_collision_shape ! = tileset - > tile_get_shape ( get_current_tile ( ) , 0 ) )
edited_collision_shape = tileset - > tile_get_shape ( get_current_tile ( ) , 0 ) ;
if ( edited_occlusion_shape ! = tileset - > tile_get_light_occluder ( get_current_tile ( ) ) )
edited_occlusion_shape = tileset - > tile_get_light_occluder ( get_current_tile ( ) ) ;
if ( edited_navigation_shape ! = tileset - > tile_get_navigation_polygon ( get_current_tile ( ) ) )
edited_navigation_shape = tileset - > tile_get_navigation_polygon ( get_current_tile ( ) ) ;
if ( edit_mode = = EDITMODE_COLLISION ) {
current_shape . resize ( 0 ) ;
if ( edited_collision_shape . is_valid ( ) ) {
for ( int i = 0 ; i < edited_collision_shape - > get_points ( ) . size ( ) ; i + + ) {
2018-07-29 23:54:12 +02:00
current_shape . push_back ( edited_collision_shape - > get_points ( ) [ i ] + current_tile_region . position ) ;
2018-02-17 12:08:44 +01:00
}
2018-01-05 11:53:30 +01:00
}
2018-02-17 12:08:44 +01:00
} else if ( edit_mode = = EDITMODE_OCCLUSION ) {
current_shape . resize ( 0 ) ;
if ( edited_occlusion_shape . is_valid ( ) ) {
for ( int i = 0 ; i < edited_occlusion_shape - > get_polygon ( ) . size ( ) ; i + + ) {
2018-07-29 23:54:12 +02:00
current_shape . push_back ( edited_occlusion_shape - > get_polygon ( ) [ i ] + current_tile_region . position ) ;
2018-02-17 12:08:44 +01:00
}
}
} else if ( edit_mode = = EDITMODE_NAVIGATION ) {
current_shape . resize ( 0 ) ;
if ( edited_navigation_shape . is_valid ( ) ) {
if ( edited_navigation_shape - > get_polygon_count ( ) > 0 ) {
PoolVector < Vector2 > vertices = edited_navigation_shape - > get_vertices ( ) ;
for ( int i = 0 ; i < edited_navigation_shape - > get_polygon ( 0 ) . size ( ) ; i + + ) {
2018-07-29 23:54:12 +02:00
current_shape . push_back ( vertices [ edited_navigation_shape - > get_polygon ( 0 ) [ i ] ] + current_tile_region . position ) ;
2018-02-17 12:08:44 +01:00
}
}
2018-01-05 11:53:30 +01:00
}
}
2018-02-17 12:08:44 +01:00
} else {
int spacing = tileset - > autotile_get_spacing ( get_current_tile ( ) ) ;
Vector2 size = tileset - > autotile_get_size ( get_current_tile ( ) ) ;
Vector2 shape_anchor = coord ;
shape_anchor . x * = ( size . x + spacing ) ;
shape_anchor . y * = ( size . y + spacing ) ;
2018-07-29 23:54:12 +02:00
shape_anchor + = current_tile_region . position ;
2018-02-17 12:08:44 +01:00
if ( edit_mode = = EDITMODE_COLLISION ) {
current_shape . resize ( 0 ) ;
if ( edited_collision_shape . is_valid ( ) ) {
for ( int j = 0 ; j < edited_collision_shape - > get_points ( ) . size ( ) ; j + + ) {
current_shape . push_back ( edited_collision_shape - > get_points ( ) [ j ] + shape_anchor ) ;
}
}
} else if ( edit_mode = = EDITMODE_OCCLUSION ) {
current_shape . resize ( 0 ) ;
if ( edited_occlusion_shape . is_valid ( ) ) {
for ( int i = 0 ; i < edited_occlusion_shape - > get_polygon ( ) . size ( ) ; i + + ) {
current_shape . push_back ( edited_occlusion_shape - > get_polygon ( ) [ i ] + shape_anchor ) ;
}
}
} else if ( edit_mode = = EDITMODE_NAVIGATION ) {
current_shape . resize ( 0 ) ;
if ( edited_navigation_shape . is_valid ( ) ) {
if ( edited_navigation_shape - > get_polygon_count ( ) > 0 ) {
PoolVector < Vector2 > vertices = edited_navigation_shape - > get_vertices ( ) ;
for ( int i = 0 ; i < edited_navigation_shape - > get_polygon ( 0 ) . size ( ) ; i + + ) {
current_shape . push_back ( vertices [ edited_navigation_shape - > get_polygon ( 0 ) [ i ] ] + shape_anchor ) ;
}
2018-01-05 11:53:30 +01:00
}
}
}
}
2018-07-29 23:54:12 +02:00
workspace - > update ( ) ;
workspace_container - > update ( ) ;
helper - > _change_notify ( " " ) ;
2018-01-05 11:53:30 +01:00
}
2018-02-17 12:08:44 +01:00
Vector2 TileSetEditor : : snap_point ( const Vector2 & point ) {
2017-10-22 03:42:23 +02:00
Vector2 p = point ;
Vector2 coord = edited_shape_coord ;
2018-02-17 12:08:44 +01:00
Vector2 tile_size = tileset - > autotile_get_size ( get_current_tile ( ) ) ;
int spacing = tileset - > autotile_get_spacing ( get_current_tile ( ) ) ;
2017-10-22 03:42:23 +02:00
Vector2 anchor = coord ;
anchor . x * = ( tile_size . x + spacing ) ;
anchor . y * = ( tile_size . y + spacing ) ;
2018-07-29 23:54:12 +02:00
anchor + = tileset - > tile_get_region ( get_current_tile ( ) ) . position ;
anchor + = WORKSPACE_MARGIN ;
2017-10-22 03:42:23 +02:00
Rect2 region ( anchor , tile_size ) ;
2018-08-26 22:10:01 +02:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
2018-07-29 23:54:12 +02:00
region . position = tileset - > tile_get_region ( get_current_tile ( ) ) . position + WORKSPACE_MARGIN ;
2018-08-26 22:10:01 +02:00
region . size = tileset - > tile_get_region ( get_current_tile ( ) ) . size ;
}
2018-02-17 12:08:44 +01:00
2018-07-29 23:54:12 +02:00
if ( tools [ TOOL_GRID_SNAP ] - > is_pressed ( ) ) {
2017-12-28 06:57:37 +01:00
p . x = Math : : snap_scalar_seperation ( snap_offset . x , snap_step . x , p . x , snap_separation . x ) ;
p . y = Math : : snap_scalar_seperation ( snap_offset . y , snap_step . y , p . y , snap_separation . y ) ;
}
2017-10-22 03:42:23 +02:00
if ( tools [ SHAPE_KEEP_INSIDE_TILE ] - > is_pressed ( ) ) {
if ( p . x < region . position . x )
p . x = region . position . x ;
if ( p . y < region . position . y )
p . y = region . position . y ;
if ( p . x > region . position . x + region . size . x )
p . x = region . position . x + region . size . x ;
if ( p . y > region . position . y + region . size . y )
p . y = region . position . y + region . size . y ;
}
return p ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : update_texture_list ( ) {
Ref < Texture > selected_texture = get_current_texture ( ) ;
2017-10-22 03:42:23 +02:00
2018-02-17 12:08:44 +01:00
helper - > set_tileset ( tileset ) ;
2017-10-22 03:42:23 +02:00
List < int > ids ;
2018-02-17 12:08:44 +01:00
tileset - > get_tile_list ( & ids ) ;
2018-11-02 04:54:28 +01:00
Vector < int > ids_to_remove ;
2017-10-22 03:42:23 +02:00
for ( List < int > : : Element * E = ids . front ( ) ; E ; E = E - > next ( ) ) {
2018-11-02 04:54:28 +01:00
// Clear tiles referencing gone textures (user has been already given the chance to fix broken deps)
if ( ! tileset - > tile_get_texture ( E - > get ( ) ) . is_valid ( ) ) {
ids_to_remove . push_back ( E - > get ( ) ) ;
ERR_CONTINUE ( ! tileset - > tile_get_texture ( E - > get ( ) ) . is_valid ( ) ) ;
}
2018-07-29 23:54:12 +02:00
if ( ! texture_map . has ( tileset - > tile_get_texture ( E - > get ( ) ) - > get_rid ( ) ) ) {
texture_list - > add_item ( tileset - > tile_get_texture ( E - > get ( ) ) - > get_path ( ) . get_file ( ) ) ;
texture_map . insert ( tileset - > tile_get_texture ( E - > get ( ) ) - > get_rid ( ) , tileset - > tile_get_texture ( E - > get ( ) ) ) ;
texture_list - > set_item_metadata ( texture_list - > get_item_count ( ) - 1 , tileset - > tile_get_texture ( E - > get ( ) ) - > get_rid ( ) ) ;
2017-10-22 03:42:23 +02:00
}
}
2018-11-02 04:54:28 +01:00
for ( int i = 0 ; i < ids_to_remove . size ( ) ; i + + ) {
tileset - > remove_tile ( ids_to_remove [ i ] ) ;
}
2018-07-29 23:54:12 +02:00
if ( texture_list - > get_item_count ( ) > 0 & & selected_texture . is_valid ( ) ) {
texture_list - > select ( texture_list - > find_metadata ( selected_texture - > get_rid ( ) ) ) ;
if ( texture_list - > get_selected_items ( ) . size ( ) > 0 )
_on_texture_list_selected ( texture_list - > get_selected_items ( ) [ 0 ] ) ;
} else if ( get_current_texture ( ) . is_valid ( ) ) {
_on_texture_list_selected ( texture_list - > find_metadata ( get_current_texture ( ) - > get_rid ( ) ) ) ;
} else {
_on_texture_list_selected ( - 1 ) ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
update_texture_list_icon ( ) ;
2017-10-22 03:42:23 +02:00
helper - > _change_notify ( " " ) ;
}
2018-07-29 23:54:12 +02:00
void TileSetEditor : : update_texture_list_icon ( ) {
for ( int current_idx = 0 ; current_idx < texture_list - > get_item_count ( ) ; current_idx + + ) {
RID rid = texture_list - > get_item_metadata ( current_idx ) ;
texture_list - > set_item_icon ( current_idx , texture_map [ rid ] ) ;
texture_list - > set_item_icon_region ( current_idx , Rect2 ( 0 , 0 , 150 , 100 ) ) ;
2018-02-17 12:08:44 +01:00
}
2018-07-29 23:54:12 +02:00
texture_list - > update ( ) ;
2018-02-17 12:08:44 +01:00
}
void TileSetEditor : : update_workspace_tile_mode ( ) {
2018-07-29 23:54:12 +02:00
2018-11-24 05:38:26 +01:00
if ( ! get_current_texture ( ) . is_valid ( ) ) {
tool_workspacemode [ WORKSPACE_EDIT ] - > set_pressed ( true ) ;
workspace_mode = WORKSPACE_EDIT ;
for ( int i = 1 ; i < WORKSPACE_MODE_MAX ; i + + ) {
tool_workspacemode [ i ] - > set_disabled ( true ) ;
}
} else {
for ( int i = 1 ; i < WORKSPACE_MODE_MAX ; i + + ) {
tool_workspacemode [ i ] - > set_disabled ( false ) ;
}
}
2018-07-29 23:54:12 +02:00
if ( workspace_mode ! = WORKSPACE_EDIT ) {
for ( int i = 0 ; i < EDITMODE_MAX ; i + + ) {
tool_editmode [ i ] - > hide ( ) ;
}
tool_editmode [ EDITMODE_REGION ] - > show ( ) ;
tool_editmode [ EDITMODE_REGION ] - > set_pressed ( true ) ;
_on_edit_mode_changed ( EDITMODE_REGION ) ;
2018-08-13 01:24:20 +02:00
separator_editmode - > show ( ) ;
2018-07-29 23:54:12 +02:00
return ;
}
if ( get_current_tile ( ) < 0 ) {
for ( int i = 0 ; i < EDITMODE_MAX ; i + + ) {
tool_editmode [ i ] - > hide ( ) ;
}
for ( int i = 0 ; i < ZOOM_OUT ; i + + ) {
tools [ i ] - > hide ( ) ;
}
2018-11-24 05:38:26 +01:00
2018-08-13 01:24:20 +02:00
separator_editmode - > hide ( ) ;
2018-11-24 05:38:26 +01:00
separator_bitmask - > hide ( ) ;
2018-08-13 01:24:20 +02:00
separator_delete - > hide ( ) ;
separator_grid - > hide ( ) ;
2018-02-17 12:08:44 +01:00
return ;
2018-07-29 23:54:12 +02:00
}
for ( int i = 0 ; i < EDITMODE_MAX ; i + + ) {
tool_editmode [ i ] - > show ( ) ;
}
2018-08-13 01:24:20 +02:00
separator_editmode - > show ( ) ;
2018-07-29 23:54:12 +02:00
2018-02-17 12:08:44 +01:00
if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : SINGLE_TILE ) {
2018-07-02 15:39:39 +02:00
if ( tool_editmode [ EDITMODE_ICON ] - > is_pressed ( ) | | tool_editmode [ EDITMODE_PRIORITY ] - > is_pressed ( ) | | tool_editmode [ EDITMODE_BITMASK ] - > is_pressed ( ) | | tool_editmode [ EDITMODE_Z_INDEX ] - > is_pressed ( ) ) {
2018-02-17 12:08:44 +01:00
tool_editmode [ EDITMODE_COLLISION ] - > set_pressed ( true ) ;
2018-07-29 23:54:12 +02:00
edit_mode = EDITMODE_COLLISION ;
2018-02-17 12:08:44 +01:00
}
2018-07-29 23:54:12 +02:00
select_coord ( Vector2 ( 0 , 0 ) ) ;
2018-02-17 12:08:44 +01:00
tool_editmode [ EDITMODE_ICON ] - > hide ( ) ;
tool_editmode [ EDITMODE_BITMASK ] - > hide ( ) ;
tool_editmode [ EDITMODE_PRIORITY ] - > hide ( ) ;
2018-07-02 15:39:39 +02:00
tool_editmode [ EDITMODE_Z_INDEX ] - > hide ( ) ;
2018-07-29 23:54:12 +02:00
} else if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : AUTO_TILE | | tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
if ( edit_mode = = EDITMODE_ICON )
select_coord ( tileset - > autotile_get_icon_coordinate ( get_current_tile ( ) ) ) ;
else
select_coord ( edited_shape_coord ) ;
} else if ( tileset - > tile_get_tile_mode ( get_current_tile ( ) ) = = TileSet : : ATLAS_TILE ) {
if ( tool_editmode [ EDITMODE_PRIORITY ] - > is_pressed ( ) | | tool_editmode [ EDITMODE_BITMASK ] - > is_pressed ( ) ) {
tool_editmode [ EDITMODE_COLLISION ] - > set_pressed ( true ) ;
edit_mode = EDITMODE_COLLISION ;
}
if ( edit_mode = = EDITMODE_ICON )
select_coord ( tileset - > autotile_get_icon_coordinate ( get_current_tile ( ) ) ) ;
else
select_coord ( edited_shape_coord ) ;
tool_editmode [ EDITMODE_BITMASK ] - > hide ( ) ;
tool_editmode [ EDITMODE_PRIORITY ] - > hide ( ) ;
}
_on_edit_mode_changed ( edit_mode ) ;
}
void TileSetEditor : : update_edited_region ( const Vector2 & end_point ) {
edited_region = Rect2 ( region_from , Size2 ( ) ) ;
if ( tools [ TOOL_GRID_SNAP ] - > is_pressed ( ) ) {
Vector2 grid_coord ;
2018-11-24 05:38:26 +01:00
grid_coord = ( ( region_from - snap_offset ) / ( snap_step + snap_separation ) ) . floor ( ) ;
grid_coord * = ( snap_step + snap_separation ) ;
2018-07-29 23:54:12 +02:00
grid_coord + = snap_offset ;
edited_region . expand_to ( grid_coord ) ;
2018-11-24 05:38:26 +01:00
grid_coord + = snap_step + snap_separation ;
2018-07-29 23:54:12 +02:00
edited_region . expand_to ( grid_coord ) ;
2018-11-24 05:38:26 +01:00
grid_coord = ( ( end_point - snap_offset ) / ( snap_step + snap_separation ) ) . floor ( ) ;
grid_coord * = ( snap_step + snap_separation ) ;
2018-07-29 23:54:12 +02:00
grid_coord + = snap_offset ;
edited_region . expand_to ( grid_coord ) ;
2018-11-24 05:38:26 +01:00
grid_coord + = snap_step + snap_separation ;
2018-07-29 23:54:12 +02:00
edited_region . expand_to ( grid_coord ) ;
2018-02-17 12:08:44 +01:00
} else {
2018-07-29 23:54:12 +02:00
edited_region . expand_to ( end_point ) ;
2018-02-17 12:08:44 +01:00
}
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
int TileSetEditor : : get_current_tile ( ) const {
return current_tile ;
}
void TileSetEditor : : set_current_tile ( int p_id ) {
if ( current_tile ! = p_id ) {
current_tile = p_id ;
helper - > _change_notify ( " " ) ;
select_coord ( Vector2 ( 0 , 0 ) ) ;
update_workspace_tile_mode ( ) ;
}
}
Ref < Texture > TileSetEditor : : get_current_texture ( ) {
if ( texture_list - > get_selected_items ( ) . size ( ) = = 0 )
return Ref < Texture > ( ) ;
2017-10-22 03:42:23 +02:00
else
2018-07-29 23:54:12 +02:00
return texture_map [ texture_list - > get_item_metadata ( texture_list - > get_selected_items ( ) [ 0 ] ) ] ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
void TilesetEditorContext : : set_tileset ( const Ref < TileSet > & p_tileset ) {
2017-10-22 03:42:23 +02:00
2018-02-17 12:08:44 +01:00
tileset = p_tileset ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
void TilesetEditorContext : : set_snap_options_visible ( bool p_visible ) {
snap_options_visible = p_visible ;
_change_notify ( " " ) ;
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
bool TilesetEditorContext : : _set ( const StringName & p_name , const Variant & p_value ) {
2017-10-22 03:42:23 +02:00
String name = p_name . operator String ( ) ;
2018-07-29 23:54:12 +02:00
if ( name = = " options_offset " ) {
Vector2 snap = p_value ;
tileset_editor - > _set_snap_off ( snap + WORKSPACE_MARGIN ) ;
return true ;
} else if ( name = = " options_step " ) {
Vector2 snap = p_value ;
tileset_editor - > _set_snap_step ( snap ) ;
return true ;
} else if ( name = = " options_separation " ) {
Vector2 snap = p_value ;
tileset_editor - > _set_snap_sep ( snap ) ;
return true ;
} else if ( p_name . operator String ( ) . left ( 5 ) = = " tile_ " ) {
String name = p_name . operator String ( ) . right ( 5 ) ;
bool v = false ;
if ( tileset_editor - > get_current_tile ( ) < 0 | | tileset . is_null ( ) )
return false ;
if ( name = = " autotile_bitmask_mode " ) {
tileset - > set ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/bitmask_mode " , p_value , & v ) ;
} else if ( name = = " subtile_size " ) {
tileset - > set ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/tile_size " , p_value , & v ) ;
} else if ( name = = " subtile_spacing " ) {
tileset - > set ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/spacing " , p_value , & v ) ;
} else {
tileset - > set ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " / " + name , p_value , & v ) ;
}
if ( v ) {
tileset - > _change_notify ( " " ) ;
tileset_editor - > workspace - > update ( ) ;
tileset_editor - > workspace_overlay - > update ( ) ;
}
return v ;
2018-08-26 22:10:01 +02:00
} else if ( name = = " tileset_script " ) {
tileset - > set_script ( p_value ) ;
return true ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
tileset_editor - > err_dialog - > set_text ( TTR ( " This property can't be changed. " ) ) ;
tileset_editor - > err_dialog - > popup_centered ( Size2 ( 300 , 60 ) ) ;
return false ;
}
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
bool TilesetEditorContext : : _get ( const StringName & p_name , Variant & r_ret ) const {
2017-10-22 03:42:23 +02:00
String name = p_name . operator String ( ) ;
2017-12-17 19:03:46 +01:00
bool v = false ;
2018-07-29 23:54:12 +02:00
if ( name = = " options_offset " ) {
r_ret = tileset_editor - > snap_offset - WORKSPACE_MARGIN ;
v = true ;
} else if ( name = = " options_step " ) {
r_ret = tileset_editor - > snap_step ;
v = true ;
} else if ( name = = " options_separation " ) {
r_ret = tileset_editor - > snap_separation ;
v = true ;
} else if ( name . left ( 5 ) = = " tile_ " ) {
name = name . right ( 5 ) ;
if ( tileset_editor - > get_current_tile ( ) < 0 | | tileset . is_null ( ) )
return false ;
if ( ! tileset - > has_tile ( tileset_editor - > get_current_tile ( ) ) )
return false ;
if ( name = = " autotile_bitmask_mode " ) {
r_ret = tileset - > get ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/bitmask_mode " , & v ) ;
} else if ( name = = " subtile_size " ) {
r_ret = tileset - > get ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/tile_size " , & v ) ;
} else if ( name = = " subtile_spacing " ) {
r_ret = tileset - > get ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " /autotile/spacing " , & v ) ;
} else {
r_ret = tileset - > get ( String : : num ( tileset_editor - > get_current_tile ( ) , 0 ) + " / " + name , & v ) ;
}
return v ;
} else if ( name = = " selected_collision " ) {
r_ret = tileset_editor - > edited_collision_shape ;
v = true ;
} else if ( name = = " selected_navigation " ) {
r_ret = tileset_editor - > edited_navigation_shape ;
v = true ;
} else if ( name = = " selected_occlusion " ) {
r_ret = tileset_editor - > edited_occlusion_shape ;
v = true ;
2018-08-26 22:10:01 +02:00
} else if ( name = = " tileset_script " ) {
r_ret = tileset - > get_script ( ) ;
v = true ;
2017-10-22 03:42:23 +02:00
}
2017-12-17 19:03:46 +01:00
return v ;
2017-10-22 03:42:23 +02:00
}
2018-07-29 23:54:12 +02:00
void TilesetEditorContext : : _get_property_list ( List < PropertyInfo > * p_list ) const {
2017-10-22 03:42:23 +02:00
2018-07-29 23:54:12 +02:00
if ( snap_options_visible ) {
p_list - > push_back ( PropertyInfo ( Variant : : NIL , " Snap Options " , PROPERTY_HINT_NONE , " options_ " , PROPERTY_USAGE_GROUP ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " options_offset " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " options_step " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " options_separation " ) ) ;
}
if ( tileset_editor - > get_current_tile ( ) > = 0 & & ! tileset . is_null ( ) ) {
int id = tileset_editor - > get_current_tile ( ) ;
p_list - > push_back ( PropertyInfo ( Variant : : NIL , " Selected Tile " , PROPERTY_HINT_NONE , " tile_ " , PROPERTY_USAGE_GROUP ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : STRING , " tile_name " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " tile_normal_map " , PROPERTY_HINT_RESOURCE_TYPE , " Texture " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_tex_offset " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " tile_material " , PROPERTY_HINT_RESOURCE_TYPE , " ShaderMaterial " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : COLOR , " tile_modulate " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : INT , " tile_tile_mode " , PROPERTY_HINT_ENUM , " SINGLE_TILE,AUTO_TILE,ATLAS_TILE " ) ) ;
if ( tileset - > tile_get_tile_mode ( id ) = = TileSet : : AUTO_TILE ) {
p_list - > push_back ( PropertyInfo ( Variant : : INT , " tile_autotile_bitmask_mode " , PROPERTY_HINT_ENUM , " 2X2,3X3 (minimal),3X3 " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_subtile_size " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : INT , " tile_subtile_spacing " , PROPERTY_HINT_RANGE , " 0, 256, 1 " ) ) ;
} else if ( tileset - > tile_get_tile_mode ( id ) = = TileSet : : ATLAS_TILE ) {
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_subtile_size " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : INT , " tile_subtile_spacing " , PROPERTY_HINT_RANGE , " 0, 256, 1 " ) ) ;
}
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_occluder_offset " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_navigation_offset " ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_shape_offset " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_EDITOR ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : VECTOR2 , " tile_shape_transform " , PROPERTY_HINT_NONE , " " , PROPERTY_USAGE_EDITOR ) ) ;
p_list - > push_back ( PropertyInfo ( Variant : : INT , " tile_z_index " , PROPERTY_HINT_RANGE , itos ( VS : : CANVAS_ITEM_Z_MIN ) + " , " + itos ( VS : : CANVAS_ITEM_Z_MAX ) + " ,1 " ) ) ;
}
if ( tileset_editor - > edit_mode = = TileSetEditor : : EDITMODE_COLLISION & & tileset_editor - > edited_collision_shape . is_valid ( ) ) {
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " selected_collision " , PROPERTY_HINT_RESOURCE_TYPE , tileset_editor - > edited_collision_shape - > get_class ( ) ) ) ;
}
if ( tileset_editor - > edit_mode = = TileSetEditor : : EDITMODE_NAVIGATION & & tileset_editor - > edited_navigation_shape . is_valid ( ) ) {
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " selected_navigation " , PROPERTY_HINT_RESOURCE_TYPE , tileset_editor - > edited_navigation_shape - > get_class ( ) ) ) ;
}
if ( tileset_editor - > edit_mode = = TileSetEditor : : EDITMODE_OCCLUSION & & tileset_editor - > edited_occlusion_shape . is_valid ( ) ) {
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " selected_occlusion " , PROPERTY_HINT_RESOURCE_TYPE , tileset_editor - > edited_occlusion_shape - > get_class ( ) ) ) ;
}
2018-08-26 22:10:01 +02:00
if ( ! tileset . is_null ( ) ) {
p_list - > push_back ( PropertyInfo ( Variant : : OBJECT , " tileset_script " , PROPERTY_HINT_RESOURCE_TYPE , " Script " ) ) ;
}
2017-10-22 03:42:23 +02:00
}
2018-12-07 05:18:02 +01:00
void TilesetEditorContext : : _bind_methods ( ) {
ClassDB : : bind_method ( " _hide_script_from_inspector " , & TilesetEditorContext : : _hide_script_from_inspector ) ;
}
2018-07-29 23:54:12 +02:00
TilesetEditorContext : : TilesetEditorContext ( TileSetEditor * p_tileset_editor ) {
2018-11-24 05:38:26 +01:00
2018-02-17 12:08:44 +01:00
tileset_editor = p_tileset_editor ;
}
void TileSetEditorPlugin : : edit ( Object * p_node ) {
if ( Object : : cast_to < TileSet > ( p_node ) ) {
tileset_editor - > edit ( Object : : cast_to < TileSet > ( p_node ) ) ;
2018-07-29 23:54:12 +02:00
editor - > get_inspector ( ) - > edit ( tileset_editor - > helper ) ;
}
2018-02-17 12:08:44 +01:00
}
bool TileSetEditorPlugin : : handles ( Object * p_node ) const {
2018-11-24 05:38:26 +01:00
return p_node - > is_class ( " TileSet " ) | | p_node - > is_class ( " TilesetEditorContext " ) ;
2018-02-17 12:08:44 +01:00
}
void TileSetEditorPlugin : : make_visible ( bool p_visible ) {
if ( p_visible ) {
tileset_editor_button - > show ( ) ;
2018-08-13 01:24:20 +02:00
editor - > make_bottom_panel_item_visible ( tileset_editor ) ;
2018-07-29 23:54:12 +02:00
get_tree ( ) - > connect ( " idle_frame " , tileset_editor , " _on_workspace_process " ) ;
2018-02-17 12:08:44 +01:00
} else {
2018-08-13 01:24:20 +02:00
editor - > hide_bottom_panel ( ) ;
2018-02-17 12:08:44 +01:00
tileset_editor_button - > hide ( ) ;
2018-07-29 23:54:12 +02:00
get_tree ( ) - > disconnect ( " idle_frame " , tileset_editor , " _on_workspace_process " ) ;
2018-02-17 12:08:44 +01:00
}
}
2018-11-24 05:38:26 +01:00
Dictionary TileSetEditorPlugin : : get_state ( ) const {
Dictionary state ;
state [ " snap_offset " ] = tileset_editor - > snap_offset ;
state [ " snap_step " ] = tileset_editor - > snap_step ;
state [ " snap_separation " ] = tileset_editor - > snap_separation ;
state [ " snap_enabled " ] = tileset_editor - > tools [ TileSetEditor : : TOOL_GRID_SNAP ] - > is_pressed ( ) ;
state [ " keep_inside_tile " ] = tileset_editor - > tools [ TileSetEditor : : SHAPE_KEEP_INSIDE_TILE ] - > is_pressed ( ) ;
return state ;
}
void TileSetEditorPlugin : : set_state ( const Dictionary & p_state ) {
Dictionary state = p_state ;
if ( state . has ( " snap_step " ) ) {
tileset_editor - > _set_snap_step ( state [ " snap_step " ] ) ;
}
if ( state . has ( " snap_offset " ) ) {
tileset_editor - > _set_snap_off ( state [ " snap_offset " ] ) ;
}
if ( state . has ( " snap_separation " ) ) {
tileset_editor - > _set_snap_sep ( state [ " snap_separation " ] ) ;
}
if ( state . has ( " snap_enabled " ) ) {
tileset_editor - > tools [ TileSetEditor : : TOOL_GRID_SNAP ] - > set_pressed ( state [ " snap_enabled " ] ) ;
}
if ( state . has ( " keep_inside_tile " ) ) {
tileset_editor - > tools [ TileSetEditor : : SHAPE_KEEP_INSIDE_TILE ] - > set_pressed ( state [ " keep_inside_tile " ] ) ;
}
}
2018-02-17 12:08:44 +01:00
TileSetEditorPlugin : : TileSetEditorPlugin ( EditorNode * p_node ) {
2018-07-29 23:54:12 +02:00
editor = p_node ;
2018-02-17 12:08:44 +01:00
tileset_editor = memnew ( TileSetEditor ( p_node ) ) ;
2018-07-29 23:54:12 +02:00
tileset_editor - > set_custom_minimum_size ( Size2 ( 0 , 200 ) * EDSCALE ) ;
tileset_editor - > hide ( ) ;
2018-08-21 06:35:48 +02:00
2018-11-24 05:38:26 +01:00
tileset_editor_button = p_node - > add_bottom_panel_item ( TTR ( " TileSet " ) , tileset_editor ) ;
2018-02-17 12:08:44 +01:00
tileset_editor_button - > hide ( ) ;
2014-02-10 02:10:30 +01:00
}